0

Sphinx フォーラムで、この問題について議論しているスレッドをいくつか見つけました。

http://sphinxsearch.com/forum/view.html?id=5974

DB接続を作成するための私の機能:

function createSphinxPdo()
{
    try {
        $options = [
            \PDO::ATTR_EMULATE_PREPARES => true,
            \PDO::ATTR_ERRMODE          => \PDO::ERRMODE_EXCEPTION
        ];
        $db      = new \PDO("mysql:host=127.0.0.1;port=3308;charset=utf8mb4", null, null, $options);
    } catch (\PDOException $e) {
        throw $e;
    }

    return $db;
}

これはうまくいきます:

$sphinxDb = createSphinxPdo();

$stmt = $sphinxDb->prepare('
SELECT *, WEIGHT() AS w FROM my_index
WHERE MATCH(\'@column "word"/1\')
');

try {
    $success = $stmt->execute();
} catch (\PDOException $e) {
    throw $e;
}

$results = $stmt->fetchAll(\PDO::FETCH_ASSOC);

echo '$results<pre>' . PHP_EOL;
print_r($results);
echo PHP_EOL . '</pre>';

結果が返されませんでした:

$stmt = $sphinxDb->prepare('
SELECT *, WEIGHT() AS w FROM my_index
WHERE MATCH(\'@column ":word"/1\')
');

try {
    $success = $stmt->execute([':word' => 'word']);
} catch (\PDOException $e) {
    throw $e;
}

$results = $stmt->fetchAll(\PDO::FETCH_ASSOC);

echo '$results<pre>' . PHP_EOL;
print_r($results);
echo PHP_EOL . '</pre>';

プリペアド ステートメントに値をバインドすると、結果が返されません。

4

1 に答える 1

2

ああ、他の文字列の途中で「バインド」することはできません。準備されたステートメントが引用を処理することが期待されるためです。

できるよ:

$stmt = $sphinxDb->prepare('
SELECT *, WEIGHT() AS w FROM my_index
WHERE MATCH(:query)
');
....
$success = $stmt->execute([':query' => '@column "word"/1']);

つまり、パラメータは拡張クエリ全体である必要があります。


他の質問と結びつけるために、配列の値に EscapeString を直接使用できます。

$success = $stmt->execute([':query' => EscapeString($query)]);

拡張クエリ構文を許可したくない場合。EscapeString がクエリ構文を処理し、pdo/mysql-client が SphixnQL の引用を処理します。

于 2015-03-23T15:00:37.530 に答える