情報科学III

平成23年度前期 情報科学III (理系コア科目)
PHP と SQL (MySQL) の連携
その1
担当松永裕介
月曜日 2限
http://www.c.csce.kyushu-u.ac.jp/~matsunaga/lecture/php
本資料の一部は、堀良彰准教授、天野浩文准教授等による
1
以前の講義資料をもとにしています。
前回のおさらい(1)
 SQLの機能の便宜的な分類
– 問い合わせ機能
• SELECT ~ FROM ~ WHERE
– データ操作機能
• INSERT 文
• UPDATE 文
• DELETE 文
前回の内容:
文法の座学+MySQL での実習
– データ定義機能
• CREATE 文
• DROP 文
• ALTER 文
MySQLクライアントから利用する
– その他
ときは,文の末尾にセミコロン(;)
• ユーザ管理
を付ける必要がある.
• セッション管理
2
前回のおさらい(2)
 INSERT 文
– テーブルにレコードを挿入(追加)する.
INSERT [INTO] テーブル名
SET カラム=値[,カラム=値, ... ]
INSERT [INTO] テーブル名
VALUES(値[, 値, ... ])[, (値[, 値, ... ]), ...]
 UPDATE 文
– テーブル内のレコードの値を変更する.
UPDATE テーブル名
SET カラム=値[,カラム=値, ... ]
[WHERE 条件式 ]
3
前回のおさらい(3)
 DELETE 文
– テーブル内のレコードを削除する.
DELETE [FROM] テーブル名
[WHERE 条件式 ]
 CREATE 文
– データベースまたはテーブルを新規作成する
CREATE DATABASE データベース名
CREATE TABLE テーブル名
( カラム名 データ型 [NULL|NOT NULL] [カラムオプション],
...
)
4
前回のおさらい(4)
 DROP 文
– データベースまたはテーブルを削除する
DROP TABLE テーブル名
DROP DATABASE データベース名
5
前回のおさらい(5)
 ALTER 文
– テーブルの設定を変更する
ALTER TABLE テーブル名
ADD [COLUMN] カラム定義 [FIRST|AFTER 既存カラム]
[ADD ...]
ALTER TABLE テーブル名
CHANGE [COLUMN] カラム名 カラム定義 [FIRST|AFTER 既存カラム]
[CHANGE ...]
ALTER TABLE テーブル名
DROP [COLUMN] カラム名
[DROP ...]
6
前回のおさらい(6)
MySQLクライアントの起動
[te999999@rupus ~]$ mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 150 to server version: 4.1.20
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
mysql> ...
mysql> ...
mysql> quit;
Bye
[te999999@rupus ~]$
MySQLクライアントの終了
7
MySQLにおける対話型作業の典型的な手順
1.
サーバ rupus にログイン
2.
MySQLクライアントを起動(MySQLに接続)
[te999999@rupus ~] mysql -p
3.
(新規データベースの場合のみ)データベース作成
mysql-> CREATE DATABASE dbname;
4.
使用するデータベースの宣言
mysql-> use dbname;
5.
(新規テーブルの場合のみ)データ定義
mysql-> CREATE TABLE tablename
6.
データ操作
mysql-> SELECT/INSERT/UPDATE/DELETE etc.
7.
MySQL クライアントを終了(MySQLから切断)
mysql-> quit;
8.
サーバ rupus からログアウト
これらの手順を忘
れると,CREATE
TABLE 以下を正し
く入力しても無視さ
れてしまう.
8
データベースの対話的利用の問題点
 それを利用する方法が SQL しかないとしたら…
– SQLの文法を理解しており,
– 自分のやりたい作業を SQL で記述することができ,
– しかも,毎回毎回,それを間違いなく入力しなければならな
い.
 一方,現実にはDBの構造を変更することはそれほど多くはな
い.
 普通の利用者は,SQLの文法よりも,もっと以下のようなことに
注意を集中したい.
こういったことは,
– データベースに新規登録する内容
HTML のフォーム機
– データベースから検索する際の条件
能と,サーバサイドプ
– 表示される検索結果
ログラミングを使えば,
実現できるはず.
9
今日やること
 PHP から MySQL を使う方法
 PHP 4.x から MySQL を使う場合の標準的な作業手順
 MySQL拡張サポート(PHP の MySQL関数)
