9

すべてのサイト コードを mysql_* 関数の使用から PDO に変換しています。PDO に関する PHP ドキュメントは、私のニーズに対して明確ではありません。使用する機能を提供しますが、さまざまなシナリオでそれらを説明するために詳細には入りません。

基本的に、mysql全文検索があります:

$sql = "SELECT ... FROM search_table WHERE MATCH(some_field) AGAINST ('{$searchFor}*' IN BOOLEAN MODE)";

実際のステートメントはもっと長くなりますが、これが基本的に行うことです。

私の質問は、これをどのように PDO に組み込むかです。

プレース マーカーの周りに引用符を使用するつもりはないことはわかっていますが、AGAINST() 関数では引用符を省略しますか? それらを含めますか?それらを省略した場合、ワイルドカード記号などはどうなりますか?

$sql = $this->db->prepare("SELECT ... FROM search_table WHERE MATCH(some_field) AGAINST(:searchText IN BOOLEAN MODE");
$sql->bindValue(':searchText', $searchFor . '*');
4

2 に答える 2

14

残念ながら、これはクエリ パラメータの使用に対する奇妙な例外です (編集:ただし、各 MySQL ブランチの最新のポイント リリースではないようです。以下を参照してください)。

のパターンは、クエリ パラメータではなく、定数文字列であるAGAINST() 必要があります。SQL クエリの他の定数文字列とは異なり、MySQL の制限のため、ここではクエリ パラメータを使用できません。

検索パターンをクエリに安全に挿入するには、PDO::quote()関数を使用します。PDO の quote() 関数は、(mysql_real_escape_string() とは異なり) 引用区切り文字を既に追加していることに注意してください。

$quoted_search_text = $this->db->quote('+word +word');

$sql = $this->db->prepare("SELECT ... FROM search_table 
    WHERE MATCH(some_field) AGAINST($quoted_search_text IN BOOLEAN MODE");

@YourCommonSense からの再コメント:

そうです、私はこれを MySQL 5.5.31、5.1.68、および 5.0.96 (MySQL Sandbox は素晴らしいツールです) でテストしたところ、これらのバージョンは AGAINST() 句でクエリ パラメータを受け入れるようです動的 SQL クエリ。

私は今でも過去に存在した紛争の記憶を持っています。各ブランチの最新のポイントリリースで修正されている可能性があります。たとえば、次の関連するバグを見つけました。

于 2012-12-03T11:42:10.303 に答える
0
$sql = "SELECT * FROM tablename WHERE MATCH (fieldname) AGAINST (:searchstr IN BOOLEAN MODE) LIMIT {$per_page} OFFSET {$pg_offset}";

try {
    $database->prepare($sql);
    $database->bindParam(':searchstr', $search);
    $database->execute();
    $result_array = $database->fetch_array($sql);
} catch (Exception $e) {
    echo $e->getMessage();
}
于 2013-09-30T12:44:27.187 に答える