【发布时间】:2015-01-21 13:52:02
【问题描述】:
我们正在使用 Sphinx 实时索引并通过 PHP 的 mysqli 驱动程序与它们对话。单个查询工作正常,但我们正在尝试使用 multi_query 实现批量更新过程。
查询如下所示:
UPDATE rt SET rank = 1 WHERE id = 881523;
UPDATE rt SET rank = 2 WHERE id = 881727;
UPDATE rt ...
(这是在用分号内爆之后,为了便于阅读添加了换行符)
我们得到的错误是:
sphinxql: syntax error, unexpected ';', expecting $end near ';UPDATE rt SET rank = 2 WHERE id = 881727'
如果我将查询复制/粘贴到 mysql CLI 客户端,没问题:
mysql> UPDATE rt SET rank = 1 WHERE id = 881523;UPDATE rt SET rank = 2 WHERE id = 882884;UPDATE rt SET rank = 3 WHERE id = 881727;
Query OK, 1 row affected (0.01 sec)
Query OK, 1 row affected (0.01 sec)
Query OK, 1 row affected (0.01 sec)
这是 PHP 代码。 $conn 是来自 http://foolcode.github.io/SphinxQL-Query-Builder/ 的 Connection 类的一个实例,但我们正在使用 $conn->getConnection() 直接处理底层 mysqli 连接:
$query = implode(';', $queries);
if($conn->getConnection()->multi_query($query)) {
do { }
while($conn->getConnection()->next_result());
}
if($conn->getConnection()->error) {
error_log("query: " . $query);
error_log($conn->getConnection()->error);
die();
}
我尝试使用 SphinxQL 查询生成器连接类中的 multiQuery() 函数,结果相同。
声称分号是意外的错误消息对我来说似乎是最奇怪的部分。如果它想要 $end,这是否意味着它不支持多个查询?如果它愿意通过 mysql 客户端进行相同的查询,为什么不呢?
$php -v
PHP 5.5.20 (cli) (built: Dec 29 2014 18:02:29)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies
【问题讨论】:
-
我看到你使用了
implode(),但是在 imploding 之后你是否在$query的末尾添加了;来完成 SQL 字符串? -
我试过有无,两种方式都没有区别。我注意到很多地方的示例代码都没有在最后添加一个,所以我认为它是可选的。
-
您是否考虑过使用准备好的语句并简单地迭代更新?我的猜测是这样你会获得更好的性能,因为查询不需要每次都重新规划。
-
记住这是 sphinx(尽管这个问题被 mysql 标记) - sphinx 不支持协议准备语句。 (仅限客户端模拟的)
-
找到这个页面:sphinxsearch.com/docs/current/sphinxql-multi-queries.html。似乎表明虽然某些类型的查询支持它,但 UPDATE 不是其中之一。
标签: php mysql mysqli sphinx sphinxql