我SQL_CALC_FOUND_ROWS在Mysql SELECT语句中使用,获取SELECT返回的行数而不使用LIMIT子句.
$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]);
Run Code Online (Sandbox Code Playgroud)
在我的WinXP开发站上,它每次都会返回3/0,持续数周.当我从我的工作站使用另一台MySQL服务器时,它也返回3/0.在其他PC上,相同的代码运行正常,并返回正确的数字(例如,如果我在mysql.db表中有17条记录,则为3/17).每台XP PC都有相同的PHP/Mysql版本,过去在我的电脑上运行正常使用Mysql查询浏览器和相同的SQL查询我得到了正确的数字.
任何人都可以给我一个解决方案的想法,而无需重新安装所有?
对不起,我以前的要求非常不清楚.
小智 15
谢谢.
当我在mysql命令行上运行与你的例子类似的东西时,它会工作; 但是从php运行它失败了.第二个查询必须"了解"第一个查询,所以我想知道连接两个查询的持久性/内存被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");
Run Code Online (Sandbox Code Playgroud)
或者将其添加到.htaccess:
php_value mysql.trace_mode "0"
Run Code Online (Sandbox Code Playgroud)
再次感谢,杰里
Óla*_*age 10
您是否使用允许多个查询的MySQL查询方法.
来自MySQL文档.
要获得此行数,包括
SQL_CALC_FOUND_ROWS在SELECT语句选项,然后调用FOUND_ROWS()之后
例:
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
-> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();
Run Code Online (Sandbox Code Playgroud)
也只是为了好玩,有关于的竞争条件的大讨论FOUND_ROWS()的用法在这里.