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; |
スクリプトの強制終了 |
|