都道府県はそれほど多くないので、わざわざ検索するまでもありませんが、PHPで検索するプログラムの基本はデータが増えても一緒です。
そこで今回は都道府県名から「あいまい検索」を行なうプログラムをPHPで作成します。通常検索エンジンでは、スペースで区切って複合語検索できます。しかしプログラムが複雑になるので、とりあえず一番簡単な「1単語」による検索が出来るようにします。
○長
○長崎
×長 崎
×山 海
今回は select.php と search.php のプログラムを行き来します。この2つは画面がほとんど同じなので、ブラウザのアドレスを見て、今どのプログラムが処理しているのか考えながら進めてください。
【1】sample106 フォルダをコピーして sample107 フォルダを作成します。
【2】今回は以下のようなファイルの構成になります。
・select.php は少しだけ変更があります。
・search.php は新規に作成します。
・SampleDB050.php、update.php、delete.php、insert.php、update2.php、delete2.php、insert2.php、select.js は前回の sample106 と同じものなのでソースコードは省略します。
*「\」はWindowsではエンマークのことです。
保存先 C:\phpdev\www\test\sample107
ファイル名 select.php
<?php
//ファイルを読み込み
require_once("SampleDB050.php");
// クエリを送信する
$sql = "SELECT * FROM T01Prefecture ORDER BY PREF_CD";
$result = executeQuery($sql);
//結果セットの行数を取得する
$rows = mysql_num_rows($result);
//表示するデータを作成
if($rows){
while($row = mysql_fetch_array($result)) {
$tempHtml .= "<tr>";
$tempHtml .= "<td>".$row["PREF_CD"]."</td><td>".$row["PREF_NAME"]."</td>";
$tempHtml .= "<td><a href=\"update.php?cd=".$row["PREF_CD"]."\" target=\"_self\">更新</a></td>";
$tempHtml .= "<td><a href=\"delete.php?cd=".$row["PREF_CD"]."\" target=\"_self\">削除</a></td>";
$tempHtml .= "</tr>\n";
}
$msg = $rows."件のデータがあります。";
}else{
$msg = "データがありません。";
}
//結果保持用メモリを開放する
mysql_free_result($result);
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=SHIFT-JIS">
<title>全件表示</title>
<script type="text/javascript" src="select.js"></script>
</head>
<body>
<h3>全件表示</h3>
<form name="form2" action="search.php" method="post">
<input type="text" name="keyword" size="20">
<input type="submit" name="search" value="検索">
</form>
<?= $msg ?>
<table width = "300" border = "1">
<tr bgcolor="##ccffcc"><td>PREF_CD</td><td>PREF_NAME</td><td colspan="2">EDIT</td></tr>
<?= $tempHtml ?>
<form name="form1" action="insert.php" method="post">
<tr>
<td><input type="text" name="cd" id="cd"></td>
<td><input type="text" name="name"></td>
<td colspan="2">
<input type="submit" name="insert" value="追加"><input type="reset" value="リセット">
</td>
</tr>
</form>
</table>
</body>
</html>
保存先 C:\phpdev\www\test\sample107
ファイル名 search.php
<?php
//ファイルを読み込み
require_once("SampleDB050.php");
//データを取得する
$keyword = $_POST['keyword'];
//抽出条件を組み立てる
if(!empty($keyword)){
$where = "WHERE ";
$where.= "PREF_NAME LIKE '%".$keyword."%'";
}else{
print "<html>";
print "<head><title>未入力</title></head>";
print "<body>";
print "検索キーワードが入力されていません。";
print "<p><a href=\"select.php\" target=\"_self\">全件表示へ</a><p>";
print "</body>";
print "</html>";
exit;
}
// クエリを送信する
$sql = "SELECT * FROM T01Prefecture ".$where;
$sql .= " ORDER BY PREF_CD";
$result = executeQuery($sql);
//結果セットの行数を取得する
$rows = mysql_num_rows($result);
//表示するデータを作成
if($rows){
while($row = mysql_fetch_array($result)) {
$tempHtml .= "<tr>";
$tempHtml .= "<td>".$row["PREF_CD"]."</td><td>".$row["PREF_NAME"]."</td>";
$tempHtml .= "<td><a href=\"update.php?cd=".$row["PREF_CD"]."\" target=\"_self\">更新</a></td>";
$tempHtml .= "<td><a href=\"delete.php?cd=".$row["PREF_CD"]."\" target=\"_self\">削除</a></td>";
$tempHtml .= "</tr>\n";
}
$msg = $rows."件のデータがあります。";
}else{
$msg = "データがありません。";
}
//結果保持用メモリを開放する
mysql_free_result($result);
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=SHIFT-JIS">
<title>検索結果</title>
<script type="text/javascript" src="select.js"></script>
</head>
<body>
<h3>検索結果</h3>
<form name="form2" action="search.php" method="post">
<input type="text" name="keyword" size="20">
<input type="submit" name="search" value="検索">
</form>
<?= $msg ?>
<table width = "300" border = "1">
<tr bgcolor="##ccffcc"><td>PREF_CD</td><td>PREF_NAME</td><td colspan="2">EDIT</td></tr>
<?= $tempHtml ?>
<form name="form1" action="insert.php" method="post">
<tr>
<td><input type="text" name="cd" id="cd"></td>
<td><input type="text" name="name"></td>
<td colspan="2">
<input type="submit" name="insert" value="追加"><input type="reset" value="リセット">
</td>
</tr>
</form>
</table>
<p><a href="select.php" target="_self">全件表示へ</a><p>
</body>
</html>
【3】C:\phpdev にある 2K-NT-XP-phpdev_start.bat をダブルクリックして、phpdev を起動します。
準備ができたら作成したPHPプログラムを実行してみましょう。
【4】ブラウザのアドレスに http://localhost/test/sample107/select.php と入力し、実行します。
【5】全件表示(select.php)の画面が表示されました。検索用のテキストボックスとボタンが表示されています。
【6】テキストボックスに「山」と入力し「検索」ボタンをクリックします。
*二つ以上の単語には対応していません。
【7】検索結果(search.php)の画面が表示されました。「山」を含む都道府県の一覧が表示されています。
*select.php → search.php の流れ
【8】次は「島」と入力し「検索」ボタンをクリックします。
【9】検索結果(search.php)の画面が表示されました。「島」を含む都道府県の一覧が表示されています。
*search.php → search.php の流れ
自分自身のプログラムを呼び出している点に注目してください。
【10】「全件表示へ」リンクをクリックします。
【11】全件表示(select.php)の画面が表示されたら、テキストボックスは空のまま「検索」ボタンをクリックします。
【12】検索キーワードが未入力だったので、メッセージが表示されました。「全件表示へ」リンクをクリックします。
【13】あとはいろんなキーワードで検索してみたり、検索結果からも追加、更新、削除ができることを確認してください。
【解説】
select.php と search.php のソースコードはほとんど同じです。SQL文を組み立てている部分が違うだけです。
select.php の検索ボタンをクリックすると、search.php が呼び出されますが、search.php の検索ボタンをクリックすると、search.php 自身が呼び出されている点がポイントです。
■共通部分
(1)検索用のテキストボックスとボタンを配置するフォームを作りました。
<form name="form2" action="search.php" method="post">
<input type="text" name="keyword" size="20">
<input type="submit" name="search" value="検索">
</form>
(2)追加ボタンの名前を「insert」に変更しました。この変更によるプログラムへの影響はありませんが、名前をちゃんと付けておいたほうが後々改良しやすいためです。
<form name="form1" action="insert.php" method="post">
省略
<input type="submit" name="insert" value="追加">
省略
</form>
■search.php
(1)検索キーワードを取得している部分です。
$keyword = $_POST['keyword'];
(2)抽出条件を組み立てている部分です。
if(!empty($keyword)){
$where = "WHERE ";
$where.= "PREF_NAME LIKE '%".$keyword."%'";
}else{
print "<html>";
print "<head><title>未入力</title></head>";
print "<body>";
print "検索キーワードが入力されていません。";
print "<p><a href=\"select.php\" target=\"_self\">全件表示へ</a><p>";
print "</body>";
print "</html>";
exit;
}
検索キーワードが入力されていたら(空でなかったら)、抽出条件をあいまい検索で作成して変数に代入しています。
*この部分を改良すると、複合語で検索できるようになります。
未入力の場合はメッセージを表示して、「exit;」で現在のスクリプトを終了しています。exitより下に書かれているものは表示されません。htmlやbodyのタグも表示されないので、最低限のHTMLタグは print で出力しています。
(3)クエリを送信している部分です。抽出条件を付け加えただけです。
$sql = "SELECT * FROM T01Prefecture ".$where;
$sql .= " ORDER BY PREF_CD";
$result = executeQuery($sql);
(4)「全件表示へ」リンクを表示している部分です。
<p><a href="select.php" target="_self">全件表示へ</a><p>
select.php と search.php は共通する部分を関数にまとめたり、1つのphpファイルに統合することもできます。しかし検索の大きな流れをつかむことが一番の目的なので、プログラムがシンプルになるように分けました。
【ワンポイント】
「崎、埼」などの漢字で検索すると、思ったような結果にならない場合があります。