一尘不染

SQL_CALC_FOUND_ROWS / FOUND_ROWS()在PHP中不起作用

mysql

SQL_CALC_FOUND_ROWS在Mysql SELECT语句中使用,以获得没有LIMIT子句的SELECT返回的行数。

$sql = new mysqli('localhost', 'root', '');
$sql->select_db('mysql');
$s1 = $sql->query('select SQL_CALC_FOUND_ROWS * from db limit 0, 3');
$s2 = $sql->query('select FOUND_ROWS()');
if($row = $s2->fetch_row()) printf('%d/%d', $s1->num_rows, $row[0]);

在我的WinXP开发站上,它在几周内每次都返回3/0。当我从工作站使用另一个MySQL服务器时,它也返回3/0。在另一台PC上,相同的代码运行良好,并返回正确的数字(例如,如果我在mysql.db表中有17条记录,则返回3/17)。每台XP
PC都具有相同的PHP / Mysql版本,过去在我的PC上运行良好,并且使用Mysql Query Browser和相同的SQL查询,我得到了正确的编号。

有人可以在不重新安装全部的情况下给我解决方案的想法吗?

抱歉,我之前的要求非常不清楚。


阅读 409

收藏
2020-05-17

共1个答案

一尘不染

谢谢。

当我在mysql命令行上运行与您的示例类似的内容时,它将起作用。但是从php运行它失败。第二个查询必须“知道”第一个查询,因此我认为以某种方式将链接两个查询的持久性/内存弄乱了。

(事实证明Wordpress使用这种类型的查询进行分页-因此,我们更大的问题是当我们移至php
5.2.6时,wordpress安装中的分页突然停止了工作…最终将其跟踪到FOUND_ROWS( ))。

只是为了发布以便将来可能会遇到此问题的人发布…对我来说,它是php设置“ mysql.trace_mode”-在5.2.6中默认为“
on”,而不是以前的“ off”,并且由于某种原因使FOUND_ROWS()无法正常工作。

作为一个“修复”,我们可以将其放在每个php页面中(实际上,在一个通用的“ include”中):

ini_set("mysql.trace_mode", "0");

或将其添加到.htaccess:

php_value mysql.trace_mode "0"

再次感谢,杰里

2020-05-17