プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (4件)

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



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

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

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

>以下のようにしてみたのですが、検索がヒットしません。


(略)
>$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を渡せばいいと思う。
    • good
    • 0

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



name REGEXP '山田'

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

この回答への補足

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

補足日時:2013/01/08 18:02
    • good
    • 0

SQLで部分一致検索をする場合は like 句を使用します。


select ・・・・・・ where name like '%山田%';
といった感じで検索すると部分一致になります。

この回答への補足

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

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

補足日時:2013/01/08 17:57
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!