簡體   English   中英

如何使用准備好的語句獲取 SQL_CALC_FOUND_ROWS 值?

[英]How to get the SQL_CALC_FOUND_ROWS value using prepared statements?

我目前正在SQL_CALC_FOUND_ROWS如何使用准備好的語句實現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實際值感到有點SQL_CALC_FOUND_ROWS 我曾想過添加以下內容:

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

但這僅給出了基於 LIMIT 的數字,因此在上面的示例中,它應該是 3 而不是完整的 6。

設法弄清楚了,我將在下面為對未來感興趣的任何人詳細說明我的答案。

原始代碼

$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
    }

可能可以用另一種方式做得更好,但似乎無法在網上的任何地方找到任何好的例子,這很有效!

如果您想獲得SQL_CALC_FOUND_ROWS的結果,您需要在 MySQL 中運行查詢SELECT FOUND_ROWS() 為此,您不需要准備好的語句。 您可以只使用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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM