PHPに惚れました

今でも多分惚れてます。

フォームから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);の行をコメントして下さい。

読みづらいソースかも知れませんが参考になれば幸いです。