PDOStatement::rowCount() 僅對 DELETE、INSERT、UPDATE 返回受影響行數;對 SELECT 則視資料庫驅動實作而定,大多數驅動不返回結果集總筆數。本文說明原因並提供兩種可靠替代方案。
rowCount() 可用。rowCount() 返回 0 或不準確值。$stmt = $pdo->query("SELECT * FROM large_table");
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$count = count($rows); // 正確但會佔用大量記憶體
適用:小型結果集(< 10 萬筆)。
風險:大數據集導致 PHP 記憶體耗盡。
$stmt = $pdo->query("SELECT COUNT(*) FROM large_table WHERE status = 1");
$count = $stmt->fetchColumn(); // 直接取得純量值,極快且省記憶體
優點:資料庫引擎優化計數、網路傳輸極小、記憶體固定。
注意:若需複雜條件,確保 WHERE 子句與主查詢一致。
$pdo->query("SELECT SQL_CALC_FOUND_ROWS * FROM table LIMIT 20");
$count = $pdo->query("SELECT FOUND_ROWS()")->fetchColumn();
單次掃描同時取得分頁數據與總筆數,但僅限 MySQL 且可能影響查詢優化器選擇。
rowCount()。COUNT(*) 獨立查詢。fetchAll() 配合 count()。SQL_CALC_FOUND_ROWS 或兩次查詢。