10
PHP 4.x から MySQL 4.x を使う方法
11
PHP(HTML)とMySQL (1)
 基本的な考え方
– <form> タグで集めたデータを元に,PHPプログラムで
MySQL にアクセス
クリック
すると…
<form ...>
• action 属性
で prog1.php
を指定している.
• 利用者からの
入力データを
集める.
prog1.php
このプログラムが
DBへのアクセスを
担当する.
MySQL
12
PHP(HTML)とMySQL (2)
 受け側の PHP プログラムも,(クリックした後に表示される) web
ページになっている.
①クリック
すると…
<form ...>
action 属性で
prog1.php を
指定している.
prog1.php
さらに<form>タグが
あれば,クリック先で
さらにDBアクセスを
繰り返してもよい.
③結果を
web画面に
表示できる
②DBへ
アクセス
MySQL
13
PHPからMySQLを使う方法
 PHP/MySQLのバージョンに応じて,いくつかの方法がある.
– MySQL拡張サポート(いわゆるMySQL関数)を用いる
• PHP 4.x / 5.x → MySQL 3.x / 4.x
– ただし,MySQL 4.1 以降で導入された新機能は使えない.
それらを使いたいときには下の mysqli を使う.
– MySQL 改良版拡張サポート(mysqli)を用いる
• PHP 5.x → MySQL 4.x
– PDO_MySQLを用いる(PDOは PHP Data Object の略)
• PHP 5.x → MySQL 4.x
 bossp では
– PHP:4.3.9
なので,MySQL関数を用いることになる.
– MySQL:4.1.20
14
PHP 4.x から MySQL 4.x を利用する際の作業手順
 標準的な作業手順
① MySQLサーバへの接続
• PHP の mysql_connect() 関数
② 通信に使用する文字コードの設定
• PHP の mysql_query() 関数
+ MySQL の SET CHARACTER SET 文
③ データベースの選択
• PHP の mysql_select_db() 関数
④ データベースの操作
• PHP の mysql_query() 関数
+ MySQL の SELECT/INSERT/UPPDATE/DELETE 文
• この④は繰り返してもよい.DBを切り替えるときは,③に戻る.
⑤ MySQLサーバからの切断
• PHP の mysql_close() 関数
15
主な MySQL関数
 MySQL との通信
– mysql_connect()
– mysql_query()
– mysql_select_db()
– mysql_close()
 MySQL から受け取った検索結果の操作
– mysql_fetch_array()
– mysql_data_seek()
– mysql_num_rows()
16
mysql_connect() 関数(1)
 MySQL クライアントを起動する操作に類似
– 実際に MySQL クライアントを起動するわけではないのだが
…
– サーバ名とユーザ名とパスワードが必須
MySQL接続を表す変数 = mysql_connect(サーバ, ユーザ名, パスワード );
17
mysql_query() 関数
 MySQLコマンドまたは SQL 文を実行する.
mysql_query(結果を受け取らなくてよいコマンドまたは文, MySQL接続変数 );
結果の変数 = mysql_query(コマンドまたは文, MySQL接続変数 );
18
mysql_connect() 関数(2)
 他のすべての MySQL 関数呼び出しよりも前に実行する.
実行例
このようにすれば,前のwebページの<form>
タグで入力されたデータを受け取れる.
$server = $_POST["server"];
$mysqluser = $_POST["mysqluser"];
$mysqlpasswd = $_POST["msqlpasswd"];
$link = mysql_connect($server, $mysqluser, $mysqlpasswd);
MySQLサーバ名
web (PHP)サーバと同じなら
"localhost" でよい.
(それの入った変数でもよい)
MySQLパスワード
MySQLユーザ名
MySQLクライアント起動時と (それの入った変数でも
よい)
違い省略不可
(それの入った変数でもよい)
MySQL接続を表す変数:これはこの後のMySQL関数呼び出しでよく使う
19
mysql_query()を使ってできること(1)
 MySQL の SET CHARACTER SET 文で,通信に使用する文
