• 締切済み

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' && "; }

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

>インデックスを付けて、検索スピードを早くする方法はあるのでしょうか。 厳密にいうとない事はないです。 たとえば全文検索やキーワードを別テーブルに保存するなど また1万件前後であればMyISAMで処理すれば気にならないスピードかもしれません。 SQLのLIKE検索も、前方一致もしくは後方一致のどちらかだけなら インデックスが有効です。 いずれにしろ特定の文字が現れるをチェックするというのは SQLの得意分野ではありませんので、そういうものだと割り切って管理するしかありません

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.3

>以下のようにしてみたのですが、検索がヒットしません。 (略) >$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)
回答No.2

MySQLの場合正規表現でのチェックができるので name REGEXP '山田' のような書き方ができますが、name LIKE '%山田%'と同様 インデックスは効きませんのでデータが大きくなるとかなり スピードが落ちます。

s0217071
質問者

補足

インデックスを付けて、検索スピードを早くする方法はあるのでしょうか。 宜しくお願いします。

  • t_ohta
  • ベストアンサー率38% (5241/13712)
回答No.1

SQLで部分一致検索をする場合は like 句を使用します。 select ・・・・・・ where name like '%山田%'; といった感じで検索すると部分一致になります。

s0217071
質問者

補足

以下のようにしてみたのですが、検索がヒットしません。 どこが違うのでしょうか。宜しくお願いします。 if(!empty($name)) { $name = addslashes($name); $where = "SELECT * FROM name WHERE name LIKE %$name% && "; }

関連するQ&A