如何将 PDO bindParam 用于 SphinxSearch 3?

How to use PDO bindParam for 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?还是我在这里遗漏了其他东西。

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

Parameter markers can represent a complete data literal only. Neither part of literal, nor keyword, nor identifier, nor whatever arbitrary query part can be bound using parameters.

即您试图在字符串文字中进行绑定。在实际意义上 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 'extended syntax' 查询,@field 限定符应该在法定人数之外,

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