[英]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.