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

2022-08-30 22:08:50

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

$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中有17条记录,则返回正确的数字.db 17)。每个XP PC都有相同的PHP / Mysql版本,并且过去在我的PC上运行良好 使用Mysql查询浏览器具有相同的SQL查询,我得到了正确的数字。

任何人都可以给我一个解决方案的想法,而不重新安装所有?

对不起,我之前的要求非常不清楚。


答案 1

谢谢。

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

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

只是为了将来可能遇到这种情况的人发帖......对我来说,这是php设置“mysql.trace_mode” - 这在5.2.6中默认为“on”,而不是像以前那样“off”,并且由于某种原因阻止了FOUND_ROWS()工作。

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

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

或者将它添加到 .htaccess 中:

php_value mysql.trace_mode "0"

再次感谢,杰瑞


答案 2

您是否正在使用允许多个查询的MySQL查询方法。

来自 MySQL 文档。

若要获取此行计数,请在 SELECT 语句中包含一个选项,然后调用SQL_CALC_FOUND_ROWSFOUND_ROWS()

例:

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
    -> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();

同样只是为了好玩,这里有一个关于 使用的竞争条件的精彩讨论FOUND_ROWS()


推荐