フォームからand,or検索を実装したSQLを生成する
古いソースの一部を公開です。(nicoDB_Search)
PHP5.2.6のみでand,or検索を実装したSQL生成のソースです。
改変は自由にして下さい。
旧nicoDB_SearchのSQL生成のソース
//JavaScript部分(簡易入力チェック) <script language="javascript"> function jsort(targ,selObj,restore){ eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'"); if (restore) selObj.selectedIndex=0; } function spCheck(trg) { var ck = trg; re = new RegExp("^[ ]+$"); if(re.test(trg)!=true){ return false; }else{ return true; } } function formCheck() { if (document.search.word.value=="") { document.getElementById('err_msg').style.display ='inline'; document.getElementById('err_msg2').style.display ='none'; return false; }else if(spCheck(document.search.word.value)){ document.getElementById("err_msg").style.display = 'none'; document.getElementById('err_msg2').style.display ='inline'; return false; }else{ document.search.submit(); } } </script><?php $limit =40;//1ページ当たりの表示件数 $word = $_GET{'word'};//検索語を格納(例:"ニコニコ 動画") $sort = $_GET{'sort'};//ソートの識別子を格納 $page = $_GET{'page'};//取得ページ数を格納 $aoro = $_GET{'aoro'};//andかor検索の識別子を格納 function addsl($comment) {//Like句の生成用のエスケープ関数 $comment = mysql_real_escape_string($comment);//Mysql接続前はこの行をコメントしてからテスト $comment = preg_replace("/%/","\%",$comment);//%をエスケープ $comment = preg_replace("/_/","\_",$comment);//_をエスケープ $comment = htmlspecialchars($comment, ENT_QUOTES);//HTMLタグをエスケープ return $comment;//リターン } $where = '';//変数$whereの初期化 if(isset($word)){ ///////////where句の生成ここから///////////// $word = trim($word);//文字列両端の空白文字列を除去 if(preg_match("/[ | ]+/", $word,$num)){//半角、全角空白が2文字以上連続で続いていたら $word = mb_convert_kana($word, "s");//全角スペースを半角スペースに置換 $keywords=preg_replace("/[\s]+/"," ",$word);//連続した半角スペースを半角スペ一つに置換 $keywords = explode(" ",$keywords);//半角スペース区切りで配列に格納 }else{//そうでなかったら(複数語検索ではない) $keywords[0] = $word;//文字列をそのまま$keywordに代入 } foreach($keywords as $tit){ if($tit != ""){//もしキーワードが未指定でなかったら $tkwd[] = " title LIKE '%".addsl($tit)."%' ";//titleカラムから探すLike文を生成する } } foreach($keywords as $des){ if($des != ""){//真上と同上 $dkwd[] = " description LIKE '%".addsl($des)."%' ";//投稿者コメントから探すLike文を生成 } } if($word != ''){//検索語が未指定でなかったら if($aoro=="and"){//ラジオボタンのand検索が選択されていたら if(count($tkwd) > 0 && count($dkwd) > 0){//検索対象である動画タイトル、投稿者コメの検索ワードが0個でなければ $like .= implode("and",$tkwd)." or ";//Like句一つ一つを $like .= implode("and",$dkwd);//andで配列の要素を結合(例:title LIKE '%東方%' and title LIKE '%アレンジ%') } }elseif($aoro=="or"){//ラジオボタンのor検索が選択されていたら if(count($tkwd) > 0 && count($dkwd) > 0){//同上 $like .= implode("or",$tkwd)." or ";//Like句一つ一つを $like .= implode("or",$dkwd);//orで配列を結合する(例:title LIKE '%東方%' or title LIKE '%アレンジ%') } } $where .= "where ".$like;//上記のLike文を組み合わせ、where句を生成 } if($sort != ""){ $where .= " order by ".$q_sort;//ソート順を指定 } //////////where句の生成ここまで/////////// $sql ="SELECT count(*) FROM `テーブル名`".$where;//該当件数をカウントするSQL文を生成 $res = mysql_query($sql); $row = mysql_fetch_array($res) ; $allrow = $row[0] ;//該当件数を$allrowに代入 if($page != ""){ $where .= " limit ".$page*$limit." , ".$limit;//リミットを指定例(41件目〜80件目など) } $sql ="SELECT * FROM `テーブル名`".$where;//該当動画を検索するSQLを生成($sqlに上書き) //print $sql;//生成されたSQLを表示 } print "<div style=\"text-align:center;\">DBに記録されている動画を検索することが出来ます。 かなとカナは区別されます。<br> <span id=\"err_msg\" style=\"display: none;color: #FF0000;\">検索ワードが未入力です。</span> <span id=\"err_msg2\" style=\"display: none;color: #FF0000;\">半角、全角スペースのみの入力は受け付けません。</span> </div> <form action=\"\" enctype=\"text/plane\" method=\"GET\" name=\"search\" style=\"display:inline;\" onsubmit=\"return formCheck();\"><!--JavaScriptで送信(簡易入力チェックの為)--> <input size=\"50\" type=\"text\" name=\"word\" value=\"";$allrow > 0 ? print htmlesc($word):"";print"\"><!--検索結果が1件以上あればテキストエリアに検索語を設置--> and<input type=\"radio\" name=\"aoro\" value=\"and\"";if($aoro=="and"){echo"checked";}elseif(!isset($aoro)){print "checked";}print"><!--送信されたラジオボタンの情報を引き継ぐ--> or<input type=\"radio\" name=\"aoro\" value=\"or\"";if($aoro=="or"){echo"checked";}print"><!--同上--> <input type=\"hidden\" name=\"page\" value=0><!-- フォームから送信されたページは0に指定--> <input type=\"submit\" value=\"検索\"> </form>"; ?>
SQL生成は大体こんなもんですね。
このままコピペで動作確認しました。
ただ、Mysql接続前は、addsl()関数内の$comment = mysql_real_escape_string($comment);の行をコメントして下さい。
読みづらいソースかも知れませんが参考になれば幸いです。