字コードを設定する.
– MySQL クライアントを利用する場合には必要のなかった操
作
– しかし,PHP からアクセスする際には,これをやっておかな
いと,日本語文字列データに文字化けが発生する.
実行例
mysql_query("SET CHARACTER SET utf8", $link);
MySQLコマンドの文字列
定数でも,文字列変数でもよい.
前に mysql_connect() 関数
の戻り値を受け取った変数
20
mysql_query()を使ってできること(2)
 (mysql_select_db() 関数を実行した後で)
SELECT 文/その他のデータ操作文を実行する.
– SELECT 文による検索結果は,PHP の配列で受け取ること
ができる.
• 結果が複数のレコードになるときにも,この配列にすべて
入っている.
• ただし,そこから1レコードだけ取り出すには,この後で
mysql_fetch_array() 関数を用いる.
実行例
$results =mysql_query($query, $link);
SELECTの結果を受け
取る配列変数
SQL文の文字列
定数でも,文字列変数
でもよい.
前に mysql_connect() 関
数の戻り値を受け取った変数
21
mysql_select_db() 関数
 MySQL クライアント起動後に,USE 文でデータベースを選ぶ
操作に類似
mysql_select_db(データベース名, MySQL接続変数 );
実行例
mysql_select_db("te999999_greeting_cards", $link);
データベース名の文字列
定数でも,文字列変数でもよい.
前に mysql_connect() 関数
の戻り値を受け取った変数
22
mysql_close()関数
 MySQL クライアントを終了する操作に類似
mysql_close(MySQL接続変数 );
実行例
mysql_close($link);
前に mysql_connect() 関数の戻り値を受け取った変数
23
mysql_fetch_array()関数
 mysql_query()関数による SELECT 文の結果を格納した配
列または連想配列から,1行分のデータを取り出す.
1レコード分の(連想)配列 = mysql_fetch_array(結果全体の配列, 結果の型 );
実行例1
$row = mysql_fetch_array($results, MYSQL_ASSOC);
連想配列
個々の項目は,次の行以降で,
row["name"] のように参照する.
前にSELECTの結果を受
け取った配列変数
連想配列で受け取ると
きは,これを指定
実行例2
$row = mysql_fetch_array($results, MYSQL_NUM);
配列変数:個々の項目は,次の行以降
で,row[0] のように参照する.
配列で受け取ると
きは,これを指定
前にSELECTの結果を受
け取った配列変数
24
mysql_query()と mysql_fetch_array()の関係
$results =mysql_query($query, $link);
$row = mysql_fetch_array($results, MYSQL_ASSOC);
mysql_fetch_array()
mysql_query()
$row
$results
MySQL DB
(ここでは連想配列)
現在の
読み出し
位置
mysql_fetch_array() 関数は,
$results の中に行が残っている限り,
何度でも呼び出せる.
呼び出されるたびに,「現在の読み出し位
置」が1レコード分だけ下に移動する.
row["name"]
row["address"]
row["phone"]
25
連想配列でないときは…
$results =mysql_query($query, $link);
$row = mysql_fetch_array($results, MYSQL_NUM);
mysql_fetch_array()
mysql_query()
$row
$results
MySQL DB
現在の
読み出し
位置
mysql_fetch_array() 関数は,
$results の中に行が残っている限り,
何度でも呼び出せる.
呼び出されるたびに,「現在の読み出し位
置」が1レコード分だけ下に移動する.
(ここでは添字式配列)
row[0]
row[2]
row[1]
26
mysql_data_seek() 関数
 「現在の読み出し位置」を指定した場所に移動させる.
– SELECT 文の結果を受け取った配列をもう一度利用したい
ような場合に便利
mysql_data_seek(結果全体の配列, 移動先行番号 );
$results
実行例
mysql_data_seek($results, 0);
前にSELECTの結果を受
け取った配列変数
先頭に戻したいときは,
ゼロを指定
27
mysql_num_rows()関数
 SELECT 文の結果を受け取った配列の,行数(レコード数)を
