平成20年度 情報科学III (理系コア科目・2年生) 09 06/23 PHP と SQL (MySQL) の連携 その1 担当 岡村耕二 月曜日 2限 http://okaweb.ec.kyushu-u.ac.jp/lectures/jk3/ 本資料の一部は、堀良彰准教授、天野浩文准教授等による 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@bossp ~]$ 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@bossp ~]$ MySQLクライアントの終了 7 MySQLにおける対話型作業の典型的な手順 1. サーバ bossp にログイン 2. MySQLクライアントを起動(MySQLに接続) [te999999@bossp ~] 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. サーバ bossp からログアウト これらの手順を忘 れると,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 例 自分のデータベースにアクセスして,テーブルのレコードをブラウザに表示させるようなPHPプ ログラム。 <?php $server="localhost"; $user="test2008"; $passwd="test2008"; $link=mysql_connect($server,$user,$passwd); mysql_select_db("testdb",$link); $results = mysql_query("select * from mygoods_oka",$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
© Copyright 2024 ExpyDoc