<<<back

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

検索の実行
 検索を実行するために、$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ページごとの表示件数を設定する。
  • 簡易結果画面と詳細結果画面とに分離する。
  • 日本語での全文インデックスを利用可能にする。
  • セッションを保持して接続を保存できるようにする。
  • ページのデザインを改訂する。
とりあえず、おしまい