<<<back

Webデータベースの構築について 弐

phpスクリプトの内容(result.php
 検索フォームから呼び出される、データベース検索+結果表示用のphpスクリプト(result.php)の内容は以下の通りです(↓下図)。

<HTML>
<HEAD>
<TITLE>結果表示</TITLE>
</HEAD>
<BODY>
<?

//POSTは必ず大文字じゃないとダメ。
$str_key = $_POST["str_key"];

//MySQLサーバに接続
if (!$int_connect = @mysql_connect("localhost", "mysql", "password")) {
die("can't connect mysql server.");
}

//データベースに接続
if (!@mysql_select_db("web_db", $int_connect)) {
die("can't use selected database.");
}

//sql文の作成
$str_sql = "select id, title, author, pp, publisher, page, py, subject, ndc from bib_tb where title like '%$str_key%' or subject like '%$str_key%' or author like '%$str_key%' or publisher like '%$str_key%' order by py desc";

//sqlの実行
if(!$int_result = @mysql_query($str_sql)){
die("sql error.");
}

//検索結果の表示
while ($str_array = @mysql_fetch_array($int_result)){
echo "タイトル: ", $str_array['title'], "<BR>";
echo "著者: ", $str_array['author'], "<BR>";
echo "出版地: ", $str_array['pp'], "<BR>";
echo "出版者: ", $str_array['publisher'], "<BR>";
echo "ページ数: ", $str_array['page'], "<BR>";
echo "出版年: ", $str_array['py'], "<BR>";
echo "主題: ", $str_array['subject'], "<BR>";
echo "NDC記号: ", $str_array['ndc'], "<P>";
}

//結果集合メモリの解放
@mysql_free_result($int_result);

//サーバからの切断
@mysql_close($int_connect);

?>
</BODY>
</HTML>

phpスクリプトの解説
 以下では、result.phpについて、順を追って解説していきます。

 まず、phpスクリプトは、

<?

で始まり、

?>

で終わります。

 今回の例でも、<?と?>の間にphpスクリプトが記述されていることが分かります(↓下図)。

<HTML>
<HEAD>
<TITLE>結果表示</TITLE>
</HEAD>
<BODY>
<?
〜スクリプト〜
?>
</BODY>
</HTML>

 このほか、

<?php
〜スクリプト〜
?>

や、

<SCRIPT LANGUAGE="php">
〜スクリプト〜
</SCRIPT>

でも同じことです。

 次に、変数についてですが、phpでは、様々な型のデータを扱うことができますが、一般的なプログラミング言語とは異なり、変数を定義する際に、型を明示的に宣言する必要はありません。
 どのような変数であっても、全て、

$変数名;

とすればOKです。
  •  変数名の前には、必ず、$(ダラー・マーク)が付きます。
  •  変数の型については、代入される値に応じて、phpが自動的に判定してくれます。
  •  変数名に使える文字は、半角英数字と_(アンダー・バー)です。
  •  phpでは、変数名の大文字と小文字を区別します。

 ↓以下の例では、$_POST["str_key"]の値を、$str_keyに代入しています。
 //以降はコメントです。
 phpでは、一文ごとに、末尾に、;(セミコロン)を記入しなければなりません。

//POSTは必ず大文字じゃないとダメ。
$str_key = $_POST["str_key"];

 $_POST["str_key"]というのは、postメソッドで送られてきたstr_keyの値を表す変数(関数?)です。
 str_keyというのは、search_2.htmlにおいて、検索キーを入力するテキスト・フォームの名前であったことを思い出してください。
 すなわち、入力された検索キーが、この$_POST["str_key"]に格納されいて、それをさらに、phpスクリプト中の変数である$str_key(紛らわしいですが別の変数です)に代入したということです。

 phpのマニュアルなどでは、postメソッドやgetメソッドで送られきた値については、呼び出し側で用いられているフォーム部品の名前の前に$(ダラー・マーク)を付けた変数を用いることによって、php側では簡単に参照できると書かれているものがあります。
 ここでの例では、search_1.htmlにおいてstr_keyに入力された値が、result.phpでは、自動的に、$str_keyに格納されているということです。
 但し、これはphpのバージョンや使用する環境によっては、うまくいかない場合がありますので注意が必要です。
 というよりも、セキュリティのために、現在では、そういった値の渡し方は推奨されていないようです。
 phpのメーリングリストを見ていても、定期的に、フォームから送信されたデータがphpスクリプトに渡されないといった投稿が見受けられます。
 php4.0.1以降では、今回の例のように、

$_POST["呼び出し側のフォーム部品名"]

で値を渡すようにしましょう。
 詳しくは、phpマニュアルのPHPの外部から来る変数をご覧下さい。

MySQLへの接続
 さて、次に、MySQLサーバに接続します。
 既に述べたとおり、phpには、MySQLのための関数が多数用意されています。
 サーバに接続するには、mysql_connect関数を使用します。

mysql_connect(ホスト名, ユーザ名, パスワード);

です。
 ホスト名は、ユーザのホスト名ではなく、接続するMySQLサーバのホスト名であることに留意して下さい。
 ホスト名を省略すると、localhostのサーバに接続します。
 ユーザ名は、

ユーザ名@ユーザのホスト名

のように指定しても構いません。
 接続に成功すると、mysql_connect関数は、接続ID(int型)を返しますが、失敗すると0を返します。

 ここでは、Webデータベースの構築について 壱で登録しておいた、ユーザ名(mysql)とパスワード(password)を引数として入力します。
 以下のif文の中では、mysql_connect関数を使ってサーバへの接続をするとともに、mysql_connect関数の戻り値を$int_connectに代入して、$int_connectが0(=false)であれば、強制的にスクリプトを終了させ、

can't connect mysql server.

という文字列を表示させるという作業をいっぺんに行っています。(↓下図)。

//MySQLサーバに接続
if (!$int_connect = @mysql_connect("localhost", "mysql", "password")) {
die("can't connect mysql server.");
}

 if文は、条件分岐のための制御構文です。
 基本構文は以下の通りです。

if (条件式) {
〜条件式がtrueであった場合の処理〜
}

 今回のスクリプトで用いたように、条件式の前に!(エクスクラメーション・マーク)を付けると、条件式がfalseであった場合の処理を実行します。

if (!条件式) {
〜条件式がfalseであった場合の処理〜
}

 また、複数の条件分岐を行いたい場合は、以下のように記述します。

if (条件式) {
〜条件式がtrueであった場合の処理〜
} else {
〜条件式がfalseであった場合の処理〜
}

あるいは、

if (条件式1) {
〜条件式1がtrueであった場合の処理〜
} elseif (条件式2) {
〜条件式1がfalseであり、条件式2がtureであった場合の処理〜
} else {
〜条件式1と条件式2がfalseであった場合の処理〜
}

です。

 また、ここでは、スクリプトを強制終了させるために、

 die("文字列");

を用いていますが、これは、スクリプトを中断させた後に、引数である文字列を表示するための関数です。
 単に、終了させるだけで良いならば、 exit;

でも構いません。

 ところで、mysql_connect関数の直前に付けられている@(アットマーク)は、接続に失敗して、エラーが返された場合、エラー情報をユーザに表示しないようにするためのおまじないのようなものです。
 例えば、今回のスクリプトにおいて、@を付けなかった場合、MySQLサーバが立ち上がっていないのに、サーバに接続しようとすると、以下のようなエラー情報が表示されます。

Warning: Can't connect to MySQL server on 'localhost' (10061) in c:\program files\apache group\apache\htdocs\result.php on line 12

Warning: MySQL Connection Failed: Can't connect to MySQL server on 'localhost' (10061) in c:\program files\apache group\apache\htdocs\result.php on line 12
can't connect mysql server.

 このとき、@mysql_connect()としておくと、エラー情報は表示されず、

can't connect mysql server.

とだけ表示されることになります。
 開発中はエラー情報の詳細が表示されることが望ましいですが、第三者に公開する場合などは、@を付けておいた方が良いでしょう。

 mysql_connect関数のほかにも、MySQLサーバに接続する方法として、mysql_pconnect関数というのがあります。

mysql_pconnect(ホスト名, ユーザ名, パスワード);

 これは、引数も戻り値もmysql_connect関数と全く同じですが、ページ内の処理が完了しても、接続が保持され続けるという点が異なります。
 この場合、サーバ側のリソースを食うというデメリットがある一方で、二度目以降に接続する場合、接続のためのオーバー・ヘッドが少なくなるというメリットもあります。

 次に、検索対象となるデータベースを選択します。
 ここでは、mysql_select_db関数を用います。

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

です。
 第二引数の接続IDは、mysql_connect関数の戻り値です。
 mysql_select_db関数の戻り値はブール型(true or false)であり、データベースの選択に成功するとtrue、失敗するとfalseを返します。
 ここでは、戻り値を他の変数に代入せず、そのままif文の条件式に用いて、falseであった場合のみ、スクリプトを強制終了させ、

can't user selected database.

と表示するようにしています(↓下図)。

//データベースを選択
if (!@mysql_select_db("web_db", $int_connect)) {
die('can't use selected database.');
}

 以下に、このページで紹介したPHPの関数を列挙しておきます。

関数 内容
mysql_connect(host, user, password); MySQLサーバに接続して接続IDを返す
mysql_pconnect(host, user, password); MySQLサーバに接続して接続IDを返す
接続を保持
mysql_select_db(database, connection_id); データベースを選択
die("string"); スクリプトを強制終了して文字列を表示
exit; スクリプトの強制終了