- 締切済み
PHPで部分一致検索をしたい
PHPの勉強をしています。 簡単なPHPを作成し、MySQLからデータを持ってきたいのですが、 上手くいきません。 完全一致で入力すれば、該当するものがヒットしますが、部分一致となると何も表示されなくなってしまいます。 検索文字列 = 山田太郎 →検索OK 検索文字列 = 山田 →検索NG となります。 山田と入力すれば、該当するデータを全て表示するにはどうすればいいのでしょうか。 宜しくお願いします。 //名前 if(!empty($name)) { $name = addslashes($name); $where = "name = '$name' && "; } else if(preg_match("/^(?!ab$)[a-z0-9]+$/", $name)) { $name = addslashes($name); $where = "name = '$name' && "; }
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- yambejp
- ベストアンサー率51% (3827/7415)
>インデックスを付けて、検索スピードを早くする方法はあるのでしょうか。 厳密にいうとない事はないです。 たとえば全文検索やキーワードを別テーブルに保存するなど また1万件前後であればMyISAMで処理すれば気にならないスピードかもしれません。 SQLのLIKE検索も、前方一致もしくは後方一致のどちらかだけなら インデックスが有効です。 いずれにしろ特定の文字が現れるをチェックするというのは SQLの得意分野ではありませんので、そういうものだと割り切って管理するしかありません
- agunuz
- ベストアンサー率65% (288/438)
>以下のようにしてみたのですが、検索がヒットしません。 (略) >$where = "SELECT * FROM name WHERE name LIKE %$name% && "; 書くとしたら、likeのあとは文字列なんだから単引用符で括って $where = "SELECT * FROM `name` WHERE (`name` LIKE '%$name%')"; (and は次の条件を付加するときに追加した方がベター) じゃないんですかねぇ。それ以前にaddslashesというのはどういう意図なのか・・・。MySQL関数ならmysql_real_escape_stringを使うべき。 まぁそれ以前にMySQL関数自体が非推奨なんだから、プリペアドステートメント(が利用できるPDOなど)を使って $where = "SELECT * FROM `name` WHERE (`name` LIKE ? )"; としてからbindParamで$nameを渡せばいいと思う。
- yambejp
- ベストアンサー率51% (3827/7415)
MySQLの場合正規表現でのチェックができるので name REGEXP '山田' のような書き方ができますが、name LIKE '%山田%'と同様 インデックスは効きませんのでデータが大きくなるとかなり スピードが落ちます。
- t_ohta
- ベストアンサー率38% (5241/13712)
SQLで部分一致検索をする場合は like 句を使用します。 select ・・・・・・ where name like '%山田%'; といった感じで検索すると部分一致になります。
補足
以下のようにしてみたのですが、検索がヒットしません。 どこが違うのでしょうか。宜しくお願いします。 if(!empty($name)) { $name = addslashes($name); $where = "SELECT * FROM name WHERE name LIKE %$name% && "; }
補足
インデックスを付けて、検索スピードを早くする方法はあるのでしょうか。 宜しくお願いします。