首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PDO rowCount() 適用場景與正確獲取 SELECT 筆數的兩種做法

     編輯:PHP 相關知識

PDO rowCount() 適用場景與正確獲取 SELECT 筆數的兩種做法

PDOStatement::rowCount() 僅對 DELETE、INSERT、UPDATE 返回受影響行數;對 SELECT 則視資料庫驅動實作而定,大多數驅動不返回結果集總筆數。本文說明原因並提供兩種可靠替代方案。

為何 SELECT 不可靠?

  • 部分驅動(如 MySQL buffered query)會將完整結果集載入記憶體,此時 rowCount() 可用。
  • 大多數驅動(如 PostgreSQL、MySQL unbuffered、ODBC)採用游標分批獲取,rowCount() 返回 0 或不準確值。
  • PDO 文檔明確警告:「不應依賴 rowCount() 計算 SELECT 筆數」。

方案一:fetchAll() 計算陣列長度(簡單但費記憶體)

$stmt = $pdo->query("SELECT * FROM large_table");
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$count = count($rows); // 正確但會佔用大量記憶體

適用:小型結果集(< 10 萬筆)。
風險:大數據集導致 PHP 記憶體耗盡。

方案二:額外執行 COUNT(*) 查詢(推薦,效能最佳)

$stmt = $pdo->query("SELECT COUNT(*) FROM large_table WHERE status = 1");
$count = $stmt->fetchColumn(); // 直接取得純量值,極快且省記憶體

優點:資料庫引擎優化計數、網路傳輸極小、記憶體固定。
注意:若需複雜條件,確保 WHERE 子句與主查詢一致。

進階技巧:SQL_CALC_FOUND_ROWS(MySQL 特有)

$pdo->query("SELECT SQL_CALC_FOUND_ROWS * FROM table LIMIT 20");
$count = $pdo->query("SELECT FOUND_ROWS()")->fetchColumn();

單次掃描同時取得分頁數據與總筆數,但僅限 MySQL 且可能影響查詢優化器選擇。

總結建議

  1. 永遠不要對 SELECT 使用 rowCount()。
  2. 首選 COUNT(*) 獨立查詢。
  3. 極小結果集可用 fetchAll() 配合 count()。
  4. 分頁場景考慮 SQL_CALC_FOUND_ROWS 或兩次查詢。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved