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

时间:2009-03-23 16:22:24

标签: php mysql

我在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查询浏览器,我得到正确的数字。

有没有人能给我一个解决方案的想法,而无需重新安装所有?

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

6 个答案:

答案 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