0

我在 Sphinx 论坛上发现了几个讨论这个问题的帖子:

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

我创建数据库连接的功能:

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 将负责 SpixnQL 引用。

于 2015-03-23T15:00:37.530 回答