Windows+Apache+PHP+MySQL(5.0)によるWebアプリケーション

第4章 MySQLによるWebアプリケーションの基礎


 MySQLによるWebアプリケーションを構築する前提として、以下OSとしてWindows XP,WWWシステムとしてApache2,サーバサイドのスクリプト言語としてPHP5を使用します。
 Windows XP へのApache2とPHP5のインストールおよび環境設定については、以下のWebページを参照してください。

http://www.yc.musashi-tech.ac.jp/%7Eyamada/doc/win_php/index.html

4.1 Webアプリケーション用ユーザの作成

■ユーザ「webapl」の作成

 WebアプリケーションプログラムからMySQLにアクセスできる権限を有するユーザを作成します。ここでは「webapl」とします。

(1)コマンドプロンプトからユーザ「root」でmysqlを起動します。

C:\Documents and Settings\yamada>mysql -u root -p
Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2 to server version: 5.0.24-community-nt

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

(2) ユーザの作成はGRANT文で行います。

GRANT 権限タイプ
  ON  データベース名.テーブル名
  TO  ユーザ名 [IDENTIFIED BY 'パスワード']

 localhostサーバに登録されているwebaplユーザ(webapl@localhost)に、すべてのデータベースのすべてのテーブルに対して(*.*)、すべての権限を与えるGRANT文は以下のようになります。パスワードは'passs1234'としています。

mysql> GRANT ALL PRIVILEGES ON *.*
-> TO webapl@localhost IDENTIFIED BY 'pass1234';
Query OK, 0 rows affected (0.20 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.09 sec)

mysql>


 なお、GRANT文を実行した後には、必ず「FLUSH PRIVILEGES」文を実行します。

(3)webaplユーザが有効か確認します。一度、mysqlを終了し、ユーザwebaplでmysqlを起動します。パスワードが設定されているので、「−p」オプションを付加します。mysqlが起動するとパスワードを聞いてきますので、パスワードを入力します。

C:\Documents and Settings\yamada>mysql -u webapl -p
Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5 to server version: 5.0.24-community-nt

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db_hanbai_kanri |
| db_hanbai_kanri2 |
| mysql |
| test |
+--------------------+
5 rows in set (0.19 sec)

mysql> USE db_hanbai_kanri;
Database changed

mysql> SET NAMES sjis;
Query OK, 0 rows affected (0.06 sec)

mysql> SELECT * FROM tbl_shouhin_hyou;
+--------------+-------------+-------+
| shouhin_code | shouhin_mei | tanka |
+--------------+-------------+-------+
| 1001     | 地方御前  | 1000 |
| 1002     | 山の幸御膳 | 1200 |
| 1003     | 海の幸御膳 | 1400 |
+--------------+-------------+-------+
3 rows in set (0.02 sec)

mysql>

 ユーザwebaplで「db_販売管理」データベースにアクセスできることが確認できました。

 なお、文字化けしないように、mysqlを起動したら早い段階に「SET NAMES sjis;」を実行します。

 

4.2 PHPによるMySQL操作の基礎

■PHPファイルの漢字コード

 以上 の環境では、PHPファイルに漢字を使う場合は 「EUCコード」 である必要があります。一般にWindows環境では、エディターは漢字コードとしてSHIFT-JIS(SJIS)コードを使用しています。

(1) したがって、たとえばエディターソフトの「秀丸」を使う場合は、作成したPHPファイル等を保存する場合は、以下のように「EUCコード」に設定して保存する必要があります。「名前をつけて保存」ダイアログボックスの下の「文字コード」で「EUC(改行コード=LF)」を選択し、「保存」ボタンをクリックします。

(2)逆に、「EUCコード」で記述されたPHPファイル等をエディターで読み取る場合も、漢字コード指定を「EUCコード」に設定します。「ファイルを開く」ダイアログボックスの下の「文字コード」で「EUC」を選択し、「開く」ボタンをクリックします。

