|
MySQLによるWebアプリケーションを構築する前提として、以下OSとしてWindows Vista、WWWシステムとしてApache2.0、サーバサイドのスクリプト言語としてPHP5を使用します。
Windows Vista へのApache2.0とPHP5のインストールおよび環境設定については、以下のWebページを参照してください。
WindowsVista+Apache2.0+PHP5環境の構築
http://www.yamada-lab.org/doc/win_vista/apache2.0/
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ファイルに漢字を使う場合は 「UTF8コード」 である必要があります。一般にWindows環境では、エディターは漢字コードとしてSHIFT-JIS(SJIS)コードを使用しています。
(1) したがって、たとえばエディターソフトの「秀丸」を使う場合は、作成したPHPファイル等を保存する場合は、以下のように「UTF8コード」に設定して保存する必要があります。「名前をつけて保存」ダイアログボックスの下の「エンコードの種類」で「Unicode(UTF-8)」を選択し、「保存」ボタンをクリックします。

(2)逆に、「UTF8コード」で記述されたPHPファイル等をエディターで読み取る場合も、漢字コードの種類を「Unicode(UTF-8)」に設定します。「ファイルを開く」ダイアログボックスの下の「エンコードの種類」で「Unicode(UTF-8)」を選択し、「開く」ボタンをクリックします。なお、「自動判定」でいい場合もあります。

■データベースサーバへの接続
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);
データベースのに接続した直後に、文字化けを防ぐために、以下のSQL文を必ず実行します。
$str_sql = "set names utf8;";
$rs = mysql_query($str_sql,$db);
まず、ここでは、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
print "データベースへの接続テスト<br>";
//データベースサーバ名の設定
$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);
//クライアント文字コードの通知(文字化け防止)
$str_sql = "set names utf8;";
$rs = mysql_query($str_sql,$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_商品表」のすべてのレコードのすべてのフィールド名と値が表示されます。

(注)以下のブラウザの画面は、WindowsXPのIE(Internet Explorer)で表示した画面ですが、WindowsVistaのIEで表示した場合で、表示内容は特に異なるものではありません。
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=UTF-8">
<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=UTF-8">
<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=UTF-8">
<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=' ';
}
// フィールド属性の表示
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>
結果はたとえば、以下のように表示されます。

|