SphinxQL 不适用于准备好的语句?
SphinxQL doesn't work with prepared statements?
我在 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>';
当我将值绑定到准备好的语句时,没有返回任何结果。
啊,不能在其他字符串中间'bind'。因为它期望准备好的语句会处理引用。
你可以这样做:
$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 引用。
我在 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>';
当我将值绑定到准备好的语句时,没有返回任何结果。
啊,不能在其他字符串中间'bind'。因为它期望准备好的语句会处理引用。
你可以这样做:
$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 引用。