pdo - 如何将 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?还是我在这里错过了其他东西。
解决方案
来自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);
推荐阅读
- php - 如何通过对一个数据表的多个查询获取多个表数据
- c++ - OpenGL,纹理输出为纯色
- javascript - Reducer 不断返回一个空数组
- mongodb - [StitchServiceError: Error: ObjectId in 必须是 12 个字节的单个字符串或 24 个十六进制字符的字符串]
- replace - 替代:替换评估
- squarespace - 索引页的 Squarespace 索引页
- delphi - AllocConsole、SetConsoleCtrlHandler 防止终止
- python - 是否有通过列表替换值的功能?
- html - 获取错误标签以与 flex-wrap 中的输入对齐
- php - 如何在表单提交 %5B%5D 时使用 get 方法 php 对 url 进行编码