こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

投稿日時 - 2013-01-08 17:05:05

QNo.7881846

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

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

厳密にいうとない事はないです。
たとえば全文検索やキーワードを別テーブルに保存するなど
また1万件前後であればMyISAMで処理すれば気にならないスピードかもしれません。

SQLのLIKE検索も、前方一致もしくは後方一致のどちらかだけなら
インデックスが有効です。

いずれにしろ特定の文字が現れるをチェックするというのは
SQLの得意分野ではありませんので、そういうものだと割り切って管理するしかありません

投稿日時 - 2013-01-08 22:29:30

ANo.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を渡せばいいと思う。

投稿日時 - 2013-01-08 18:23:54

ANo.2

MySQLの場合正規表現でのチェックができるので

name REGEXP '山田'

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

投稿日時 - 2013-01-08 17:49:41

補足

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

投稿日時 - 2013-01-08 18:02:37

ANo.1

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

投稿日時 - 2013-01-08 17:10:03

補足

以下のようにしてみたのですが、検索がヒットしません。
どこが違うのでしょうか。宜しくお願いします。

if(!empty($name)) {
$name = addslashes($name);
$where = "SELECT * FROM name WHERE name LIKE %$name% && ";
}

投稿日時 - 2013-01-08 17:57:38

あなたにオススメの質問