■データベースサーバへの接続

 PHPでMySQLで作成したデータベースにアクセスするには、まずデータベースサーバ(ホスト)に接続する必要があります。データベースサーバに接続するには、mysql_connect()関数を使います。

接続ID = mysql_connect(ホスト名,ユーザ名,パスワード)

 ここでは、ホスト名は「localhost」、ユーザ名は「webapl」、パスワードは「pass123」とします。PHPのソースコードの例を以下に示します。

$db_host = "localhost";
$db_user = "webapl";
$db_passwd = "pass1234";

$db = mysql_connect($db_host,$db_user,$db_passwd);

 戻り値$dbには、データベースへの接続IDが代入されます。この後は、この接続IDを参照してデータベースにアクセスします。

■データベースの選択

 次に、接続したデータベースサーバの中から利用するデータベースを選択します。データベースを選択するには、mysql_select_db()関数を使います。

mysql_select_db(データベース名、接続ID)

 ここでは、データベースとして「db_hanbai_kanri」を選択することとします。

$db_name = "db_hanabai_kanri";
mysql_select_db($db_name,$db);

 選択に成功すれば、戻り値はTRUE、失敗すればFALSEとなります。ここでは、戻り値を使わないステートメントとしています。


■SQL文の実行

 選択したデータベースに対してSQL文を実行するには、mysql_query()関数を実行します。

結果ID = mysql_query(SQL文,接続ID);

 ここでは、tbl_商品表テーブルからすべてのフィールドとすべてのレコードを表示するSQL文を実行します。

$str_sql = "select * from tbl_shouhin_hyou";
$rs = mysql_query($str_sql,$db);

 戻り値には、SQL文の処理結果が格納されます。これを「結果ID」あるいは「結果セット」と呼びます。

■レコードの読み取り

 結果セットには現在のレコードを示すポインタがあります。最初は結果セットの第1レコードを示しています。現在のレコードのデータをフィールド名をキー値とする連想配列で読み出すには、mysql_fetch_assoc()関数を使います。while文と組み合わせることにより、結果セット内のレコードを順次読み出すことができます。

while(mysql_fetch_assoc(結果ID))
{
 各レコードごとの処理
}

 各レコードごとに、フィールド名とその値を表示するソースコードの例を以下に示します。


while($arr_item = mysql_fetch_assoc($rs))
{

  foreach($arr_item as $key => $value)
  {
    print "[{$key}] = {$value}<br>\n";
  }
  print "<br>\n";

}

■データベースサーバへの接続の切断

 データベースに対する処理がすべて終わったら、データベースサーバへの接続を切断します。

mysql_close(接続ID)

mysql_close($db);

■テーブルの表示例

 データベースサーバに接続し、一つのテーブル全体を参照し、ブラウザに表示するもっとも簡単なPHPスクリプト「connect.php」を以下に示します。内容は、上記の一連の処理を一つの流れとして、まとめて記述したものです。

「connect.php」

<html>
<head>
<title>connect.php</title>
</head>
<body>
<?php
 //データベースサーバ名の設定
 $db_host  = "localhost";

 //ユーザ名の設定
 $db_user  = "webapl";

 //パスワードの設定
 $db_passwd = "pass1234";

 //データベースサーバへの接続
 $db = mysql_connect($db_host,$db_user,$db_passwd);

 //データベース名の設定
 $db_name = "db_hanbai_kanri";

 //データベースの選択
 mysql_select_db($db_name,$db);

 //SQL文の設定
 $str_sql = "select * from tbl_shouhin_hyou";

 //SQL文の実行
 $rs = mysql_query($str_sql,$db);

 //結果セット内の各レコードを順次参照し、連想配列に代入
 while($arr_item = mysql_fetch_assoc($rs))
 {


  //レコード内の各フィールド名と値を順次参照
  foreach($arr_item as $key => $value)
  {

   //フィールド名と値を表示
   print "[{$key}] = {$value}<br>\n";
  }
  print "<br>\n";
 }

 //データベースサーバへの接続の切断
 mysql_close($db);

