- ベストアンサー
検索機能の追加方法と速度の向上方法
- 質問文章全体の100文字程度の要約文を3つ作成し、文章の内容をまとめてください
- like検索の使用方法とインデックスの有無について教えてください
- 複数キーワードでの検索と処理方法について教えてください
- みんなの回答 (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#2-23 「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 } ?>
お礼
前回のコード修正できましたありがとうございます 配列はこうやって使うのですね。とても勉強になりました。ありがとうございました