検索の実行
検索を実行するために、$str_keyの値を用いて、MySQL用のSQL文を作成しておきます。
ここでは、title、author、subject、publisherのいずれかに検索キーを含むレコードを、出版年(py)の新しい順に表示するような検索を実行します。
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
これを$str_sqlの中に代入すれば準備OKです(↓下図)。
//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文を実行します。
SQL文を実行するための関数は、
mysql_query(SQL文, 接続ID);
です。
接続IDを省略した場合、最も新しく確立された接続IDを利用してくれます。
mysql_query関数の戻り値は、検索が実行された場合は結果ID(int型)、エラーが出た場合は0が返されます。
ここでは、戻り値を$int_resultに代入しておき、falseであった場合、スクリプトを強制終了させて、
sql error.
と表示させるようにしています(↓下図)。
//sqlの実行
if(!$int_result = @mysql_query($str_sql, $int_connect)){
die("sql error.");
}
|
ここでは、データベースを選択してから、SQL文を実行していますが、データベースの選択とSQL文の実行を同時に行うためのmysql_db_query関数も用意されています。
mysql_db_query(データベース名, SQL文, 接続ID);
です。
これは、データベースを指定するという以外は、mysql_query関数と全く同じ挙動をします。
検索結果の表示
次に、検索結果を取得して、HTMLで表示します。
検索結果を取得するには、幾つかの方法がありますが、ここでは、mysql_fetch_array関数を用いています。
mysql_fetch_array(結果ID, 結果タイプ);
mysql_fetch_array関数は、結果IDによって指定される検索結果集合を格納した配列を返します。
配列を取得できなかった場合はfalseを返します。
第一引数である結果IDは、mysql_query関数やmysql_db_query関数の戻り値です。
第二引数である結果タイプには、以下の三つのいずれかを指定することができます。
- mysql_assoc
結果を連想配列として取得する。
- mysql_num
結果を配列(添字配列)として取得する。
- mysql_both
結果を連想配列・添字配列の両方で取得する。
結果タイプは省略可能です。
省略した場合のデフォルトはmysql_bothです。
今回の例では、mysql_fetch_array関数の戻り値を$str_arrayという変数に格納しています(↓下図)。
$str_array = @mysql_fetch_array($int_result)
|
$str_arrayの各フィールドの値を参照したい場合は、
$str_array["フィールド名"]
あるいは、
$str_array[フィールド番号]
とします。
フィールド名は、テーブルで指定されたフィールド名(カラム名)です(連想配列の場合)。
フィールド番号とは、各フィールドを指示する番号であり、テーブルにおいて設計されている順番通りに0から順に数値が指定されています(添字配列の場合)。
例えば、bib_tbテーブルの場合、idのフィールド番号は0, titleは1, authorは2, ppは3, publisherは4, pageは5, pyは6, subjectは7, ndcは8で指定できます。
また、mysql_fetch_array関数とよく似た関数として、
mysql_fetch_assoc(結果ID);
あるいは、
mysql_fetch_row(結果ID);
があります。
mysql_fetch_assoc関数は、結果IDで指定された結果集合を連想配列で取得します(値はフィールド名で参照)。
したがって、mysql_fetch_array関数で、第二引数に、mysql_assocを指定した場合と同じ結果が得られます。
mysql_fetch_row関数は、結果IDで指定された結果集合を添字配列で取得します(値はフィールド番号で参照)。
この場合は、mysql_fetch_array関数の第二引数に、mysql_numと指定したものと同じ結果が得られることになります。
一方、mysql_fetch_object関数を用いると、結果集合の行を配列としてではなく、オブジェクトとして取得します。
mysql_fetch_object(結果ID);
ここで、各フィールドの値を参照するには、
$str_array -> フィールド名
のようにします。
mysql_fetch_ojbect関数では、フィールド名のみ指定可能であり、フィールド番号は用いることができません。
また、ページに文字列や変数の値を出力表示するには、echo関数を用います。
echo "文字列";
あるいは、
echo $変数名;
と指定します。
複数の変数や文字列を出力したい場合は、,(カンマ)で区切ればOKです。
例えば、以下の通り。
echo $変数名, "文字列", $変数名, "文字列";
このほか、文字列のみを表示するならば、print関数を用いて、
print "文字列";
とすることができます。
ここでは、while文で制御し、レコードの行が存在する限り、echoでレコードを出力し続けます。
mysql_fetch_array関数は、レコードが終了すると、falseを返すので、その時点で、while文は終了します。
(↓下図)。
//検索結果の表示
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>";
}
|
while文は、繰り返しのための制御構文であり、
while(条件式){
〜条件式がtrueである間だけ繰り返される処理〜
}
あるいは、
while(!条件式){
〜条件式がfalseである間だけ繰り返される処理〜
}
のように記述します。
ここまででも構いませんが、結果集合のメモリを解放し、サーバとの接続も切断しておきましょう。
結果集合用のメモリを解放するには、
mysql_free_result(結果ID);
とします。
引数の結果IDは、mysql_query関数や、mysql_db_query関数の戻り値です。
これによって、不用なメモリの消費を防ぐことができます。
//結果集合メモリの解放
@mysql_free_result($int_result);
|
また、通常、ページ内の処理が終了すれば、サーバとの接続は切断されるのですが、ここでは、mysql_close関数を利用して、明示的に切断処理を行います。
mysql_close(接続ID);
接続IDとは、やはり、mysql_connect関数、あるいは、mysql_pconnect関数の戻り値です。
//サーバからの切断
@mysql_close($int_connect);
|
以上でスクリプトの解説は終了です。
result.phpもまた、search_2.htmlと同じように、Apacheのドキュメント・ルートに保存しておきます。
以下に、このページで紹介したPHPの関数を列挙しておきます。
関数 |
内容 |
mysql_query(sql, connection_id); |
SQL文を実行して接続IDを返す。 |
mysql_db_query(database, sql, connection_id); |
データベースを指定してSQL文を実行して接続IDを返す。 |
mysql_fetch_array(result_id, result_type); |
結果集合を結果タイプで指定した配列に取得する。 |
mysql_fetch_assoc(result_id); |
結果集合を連想配列に取得する。 |
mysql_fetch_row(result_id); |
結果集合を添字配列に取得する。 |
mysql_fetch_object(result_id); |
結果集合をオブジェクトに取得する。 |
echo "string"; |
文字列を表示する。 |
echo $variable; |
変数の値を表示する。 |
print "string"; |
文字列を表示する。 |
mysql_free_result(result_id); |
結果集合のメモリを解放する。 |
mysql_close(connection_id); |
MySQLサーバへの接続を切断する。 |
Webデータベースの利用
それでは、実際に、Webデータベースを起動して検索を行ってみましょう。
まず、コマンド・プロンプトを立ち上げて、ApacheとMySQLサーバを立ち上げます。
C:\>net start apache[Enter Key]
Apache サービスを開始します.
Apache サービスは正常に開始されました。
C:\>net start mysql[Enter Key]
MySql サービスを開始します.
MySql サービスは正常に開始されました。
C:\>
|
次に、ブラウザを立ち上げて、
http://localhost/search_2.html
にアクセスします。
ドメイン名(localhost)の替わりに、IPアドレス(127.0.0.1)を指定して、
http://127.0.0.1/search_2.html
としても同じことです。
サーバ・マシンにグローバルIPがふられている場合は、ブラウザでそのIPを指定するとともに、result.phpの中の
//MySQLサーバに接続
if (!$int_connect = mysql_connect("localhost", "mysql", "password")) {
die("can't connect mysql server.");
}
の部分を、
//MySQLサーバに接続
if (!$int_connect = mysql_connect("XXX.XXX.XXX.XXX", "mysql", "password")) {
die("can't connect mysql server.");
}
の様に書き換えれば、ローカル・ホストではなく、インターネット経由でアクセスすることができます。
XXX.XXX.XXX.XXXの部分には、サーバマシンにふられたグローバルIPアドレスを指定します。
ここでは、検索フォームに”池内”と入力して、searchボタンをクリックしてみます(↓下図)。

すると、タイトル、著者名、出版者、主題の一部に”池内”を含むようなレコードを、出版年の降順に表示してくれます(検索結果はこちら)。
おわりに
以上で、Webデータベースの構築に関する解説を終わります。
但し、ここで作成したデータベースは、極めて単純なものですので、実用に耐えられるものとはなっていません。
最後に、改良のためのさらなる課題を挙げて、締めくくっておきたいと思います。
- 複数のキーワードを入力できるようにする。
- 特定のフィールドを指定して検索できるようにする。
- キーワード間における論理演算子の使用を可能にする。
- 複数の条件式間における論理演算子の使用を可能にする。
- 複数のテーブル間での結合を可能にする。
- 検索結果が膨大になった場合のために、1ページごとの表示件数を設定する。
- 簡易結果画面と詳細結果画面とに分離する。
- 日本語での全文インデックスを利用可能にする。
- セッションを保持して接続を保存できるようにする。
- ページのデザインを改訂する。
とりあえず、おしまい
|