?>
</body>
</html>

 この「connect.php」ファイルをユーザ「test」のホームディレクトリである「c:\Apache2\users\test\public_html」のフォルダに保存します。

ブラウザを開き、URLに「http://localhost:8080/~test/connect.php」と記入しアクセスします。以下のようにデータベース「db_販売管理」の中のテーブル「tbl_商品表」のすべてのレコードのすべてのフィールド名と値が表示されます。

4.3 データベースやテーブルのメタデータの表示

■データベースの一覧表示

 接続したデータベースサーバ内にある利用可能なデータベースの一覧表示を行うには、まずmysql_list_dbs()関数を呼びます。

結果ID = mysql_list_dbs(接続ID)

 結果IDに対応する結果セットには、1レコードごとにデータベースに関する情報が格納されています。そのレコードからmysql_db_name()関数でデータベース名を取得します。

データベース名 = mysql_db_name(結果ID,レコード番号)

 なお、レコード番号は0から始まります。

 サンプルファイル「show_databases.php」を以下に示します。データベースの一覧表示のためのユーザ定義関数show_databases()を定義し、利用しています。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>show_databases.php</title>
</head>
<body>
<?php

 // データベースサーバへの接続
 $db = mysql_connect('localhost','webapl','pass1234');

 // データベースの一覧表示の関数呼び出し(ユーザ定義関数)
 show_databases($db);

 // データベースサーバの切断
 mysql_close($db);

// ----------------------------------------------
// データベースの一覧表示の関数の定義
function show_databases($db)
{
 // データベースリストの取得
 $rs = mysql_list_dbs($db);

 // 結果セット内のレコード数の取得
 $num_rows = mysql_num_rows($rs);

 print "<table border=1 cellpadding=0 cellspacing=0>\n";
 print "<tr>\n";
 print "<td align=center>Database</td>\n";
 print "</tr>\n";

 // 結果セット内のレコードを順次参照
 for($i = 0; $i < $num_rows; $i++)
 {

  // データベース名の取得
  $db_name = mysql_db_name($rs,$i);

  // データベース名の表示
  print "<tr>\n";
  print "<td>{$db_name}</td>\n";
  print "</tr>\n";
 }

 print "</table>\n";

 // 結果セットの解放
 mysql_free_result($rs);
}
?>
</body>
</html>

 結果はたとえば、以下のように表示されます。

■テーブルの一覧表示

 データベース内のテーブルの一覧表示を行うには、mysql_list_tables()関数を使います。

結果ID = mysql_list_tables(データベース名,接続ID)

 結果IDに対応する結果セットには、1レコードごとにテーブルに関する情報が格納されています。そのレコードからmysql_table_name()関数でテーブル名を取得します。なお、レコード番号は0から始まります。

テーブル名 = mysql_table_name(結果ID,レコード番号)

 サンプルファイル「show_tables.php」を以下に示します。テーブルの一覧表示のためのユーザ定義関数show_tables()を定義し、利用しています。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>show_tables.php</title>
</head>
<body>
<?php

 // データベースサーバへの接続
 $db = mysql_connect('localhost','webapl','pass1234');

 // テーブルの一覧表示の関数呼び出し(ユーザ定義関数)
 show_tables('db_hanbai_kanri',$db);

 // データベースサーバの切断
 mysql_close($db);

// ----------------------------------------------
// テーブルの一覧表示の関数の定義
function show_tables($db_name,$db)
{
 // 指定されたデータベース内のテーブルリストの取得
 $rs = mysql_list_tables($db_name,$db);

 // 結果セット内のレコード数の取得
 $num_rows = mysql_num_rows($rs);

 print "<table border=1 cellpadding=0 cellspacing=0>\n";
 print "<tr>\n";
 print "<td align=center>Tables in {$db_name}</td>\n";
 print "</tr>\n";

 // テーブルがある場合
 if($num_rows > 0)
 {
  // 結果セット内のレコードを順次参照
  for($i = 0; $i < $num_rows; $i++)
  {

   // テーブル名の取得
   $table_name = mysql_table_name($rs,$i);

   // テーブル名の表示
   print "<tr>\n";
   print "<td>{$table_name}</td>\n";
   print "</tr>\n";
  }
 }

 // テーブルが無い場合
 else
 {
  print "<tr>\n";
  print "<td>テーブルはありません</td>\n";
  print "</tr>\n";
 }
 print "</table>\n";

 // 結果セットの解放
 mysql_free_result($rs);
}
?>
</body>
</html>

 結果はたとえば、以下のように表示されます。

 

