[PHP-users 19136]Re: PHP+MySQLでの検索システムについて

osakazu(K.Osanai) osakazu @ minos.ocn.ne.jp
2003年 11月 26日 (水) 21:40:32 JST


初めましてこんばんわ。
半年ほどROMをしておりました長内と申します。

最近自分もPHP+MySQLで検索エンジンシステムを組んでいるため、
ちょっとでも役に立てればと思いまして返信しました。

>構造的には、index.htmlに検索フォーム用の1行テキストボックスがありメソッドを
>POSTでsearch.phpにデータを受け渡します。
>search.phpでは、MySQL接続を行い受け取ったデータを出力させています。
>search.phpのソースは以下の通りです。
>
><?php
>function secho ($str) {
>         echo htmlspecialchars($str);
>}
>
>$con = mysql_connect("サーバー名", "アカウント", "パスワード");
>mysql_select_db("DB名"); //MySQLへの接続
>
>$sql = 'select * from テーブル名 where name like "'.$_POST['space'].'%"'; 
>//検索フォーム用
>
>$yomi = $_GET['yomi']; //50音順索引検索用
>if($yomi=="あ"){
>
>中略
>
>}elseif($yomi=="num"){
>$sql = 'select * from DB名.テーブル名 where yomi between "0" and "9" order
>by yomi';
>}
>
>$res = mysql_query($sql);
>
>mysql_close($con); //MySQLへの切断
>?>

この状態だと、50音順索引検索が有効の場合はキーワード検索が使えないと思います。
キーワード検索か、五十音順かをはっきりさせ、処理させるべきかと。

ちなみに、自分の場合のキーワード、AND-OR部分はこんな感じです。

// $keyがキーワードになります
// $tmpkeyは"and" "or"をフォームで選択するようになっています

if ((isset($key) and strlen($key) > 0)) {
         $key = trim($key);
         $key = mb_convert_kana($key, 's');
         $key = str_replace('  ',' ',$key);
         $arykey = explode(" ", $key);

         $where = " WHERE (( name Like '%$arykey[0]%' )";

         for($i = 1; $i < sizeof($arykey); $i++) {
                 $where .= " " . $tmpkey;
                 $where .= " ( name Like '%".$arykey[$i]."%' )";
         }
         $where .= ")";
}

$sql = "select * from テーブル名 " . $where;

// 独自の仕様、大まかなところは省きました

これで、スペース区切りのキーワードでMySQLのnameを対象に検索することが出来ると 
思います。

>index.htmlのフォームでテキストボックスの右となりあたりにリストメニューでAND
>とORを選択させた方が良いということなのでしょうか?

自分はラジオボタンを利用していますが、リストメニューの方がスマートかもしれま 
せんね。

このキーワード検索に五十音順も併せて検索するようになるとまたちょっと複雑にな 
ると思います。

if ((isset($key) and strlen($key) > 0)) {
         $key = trim($key);
         $key = mb_convert_kana($key, 's');
         $key = str_replace('  ',' ',$key);
         $arykey = explode(" ", $key);

         $where = " WHERE (( name Like '%$arykey[0]%' )";

         for($i = 1; $i < sizeof($arykey); $i++) {
                 $where .= " " . $tmpkey;
                 $where .= " ( name Like '%".$arykey[$i]."%' )";
         }
         $where .= " AND";

         if($yomi=="あ"){
         $where .= " ( yomi between 'あ' and 'お' );

<中略>

         }elseif($yomi=="num"){
         $where .= " ( yomi between '0' and '9' );
         }
         $where .= ") ";
}

$sql = "select * from テーブル名 " . $where . "order by yomi";

まぁ、それでもこんな感じかと思いますが。

※おまけ:検索部分だけ完成しているページです
http://ragnarok.osakazu.net/php/

長々と申し訳ございませんでした。
少しでもお役に立てられれば幸いです(^^ゞ

---------------------------------------------
長内 和樹
osakazu @ minos.ocn.ne.jp
http://www.osakazu.net/



PHP-users メーリングリストの案内