6

我目前正在为如何SQL_CALC_FOUND_ROWS使用准备好的语句来实现而摸不着头脑。

我正在编写一个分页类,显然我想将 LIMIT 添加到查询中,但还要找到总行数。

这是相关课程的一个示例。

$query = "select SQL_CALC_FOUND_ROWS id,title,location,salary,employer from jobs where region=38 limit 0,3";

if($stmt = $connection->prepare($query)) {
    $stmt->execute()or die($connection->error); //execute query
    $stmt->bind_result($id,$title,$location,$salary,$employer,$image);
    while($stmt->fetch()){
        $jobs[$x]['id']=$id;
        $jobs[$x]['title']=$title;
        $jobs[$x]['location']=$location;
        $jobs[$x]['salary']=$salary;
        $jobs[$x]['employer']=$employer;
        $jobs[$x]['image']=$image;
        $x++;
    }
    $stmt->close();//close statement
}

我对如何获得SQL_CALC_FOUND_ROWS实际价值感到有些困惑?我曾想过添加类似的内容:

$stmt->store_result();
$count=$stmt->num_rows;

但这只给出了一个基于 LIMIT 的数字,所以在上面的例子中它是 3 而不是它应该是完整的 6。

4

2 回答 2

9

设法弄清楚了,我将在下面为任何对未来感兴趣的人详细说明我的答案。

原始代码

$query="select SQL_CALC_FOUND_ROWS id,title,location,salary,employer from jobs where region=38 limit 0,3";

if($stmt = $connection->prepare($query)) {
        $stmt->execute()or die($connection->error); //execute query
        $stmt->bind_result($id,$title,$location,$salary,$employer,$image);
        while($stmt->fetch()){
            $jobs[$x]['id']=$id;
            $jobs[$x]['title']=$title;
            $jobs[$x]['location']=$location;
            $jobs[$x]['salary']=$salary;
            $jobs[$x]['employer']=$employer;
            $jobs[$x]['image']=$image;
            $x++;
        }
        $stmt->close();//close statement
    }

更新代码

$query="select SQL_CALC_FOUND_ROWS id,title,location,salary,employer from jobs where region=38 limit 0,3";

if($stmt = $connection->prepare($query)) {
        $stmt->execute()or die($connection->error); //execute query
        $stmt->bind_result($id,$title,$location,$salary,$employer,$image);
        while($stmt->fetch()){
            $jobs[$x]['id']=$id;
            $jobs[$x]['title']=$title;
            $jobs[$x]['location']=$location;
            $jobs[$x]['salary']=$salary;
            $jobs[$x]['employer']=$employer;
            $jobs[$x]['image']=$image;
            $x++;
        }
            //get total number of rows.
            $query="SELECT FOUND_ROWS()";
            $stmt = $connection->prepare($query);
            $stmt->execute();
            $stmt->bind_result($num);
            while($stmt->fetch()){
                $count=$num;
            }

        $stmt->close();//close statement
    }

可能可以通过另一种方式做得更好,但似乎在网上的任何地方都找不到任何好的例子,这很有效!

于 2012-10-24T13:50:59.110 回答
0

如果你想得到SQL_CALC_FOUND_ROWS你需要SELECT FOUND_ROWS()在 MySQL 中运行查询的结果。为此,您不需要准备好的声明。你可以只使用query()方法。

$connection->query('SELECT FOUND_ROWS()')->fetch_row()[0];

如果您使用的是 mysqlnd(如果您使用的是受支持的 PHP 版本之一,则应该使用它),您可以使您的代码更简单。

// Enable error reporting instead of using or die($connection->error)
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$query = "SELECT SQL_CALC_FOUND_ROWS id,title,location,salary,employer 
    FROM jobs 
    WHERE region=38 
    LIMIT 0,3";
$stmt = $connection->prepare($query);
$stmt->execute();
$jobs = $stmt->fetch_all(MYSQLI_ASSOC);

// There is no need for prepared statement when using FOUND_ROWS()
$connection->query('SELECT FOUND_ROWS()')->fetch_row()[0];

正如你所看到的,它使用起来fetch_all()while循环更干净。

警告

SQL_CALC_FOUND_ROWS 查询修饰符和随附的 FOUND_ROWS() 函数自 MySQL 8.0.17 起已弃用,并将在未来的 MySQL 版本中删除。作为替代,考虑使用 LIMIT 执行您的查询,然后使用 COUNT(*) 且没有 LIMIT 的第二个查询来确定是否还有其他行。例如,代替这些查询:

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

请改用这些查询:

SELECT * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT COUNT(*) WHERE id > 100;
于 2019-12-27T21:25:14.780 回答