ゼミII実習


ゼミIIで使用しているテキストがあります

動的Webページ作成(その9)PHPとMySQLの連携(その1)


テキストの訂正があります。

前回までにMySQLを使ったデータベースの操作について練習を行い、簡単ですがテーブルの作り方まで説明しました。今回からはPHPとMySQLの連携について考えてみたいと思います。

ところでMySQLのデータベースの操作においてSQLが用いられていますが、テキストではほんの一部しか説明していません。もし、SQLに興味を持ったならば次の参考書を読んでさらに勉強を進めることを勧めます。

・MYSQLクイックリファレンス、Russel J. T. Dyer、渡邉了介、ドキュメントシステム訳、オライリージャパン、2005、3200円
リファレンスです。3章のMySQLの基礎で一通りの操作方法についての解説があります。

・初めてのSQL、Alan Beaulieu、クイープ訳、オライリージャパン、2006、2400円
SQLについての解説書です。MySQLで動作するサンプルコード並びに出力例が豊富に掲載されています。

このほかにMySQLのサイトにはマニュアルがあり、その中のチュートリアルも参考になります。特にMySQLクライアントで使用するsource文など上記の参考書で補足していない事項を調べる時に役にたちます。

1.PHPとMySQLを連携して利用する

前回、MySQLをデータベースとしてMySQLクライアントからデータベースの操作を行いました。今回はPHPからデータベースの操作を行う方法について考えていきます。

その前にセキュリティポリシーについて考えておきましょう。これは現在使用しているシステムに対しどのようなセキュリティの考えをもっているかということを示すものです。

これは程度の問題であり、厳重なセキュリティを用意してもいいし、セキュリティについてまったく考えなくてもかまいません。セキュリティについてどのような考えを持っているのかを示すだけです。

今回のMySQLとPHPの連携のシステムではまず次のようなセキュリティポリシーを取りたいと思います。

・MySQLのデータベースの作成、テーブルの作成はローカルホスト上で行う。
・MySQLにユーザを登録し、そのユーザがPHP経由で特定のデータベースにアクセスできるようにする。

今回はデータベースをSELECT文を使ってユーザがアクセスするだけです。ユーザがデータの変更や追加を行う場合には上記のセキュリティポリシーも変更していく必要があります。

以上のセキュリティポリシーの件は実習室のシステムにより勝手にユーザを作れないようになっています。そこで関係なくなりましたが参考のために削除しないでおきます。

それでは作業を進めていきましょう。

実習室のコンピュータは再起動後データベースが消えてしまいますので、前回ファイルを利用したデータベースの登録方法を使ってデータベースを作ってみましょう。

まずメモ帳などのテキストエディタを起動し、次のデータをコピーして貼り付けます。ファイル名はwcup2006.datとしてHドライブに保存しておきましょう。

グループ,国名,国旗のファイル名
A,ドイツ,ger_tn.png
A,コスタリカ,crc_tn.png
A,ポーランド,pol_tn.png
A,エクアドル,ecu_tn.png
B,イングランド,eng_tn.png
B,パラグアイ,par_tn.png
B,トリニダードトバゴ,tri_tn.png
B,スウェーデン,swe_tn.png
C,アルゼンチン,arg_tn.png
C,コートジボワール,civ_tn.png
C,セルビア・モンテネグロ,scg_tn.png
C,オランダ,ned_tn.png
D,メキシコ,mex_tn.png
D,イラン,irn_tn.png
D,アンゴラ,ang_tn.png
D,ポルトガル,por_tn.png
E,イタリア,ita_tn.png
E,ガーナ,gha_tn.png
E,アメリカ,usa_tn.png
E,チェコ,cze_tn.png
F,ブラジル,bra_tn.png
F,クロアチア,cro_tn.png
F,オーストラリア,aus_tn.png
F,日本,jpn_tn.png
G,フランス,fra_tn.png
G,スイス,sui_tn.png
G,韓国,kor_tn.png
G,トーゴ,tog_tn.png
H,スペイン,esp_tn.png
H,ウクライナ,ukr_tn.png
H,チュニジア,tun_tn.png
H,サウジアラビア,ksa_tn.png

