PHP レコードを検索する方法。

データベースを使うメリットに、大量のデータから目的のものを簡単に検索できることがあります。レコード数が数千、数万になるテーブルを扱う時には検索機能が欠かせません。

都道府県はそれほど多くないので、わざわざ検索するまでもありませんが、PHPで検索するプログラムの基本はデータが増えても一緒です。

そこで今回は都道府県名から「あいまい検索」を行なうプログラムをPHPで作成します。通常検索エンジンでは、スペースで区切って複合語検索できます。しかしプログラムが複雑になるので、とりあえず一番簡単な「1単語」による検索が出来るようにします。

○長
○長崎
×長 崎
×山 海

今回は select.php と search.php のプログラムを行き来します。この2つは画面がほとんど同じなので、ブラウザのアドレスを見て、今どのプログラムが処理しているのか考えながら進めてください。


【1】sample106 フォルダをコピーして sample107 フォルダを作成します。

php-231.gif


【2】今回は以下のようなファイルの構成になります。

php-230.gif

・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-02.gif

準備ができたら作成したPHPプログラムを実行してみましょう。


【4】ブラウザのアドレスに http://localhost/test/sample107/select.php と入力し、実行します。


【5】全件表示(select.php)の画面が表示されました。検索用のテキストボックスとボタンが表示されています。

php-232.gif


【6】テキストボックスに「山」と入力し「検索」ボタンをクリックします。

php-233.gif

*二つ以上の単語には対応していません。


【7】検索結果(search.php)の画面が表示されました。「山」を含む都道府県の一覧が表示されています。

php-234.gif

*select.php → search.php の流れ


【8】次は「島」と入力し「検索」ボタンをクリックします。

php-235.gif


【9】検索結果(search.php)の画面が表示されました。「島」を含む都道府県の一覧が表示されています。

php-236.gif

*search.php → search.php の流れ
自分自身のプログラムを呼び出している点に注目してください。


【10】「全件表示へ」リンクをクリックします。

php-237.gif


【11】全件表示(select.php)の画面が表示されたら、テキストボックスは空のまま「検索」ボタンをクリックします。

php-238.gif


【12】検索キーワードが未入力だったので、メッセージが表示されました。「全件表示へ」リンクをクリックします。

php-239.gif


【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ファイルに統合することもできます。しかし検索の大きな流れをつかむことが一番の目的なので、プログラムがシンプルになるように分けました。


【ワンポイント】

「崎、埼」などの漢字で検索すると、思ったような結果にならない場合があります。

php-240.gif


スポンサードリンク

スポンサードリンク






PHP初心者入門講座TOPへ