我在Mysql SELECT语句中使用SQL_CALC_FOUND_ROWS
来获取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]);
在我的WinXP开发站上,它每次都会返回3/0,持续数周。当我从我的工作站使用另一台MySQL服务器时,它也返回3/0。 在其他PC上,相同的代码运行正常,并返回正确的数字(例如,如果我在mysql.db表中有17条记录,则为3/17)。每台XP PC都有相同的PHP / Mysql版本,它在我的电脑上运行得很好 使用具有相同SQL查询的Mysql查询浏览器,我得到正确的数字。
有没有人能给我一个解决方案的想法,而无需重新安装所有?
抱歉,我以前的要求非常不清楚。
答案 0 :(得分:14)
谢谢。
当我在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"
再次感谢, 杰里
答案 1 :(得分:9)
您使用的MySQL查询方法是否允许多次查询。
来自MySQL文档。
要获取此行计数,请在SELECT语句中包含
SQL_CALC_FOUND_ROWS
选项,然后再调用FOUND_ROWS()
示例:
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
-> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();
同样只是为了好玩,有关FOUND_ROWS()
使用here.
答案 2 :(得分:2)
另一种方法是使用PHP手册中所述的mysqli_multi_query,传递包含用分号分隔的SQL_CALC_FOUND_ROWS和FOUND_ROWS的查询
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT SQL_CALC_FOUND_ROWS * FROM db limit 0, 3;";
$query .= "SELECT FOUND_ROWS()";
/* execute multi query */
if ($mysqli->multi_query($query)) {
do {
/* store first result set */
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
printf("%s\n", $row[0]);
}
$result->free();
}
/* print divider */
if ($mysqli->more_results()) {
printf("-----------------\n");
}
} while ($mysqli->next_result());
}
/* close connection */
$mysqli->close();
?>
答案 3 :(得分:0)
嗯,这是与php 5.2.6捆绑的mysql php扩展的问题。 Mysqli运行正常,另外还有一个php版本。 对不起噪音和不明确的问题。
如果您遇到同样的问题,我的建议是重新安装PHP或更改版本。
答案 4 :(得分:0)
最快的解决方案是查询您的实际查询,如下所示:
SELECT SQL_CALC_FOUND_ROWS * FROM (SELECT whatever FROM whatever WHERE whatever LIMIT whatever) ax;
select FOUND_ROWS();
现在您将获得正确的结果。我认为主要原因是SQL_CALC_FOUND_ROWS
主要跟踪找到的行(即没有LIMITS
)而不是返回的行。
答案 5 :(得分:0)
我有同样的问题。解决方案很愚蠢,我使用的是$wpdb->query
而不是$wpdb->get_var
。所以你想做
$wpdb->get_var('select FOUND_ROWS()');
如果您使用的是WordPress