もう一つメモ帳などのテキストエディタを起動し、次のプログラムをコピーして貼り付けます。ファイル名はwcup2006_import2.sqlとしてHドライブに保存しておきましょう。

CREATE DATABASE wcup2006;
USE wcup2006;
CREATE TABLE entry (
  wgroup CHAR(1),
  country VARCHAR(50),
  flag CHAR(10)
);
LOAD DATA INFILE 'h:\\wcup2006.dat' REPLACE INTO TABLE entry
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
IGNORE 1 LINES
(wgroup, country, flag);
SELECT * FROM entry;

スタート>すべてのプログラム>教材ツール>MySQLの順にクリックしてください。MySQLの画面がコマンドプロンプトを使用して現れます。

メッセージが表示された後で次のようなプロンプトが表示されています。

mysql>

このプログラムを試すために、次のSQL文を使用します。

source  h:\wcup2006_import2.sql

うまくいくと次のような表示が返されます。

Query OK, 1 row affected (0.00 sec)
Database changed
Query OK, 0 rows affected (0.14 sec)
Query OK, 32 rows affected (0.04 sec)
Records: 32  Deleted: 0  Skipped: 0  Warnings: 0
+--------+------------------------+------------+
| wgroup | country                | flag       |
+--------+------------------------+------------+
| A      | ドイツ                 | ger_tn.png |
| A      | コスタリカ             | crc_tn.png |
| A      | ポーランド             | pol_tn.png |
| A      | エクアドル             | ecu_tn.png |
| B      | イングランド           | eng_tn.png |
| B      | パラグアイ             | par_tn.png |
| B      | トリニダードトバゴ     | tri_tn.png |
| B      | スウェーデン           | swe_tn.png |
| C      | アルゼンチン           | arg_tn.png |
| C      | コートジボワール       | civ_tn.png |
| C      | セルビア・モンテネグロ | scg_tn.png |
| C      | オランダ               | ned_tn.png |
| D      | メキシコ               | mex_tn.png |
| D      | イラン                 | irn_tn.png |
| D      | アンゴラ               | ang_tn.png |
| D      | ポルトガル             | por_tn.png |
| E      | イタリア               | ita_tn.png |
| E      | ガーナ                 | gha_tn.png |
| E      | アメリカ               | usa_tn.png |
| E      | チェコ                 | cze_tn.png |
| F      | ブラジル               | bra_tn.png |
| F      | クロアチア             | cro_tn.png |
| F      | オーストラリア         | aus_tn.png |
| F      | 日本                   | jpn_tn.png |
| G      | フランス               | fra_tn.png |
| G      | スイス                 | sui_tn.png |
| G      | 韓国                   | kor_tn.png |
| G      | トーゴ                 | tog_tn.png |
| H      | スペイン               | esp_tn.png |
| H      | ウクライナ             | ukr_tn.png |
| H      | チュニジア             | tun_tn.png |
| H      | サウジアラビア         | ksa_tn.png |
+--------+------------------------+------------+
32 rows in set (0.01 sec)

データベースwcup2006にテーブルentryが無事、追加されたようなのでPHPを使ってこのテーブルにアクセスしてみたいと思います。

GRANT文は使用できないのでとばしてください。

その前にセキュリティポリシーに従いアクセスするためのユーザを用意します。

MySQLクライアントの画面で次の文を入力し、エンターキーを1回たたきます。

GRANT SELECT ON wcup2006.* TO ba150999@localhost IDENTIFIED BY 'pekepeke';

実習室のシステムにより勝手にユーザを作れないようになっています。このコマンドは使えなくなりましたが、自分で環境を準備して勉強する場合には役に立つと思いますので削除しないでおきます。

GRANT文は新規にユーザを作成し権限を与えます。
SELECTとしてSELECT文の使用の権限のみを与えています。
ONの次にデータベース名を指定しています。ここの設定ではデータベース名.テーブル名として設定します。この例ではデータベースwcup2006のすべてのテーブルにアクセスできます。
TOの次でユーザ名ba150999を与えています。@の次にホスト名を指定しています。
IDENTIFIED BYの次の’’で囲まれた文字列がパスワードになります。

うまくいった場合次のように表示されます。

