MYSQLでAND,OR,NOT検索を行うためのWHERE文を返す関数を書いた。引数$wordにgoogle検索のようなキーワードを入れる。(例:「ガンプラ ガンダム」「フィギュア -スケート」「猫 | ネコ」)
半角若しくは全角スペースで単語を分けるとする。単語の前に半角ハイフンを付け加えるとNOT文とし、「|」もしくは「or」でOR検索とする。「|」「or」も前後をスペースで一文字空けることとする。
function SearchWord($word){
//条件無し対策として必ず真になるしかけ
$where=”WHERE 1″;
//全角空白を半角空白に変換
$word=str_replace(“ ”, ” “,$word);
//空白文字で検索ワードを分割
$word_array=preg_split(“/[ ]+/”,$word,-1,PREG_SPLIT_NO_EMPTY);
//ワードごとに検索条件を追加
$or=false;
foreach($word_array as $word_array_element){
if($word_array_element==”|”||!strcasecmp($word_array_element,”or”)){
$or=true;
continue;
}
//notキーワード
$not=substr($word_array_element,0,1)==’-‘;
$wordelement=$not?’ NOT':'';
$trimword=$not?substr($word_array_element,1,strlen($word_array_element)-1):$word_array_element;
$andor=$or?’ OR':’ AND';
$where .= $andor.” `”.カラム名.”`”.$wordelement.” LIKE ‘%{$trimword}%'”;
$or=false;
}
return $where;
}
返り値はSQL文のWHERE部分のテキスト。