- ベストアンサー
POSTした文字列をSQLコマンドに整形したい
- PHPを使用して、検索フォームに入力した単語に該当するtitleをSQLで検索する方法を作成したいです。
- 入力した単語をスペースで区切り、配列に変換し、SQLの検索条件として使用するコードを教えてください。
- 正規表現を使用して単語をスペースで区切り、配列に変換し、SQLの検索条件として使用する方法を知りたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
とりあえずこんな感じでどうでしょう。 ・先頭と末尾のスペースをはずす ・文中のスペースで分離する ・一個以上の要素がある場合はORでつなぐ なお、LIKEで調べるならワイルドカードが必要ですが、前方後方一致は インデックスが有効ではないためSQLとしてはスピードが期待できません きちんとやるなら専用の検索フィールドをつくり全文検索するなど対応が 必要かもしれません <?PHP mb_internal_encoding("UTF8"); $key=" php 連想配列\t作成 怪しい'\"文字列 "; $pattern="/^[\s ]+|[\s ]+$/u"; $key=preg_replace($pattern,"",$key); $pattern="/[\s ]+/u"; $keys_array=preg_split($pattern,$key); $keys=""; foreach($keys_array as $val){ if($keys!="") $keys.=" OR "; $keys.="`title` LIKE '%".$val."%'"; // $keys.="`title` LIKE '%".mysql_real_escape_string($val)."%'"; } $keys="(".$keys.")"; print $keys; ?> mysql_real_escape_string()は最低でもした方がいいですが、テストのため はずしてあります
その他の回答 (2)
- bm_hiro
- ベストアンサー率51% (200/388)
誰もツッコまないけど sprintf 使ってる意味が分からないでいる俺がいます。 そして、同じ事をしているのに あえて別の書き方をしてみます。 where句 以降の$keyの部分。 foreach($keys_array as $i => $val){ $keys_array[$i] ="`title` LIKE '%".$val."%'"; } $key = "(" . implode(" or " , $keys_array) . ")"; あと蛇足。 同じ検索文字入れる人はいないと思うけど、一応 対策するなら これも入れたほうがいいかも。 $keys_array = array_unique($keys_array);
お礼
参考になります。array_uniqueは知りませんでした。 sprintfは使わなくてもよろしいのですね。 ありがとうございます。
まず、 sprintf("SELECT * FROM dbname WHERE (title like".$keys.") ORDER BY id"); このSQLだと数値を入れられたら全件対象になってしまう気がするのですが。 それは置いておいて、 これを実行するとしたら、大体こんな感じです。 *各関数はPHPマニュアルで調べてみてください。 http://www.php.net/ >$keyから全角、半角問わず、スペースで3つの文字列を区切り ・全角スペースを半角スペースに置換する *str_replace()を使うと一行で書けます ・半角スペースをセパレータにして、配列に格納する *explode()を使うと、一行で ここまでで、 $keys[0]にphp $keys[1]に連想配列 $keys[2]に作成 が格納されます。 これを "php"or "連想配列" or"作成" という文字列にしたいのであれば、 ・配列をループさせて、ダブルクォートではさみ、後ろにorをつける ・最後の要素の後にはorを付けない とすればいいので for(配列を要素の回数回すループ条件){ $str = '"'.$keys[$i],'"'; if(最後の要素では無いことを判定する条件 *count()を使うと一行で書ける){ $str = $str . " or "; } } という感じになります。 PHPには単純な置換や分割の場合、 正規表現を使うこと無く実装出来る関数が結構あるので 逆引きリファレンスを一冊持っておくと便利ですよ。
お礼
ありがとうございます。 専用の関数があったのですね。 参考にさせていただきます。
お礼
ありがとうございます。 >なお、LIKEで調べるならワイルドカードが必要ですが、前方後方一致は インデックスが有効ではないためSQLとしてはスピードが期待できません きちんとやるなら専用の検索フィールドをつくり全文検索するなど対応が 必要かもしれません このあたりは全く知りませんでした。 教えていただき、本当にありがとうございます。