首页 > 解决方案 > 如何将 PDO bindParam 用于 SphinxSearch 3?

问题描述

我最近在 Ubuntu 18 上安装了 SphinxSearch 3.1.1,目前正在使用 PHP 7.2 创建一段代码。我无法使 bindParam 工作。

这是我的代码:

$mytest = "hello";
$query = $conn->prepare("SELECT *, weight() FROM test WHERE MATCH('\"@title :mytest \"/1')");
$query->bindParam(':mytest', $mytest, PDO::PARAM_STR);
$query->execute();

当我尝试执行它时,结果为空。

但是,当我尝试直接将 $mytest 放入语句中时,我得到了预期的结果

$query = $conn->prepare("SELECT *, weight() FROM test WHERE MATCH('\"@title". $mytest ."\"/1')");

这是否意味着 sphinx 不支持 MATCH() 函数中的 bindParam?还是我在这里错过了其他东西。

标签: pdosphinxsphinxql

解决方案


来自http://php.net/manual/en/pdo.prepare.php的注释

参数标记只能表示完整的数据文字。无论是文字部分、关键字部分、标识符部分还是任意查询部分,都不能使用参数进行绑定。

即您试图在字符串文字中进行绑定。实际上,PHP(或 mysql 服务器)会在值周围添加 ' 来生成语句。

...实际上会以 sphinxql 查询结束:

SELECT *, weight() FROM test WHERE MATCH('"@title 'hellow' "/1')

这显然是错误的!


而是绑定整个字符串文字。

$query = $conn->prepare("SELECT *, weight() FROM test WHERE MATCH(:mytest)");
$query->bindParam(':mytest',  '"@title '.$mytest.'"/1', PDO::PARAM_STR);

尽管这看起来像是一个无效的 Sphinx '扩展语法'查询,但 @field 限定符应该在法定人数之外,

$query->bindParam(':mytest',  '@title "'.$mytest.'"/1', PDO::PARAM_STR);

推荐阅读