電子書籍の厳選無料作品が豊富!

プログラム初心者です

検索機能をつける方法を教えてください


質問1
like検索のLIKE “%value%”でもインデックスを使う方法はありますか?それともインデックスを使わなくても十分速いのでしょうか?


質問2
複数キーワードをスペースをはさんで検索してきた場合、どうやって処理すればいいのでしょうか?
and検索のみです

例えばこんな文字の場合です
$search = 'ああ いい うう';

$recordSet2 = mysqli_query($link,sprintf('SELECT * FROM table where name LIKE "%%%s%%"',
$search
));

while($row = mysqli_fetch_assoc($recordSet2)){
?>
<tr>
<td><?php print $row['name']; ?></td>
</tr>
<?php
}
?>



よろしくお願いします

A 回答 (1件)

【訂正】



前回の回答に不備がありましたので訂正します。

$result = mysqli_query($link, sprintf(
'SELECT name, mail FROM table WHERE name="%s" OR mail="%s"',
mysqli_real_escape_string($link, $name),
mysqli_real_escape_string($link, $mail)
));
while ($row = mysqli_fetch_assoc($result)) {
if ($name === $row['name']) { $name_duplicated = true; }
if ($mail === $row['mail']) { $mail_duplicated = true; }
}
if (isset($name_duplicated, $mail_duplicated)) {
throw new Exception('その名前とメールアドレスは既に登録されています');
} elseif ($name_duplicated) {
throw new Exception('その名前は既に登録されています');
} elseif ($mail_duplicated) {
throw new Exception('そのメールアドレスは既に登録されています');
}

として最大で2件チェックするようにしないと正しい結果が得られる保証がありません。


【回答1】

「LIKE がワイルドカードキャラクタで始まらない定数文字列の場合、インデックスはLIKE比較にも使用できます。」とMySQL公式マニュアルにあるので、裏を返せば「%value%」ではインデックスは使えないということです。


【回答2】

実はこっちでサラっと解説してますw
http://qiita.com/mpyw/items/b00b72c5c95aac573b71 …

「q」という名前でフォームから受け取るとすると下記のようなソースになります。
(ネスト多いので全角スペースでインデントしました)

if (isset($_REQUEST['q']) && is_string($_REQUEST['q'])) {
 $regex = "/[\\x0-\x20\x7f\xc2\xa0\xe3\x80\x80]++/u";
 if ($keywords = preg_split($regex, $_REQUEST['q'], -1, PREG_SPLIT_NO_EMPTY)) {
  foreach ($keywords as &$keyword) {
   $keyword = sprintf("`name` = '%s'", '%' . addcslashes($keyword, '\\_%') . '%');
  }
  unset($keyword);
  $result = mysqli_query($link, 'SELECT * FROM `table` WHERE ' . implode(' AND ', $keywords));
 }
}

while(isset($result) and $row = mysqli_fetch_assoc($result)){
?>
<tr>
<td><?php print $row['name']; ?></td>
</tr>
<?php
}
?>
    • good
    • 0
この回答へのお礼

前回のコード修正できましたありがとうございます

配列はこうやって使うのですね。とても勉強になりました。ありがとうございました

お礼日時:2014/01/25 15:50

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