■フィールド属性の一覧表示

 テーブル内のフィールド属性の一覧表示を行うには、mysql_list_fields()関数を使います。

結果ID = mysql_list_fields(データベース名,テーブル名,接続ID)

 結果IDに対応する結果セットには、1レコードごとにフィールドに関する情報が格納されています。そのレコードからmysql_field_name()関数でテーブル名を取得し、mysql_fieldtype()関数でデータ型を取得し、mysql_field_len()関数でフィールドの長さを取得し、mysql_field_flag()関数でフラグを取得します。なお、レコード番号は0から始まります。

フィールド名    = mysql_field_name(結果ID,レコード番号)
データ型      = mysql_field_type(結果ID,レコード番号)
フィールドの長さ  = mysql_field_len(結果ID,レコード番号)
フィールドのフラグ = mysql_field_flags(結果ID,レコード番号)

 サンプルファイル「show_fields.php」を以下に示します。フィールド属性の一覧表示のためのユーザ定義関数show_fields()を定義し、利用しています。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>show_fields.php</title>
</head>
<body>
<?php

 // データベースサーバへの接続
 $db = mysql_connect('localhost','webapl','pass1234');

 // フィールド属性の一覧表示の関数呼び出し(ユーザ定義関数)
 show_fields('db_hanbai_kanri','tbl_shouhin',$db);

 // データベースサーバの切断
 mysql_close($db);  

// ----------------------------------------------
// フィールド属性の一覧表示の関数の定義
function show_fields($db_name,$tbl_name,$db)
{
 // 指定されたデータベース、テーブル内のフィールドリストの取得
 $rs = mysql_list_fields($db_name,$tbl_name,$db);

 // 結果セット内のレコード数の取得
 $num_rows = mysql_num_fields($rs);

 print "テーブル「{$tbl_name}」内のフィールド属性一覧\n";
 print "<table border=1 cellpadding=0 cellspacing=0>\n";
 print "<tr>\n";
 print "<td align=center>フィールド名</td>\n";
 print "<td align=center>データ型(長さ)</td>\n";
 print "<td align=center>フラグ</td>\n";
 print "</tr>\n";

 // フィールドがある場合
 if($num_rows > 0)
 {
  // 結果セット内のレコードを順次参照
  for($i = 0; $i < $num_rows; $i++)
  {

   // フィールド名の取得
   $field_name = mysql_field_name($rs,$i);

   // データ型の取得
   $field_type = mysql_field_type($rs,$i);

   // フィールドの長さの取得
   $field_len = mysql_field_len($rs,$i);

   // フィールドのフラグの取得
   $field_flags = mysql_field_flags($rs,$i);


   // フラグがヌルなら半角スペースとする
   if($field_flags == '')
   {
    $field_flags='&nbsp;';
   }

   // フィールド属性の表示
   print "<tr>\n";
   print "<td>{$field_name}</td>\n";
   print "<td>{$field_type}({$field_len})</td>\n";
   print "<td>{$field_flags}</td>\n";
   print "</tr>\n";
  }
 }

 // フィールドが無い場合
 else
 {
  print "<tr>\n";
  print "<td>フィールドはありません</td>\n";
  print "</tr>\n";
 }
 print "</table>\n";

 // 結果セットの解放
 mysql_free_result($rs);
}

?>
</body>
</html>

 結果はたとえば、以下のように表示されます。

 

 

 

 


前へ | 目次へ |次へ  | YCポータルサイト

執筆 山田豊通
更新日: 2006年9月13日