0

Sphinx PHP API コードで次の関数を見つけました。

function sphinxapi_EscapeString($string)
{
    $from = ['\\', '(', ')', '|', '-', '!', '@', '~', '"', '&', '/', '^', '$', '=', '<'];
    $to   = ['\\\\', '\(', '\)', '\|', '\-', '\!', '\@', '\~', '\"', '\&', '\/', '\^', '\$', '\=', '\<'];

    return str_replace($from, $to, $string);
}

ただし、クエリで特定の文字を含む文字列を使用すると、Sphinx が例外をスローするため、正しく機能していないようです。

例は引用文字"です。EscapeString()その前にバックスラッシュ\を置きますが、Sphinx は次のような例外をスローします。

致命的なエラー:メッセージ「SQLSTATE[42000]: 構文エラーまたはアクセス違反: 1064 インデックス my_index: 構文エラー、予想外の $end 付近の ''' 内のメッセージを含む例外 'PDOException' がキャッチされていません。

さらに 2 つのバックスラッシュを追加して にすると\\\"、エラーはスローされません。

ここでの取引は何ですか?機能しないのはなぜEscapeString()ですか?

4

1 に答える 1

1

正確なコードを共有していませんが、この関数を呼び出すだけで、SQL ルールに従ってエスケープする必要があるのだろうかと思います。

EscapeStringクエリをエスケープして、拡張構文文字をエスケープします。

Query/AddQuery関数はクエリを直接受け取るため、API で必要なのはこれだけです。

ただし、SphinxQL では、クエリ文字列は SQL ステートメント内にあるため、ステートメントに埋め込む前に文字列を「SQL 文字列」エスケープする必要があります (EscapeString のようにエスケープするかどうかに関係なく)。PDO は、準備済みステートメントを使用する場合は自動的に実行できますが、それ以外の場合は PDOquote関数を使用します。

(SELECT ... MATCH('one \" ')スラッシュが SQL パーサーによって「飲み込まれ」、フル テキスト クエリ パーサーに到達しないため、クエリのようなクエリは適切にエスケープされません)

于 2015-03-23T11:06:03.160 に答える