【问题标题】:How to use PDO bindParam for SphinxSearch 3?如何将 PDO bindParam 用于 SphinxSearch 3?
【发布时间】:2019-02-04 10:23:05
【问题描述】:

我最近在 Ubuntu 18 上安装了 SphinxSearch 3.1.1,目前正在使用 PHP 7.2 创建一个 sn-p 代码。我无法使 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?还是我在这里遗漏了其他东西。

【问题讨论】:

  • 顺便说一句,当得到“结果为空”时 - 您应该检查 SHOW META 和/或 SHOW WARNINGS / SHOW ERRORS 以实际诊断问题:)跨度>

标签: pdo sphinx sphinxql


【解决方案1】:

来自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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-13
    • 2013-07-27
    • 2012-04-09
    • 2014-07-28
    • 2014-05-27
    • 2023-03-18
    • 2012-09-05
    • 1970-01-01
    相关资源
    最近更新 更多