Query OK, 0 rows affected (0.28 sec)

いよいよPHP経由でMySQLのデータベースwcup2006のテーブルentryにアクセスしてみましょう。

まず、Apache Webサーバを起動してください。

スタート>すべてのプログラム>ネットワークツール>Apacheの順にクリックします。

タスクバー右下にApacheのアイコンが出ます。クリックして出てきたメニューでstartをクリックしてApacheサーバを起動します。

メモ帳などのテキストエディタを起動し、次のプログラムをコピーして貼り付けます。ファイル名はwcup2006_access1.phpとしてHドライブに保存しておきましょう。

<?php
  header("Content-Type: text/html; charset=SJIS");
  
  //コメントしてある部分はGRANT文でユーザを設定した場合です。
  //$db = mysql_connect("localhost", "ba150999", "pekepeke") 
  //      or die("接続できませんでした\n");
  $db = mysql_connect("localhost", "root", "") 
        or die("接続できませんでした\n");
 
  //MySQLの設定によりコメントした部分の設定が必要な場合があります。
  //実習室では以下のコメントしてあるプログラムは必要ありません。
  //mysql_query("SET NAMES sjis")
  //      or die("SET NAMES sjis の設定ができません");  
 
  mysql_select_db("wcup2006", $db)
        or die("該当するデータベースがないようです\n");
 
  $query = "SELECT * FROM entry";
  
  $result = mysql_query($query, $db);
  
  print mysql_result($result, 0, 1);
  
  mysql_close($db);
?>

実習室のシステムにより勝手にユーザを作れないようになっています。そこでやむを得ずユーザとしてroot、パスワードなしで行っています。実際にはセキュリティ上このような操作をしてはいけません。

C:\Program Files\Apache Group\Apache2\htdocsのフォルダにHドライブに今保存したwcup2006_access1.phpをコピーします。

インターネットエクスプローラを使って、次のURLで確認します。

http://localhost/wcup2006_access1.php

ドイツと表示されればOKです。

wcup2006_access1.phpのプログラムの解説をしておきましょう。

  header("Content-Type: text/html; charset=SJIS");

この文ではページとして出力するための情報を与えています。必要なのでプログラムの先頭に書いておきます。

  $db = mysql_connect("localhost", "root", "") 
        or die("接続できませんでした\n");

mysql_connectを使ってmysqlサーバに接続を試みています。引数は最初から、ホスト名、ユーザ名、パスワードの順です。or dieというのは処理に失敗した時のメッセージを出力しています。$dbは接続識別子と呼ばれ、MySQLとの接続をこの変数を通して行います。

  mysql_query("SET NAMES sjis")
        or die("SET NAMES sjis の設定ができません");  

mysql_queryを使ってMySQLサーバに命令を送っています。これはNAMESという環境変数にsjis(シフトJIS)を設定することで、Webページに日本語を正しく表示できるようにしています。実習室の環境ではこの部分は必要ないのでコメントにしています。

  mysql_select_db("wcup2006", $db)
        or die("該当するデータベースがないようです\n");

mysql_select_dbでは、$dbを使い、この接続において使用するデータベースを指定しています。

  $query = "SELECT * FROM entry";

$queryにSQL文を文字列として格納しています。

  $result = mysql_query($query, $db);

mysql_queryを使ってMySQLサーバに$queryに入っている命令を送り、返ってきた出力結果を$resultに格納しています。

  print mysql_result($result, 0, 1);

そのままでは$resultからデータを取り出せないので、mysql_resultを使ってデータを取り出しています。他にもいろいろな取り出し方があります。ここでは、$resultから一つ目のレコード(0で表しています)から二つ目のフィールド(1で表しています)のデータを取り出しWebページに出力しています。

  mysql_close($db);

最後に$dbによる接続をmysql_closeにより終了しています。

練習1.今までに練習したことを使ってMySQLのデータベースwcup2006のテーブルentryからA組1行目の情報を表としてページ上に表現してください。

練習2.練習1と同様にしてA組の表をページ上に表現してください。

練習3.練習1と同様にしてすべての組を一つの表としてページ上に表現してください。

練習4.練習1と同様にして組別の表をページ上に表現してください。