調べる
整数型変数 = mysql_num_rows(結果全体の配列 );
$results
実行例
$count = mysql_num_rows($results);
行数
前にSELECTの結果を受
け取った配列変数
28
例: http://bossp.is.kyushu-u.ac.jp/~oka/20090622/00/main.php
 自分のデータベースにアクセスして,テーブルのレコードをブラウザに表示させるようなPHPプ
ログラム。
<?php
ID/PASSWDを指定
$server="localhost"; $user=“jk2009"; $passwd=“jk2009";
$link=mysql_connect($server,$user,$passwd); mysql_select_db("jk2009",$link);
$results = mysql_query("select * from table090622",$link);
printf("MYSQL_ASSOC <BR>");
$row = mysql_fetch_array($results,MYSQL_ASSOC);
print_r($row);
printf("<BR>");printf("<BR>");
printf("MYSQL_NUM <BR>");
$row = mysql_fetch_array($results,MYSQL_NUM);
print_r($row);
データベース名を指定
テーブル名を指定
mysql_close($link);
?>
29
練習問題
 自分のデータベースにアクセスして, テーブルのすべてのレ
コードをブラウザに表示させるようなPHPプログラムを作る.
 自分のデータベースにアクセスして, Web で入力した Key の
値にマッチするテーブルのレコードをブラウザに表示させるよう
なPHPプログラムを作る.
30
演習問題
 Web 上で入力した値をデータベースに入力できるようにし,練
習問題で作成したテーブルのレコードをすべてブラウザに表示
させるプログラムと連動させて、入力後のデータベースの内容
を確認したり、検索できるようにせよ。
 データの入ったファイルをアップロードして、そのデータをデー
タベースに入力できるようにし,練習問題で作成したテーブル
のレコードをすべてブラウザに表示させるプログラムと連動させ
て、入力後のデータベースの内容を確認したり、検索できるよう
にせよ。
31
PHPとMySQLについて
知っておくと役立つこと
「豆知識?」を改題
32
PHPからの「脱出」(第3回のスライド No. 20再掲)
 開始タグ <?php と終了タグ ?> をうまく組み合わせて使うと:
– 1つのHTML文書の中で,「PHPから出たり入ったり」できる.
– PHPブロックを複数箇所に埋め込むことができる.
<html>
...
<body>
<?php print("Hello, World!\n"); ?>
<p>ここは HTML の1行目.</p>
<?php print("Hello, World, Again!\n "); ?>
<p>ここは HTML の2行目.</p>
</body>
</html>
33
PHPが得意な部分とHTMLが得意な部分
 PHPが得意な部分の例
– 何かの処理をするところ
• 条件判断をする
• 繰り返し処理をする
• MySQLにアクセスする
 HTMLが得意な部分の例(PHPでも書けるが,面倒)
– ヘッダ部分
– 画面表示を整えるところ
• 見出しを表示する
• 改行する(<br>タグ,<p>タグ)が多いところ
• 表を作成する
• 箇条書きを作成する
34
例えばこんなことも…
HTML
PHP
メッセージ表示のためのHTML記述
PHP
mysql_connect()
mysql_query()
mysql_select_db()
mysql_query()
mysql_num_rows()
見出し表示のためのHTML記述
PHP
mysql_fetch_array()
と print()による表示
の繰り返し
メッセージ表示のためのHTML記述
PHP
mysql_close()
35
レコードの数だけ繰り返すには
 while 文の,繰り返しを継続する条件のところで,
mysql_fetch_array() 関数を使う
実行例
while ($row = mysql_fetch_array($results, MYSQL_ASSOC)) {
print("氏名 : " . $row["name"] ."<br>\n");
print("〒
: " . $row["postal_code"] ."<br>\n");
print("住所1: " . $row["address1"] . "<br>\n");
print("住所2: " . $row["address2"] . "<br>\n");
print("電話 : " . $row["phone"] ."<br>\n<p>");
}
上の例では,文字列連結演算子(.)を用いて,print文の中(PHPの中)で行の
整形(画面出力の整形)を行っている.
36