在PHP 中,使用PDO(PHP Data Objects)進行數據庫操作是非常常見的一種方式。通過PDO 提供的API,我們可以輕鬆地進行數據庫連接、查詢和操作。而在進行數據查詢時,分頁查詢是一個非常常見的需求。本文將介紹如何使用PDOStatement::rowCount來實現分頁查詢功能。
在PDO 中, PDOStatement::rowCount方法返回受當前SQL 查詢影響的行數。對於SELECT查詢, rowCount返回的是查詢結果中的行數,而對於INSERT 、 UPDATE或DELETE操作,返回的是受到影響的行數。
對於分頁查詢來說,我們通常需要知道數據庫中滿足查詢條件的總記錄數,以便計算總頁數。而PDOStatement::rowCount則是獲取總記錄數的一種簡單方法。
分頁查詢的基本思路是:通過LIMIT和OFFSET來控制查詢的記錄範圍,同時使用rowCount獲取符合條件的總記錄數,從而計算出總頁數。這樣可以實現分批次加載數據,減少一次性加載大量數據的開銷。
分頁查詢的常見步驟如下:
獲取總記錄數:通過查詢符合條件的記錄總數,利用PDOStatement::rowCount獲取記錄數量。
計算總頁數:根據總記錄數和每頁顯示的記錄數來計算出總頁數。
獲取當前頁數據:根據當前頁碼和每頁顯示的記錄數,使用LIMIT和OFFSET來獲取當前頁的數據。
下面是一個簡單的分頁查詢實現示例。假設我們有一個數據庫表users ,其中包含用戶的基本信息。我們將使用PDOStatement::rowCount獲取記錄的總數,並通過分頁查詢來加載數據。
<?php
// 數據庫連接設置
$host = 'localhost';
$dbname = 'your_database';
$username = 'root';
$password = '';
// 創建 PDO 實例
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo "Connection failed: " . $e->getMessage();
exit;
}
// 獲取當前頁碼,默認為第一頁
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$limit = 10; // 每頁顯示 10 條記錄
$offset = ($page - 1) * $limit; // 計算偏移量
// 獲取總記錄數
$stmt = $pdo->query("SELECT COUNT(*) FROM users");
$totalRecords = $stmt->fetchColumn(); // 使用 rowCount 獲取總記錄數
$totalPages = ceil($totalRecords / $limit); // 計算總頁數
// 獲取當前頁的數據
$stmt = $pdo->prepare("SELECT * FROM users LIMIT :limit OFFSET :offset");
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
// 輸出當前頁的數據
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo 'ID: ' . $row['id'] . ' | Name: ' . $row['name'] . '<br>';
}
// 輸出分頁信息
echo "<br>Page $page of $totalPages<br>";
// 輸出分頁鏈接
if ($page > 1) {
echo '<a href="?page=' . ($page - 1) . '">Previous</a> ';
}
if ($page < $totalPages) {
echo '<a href="?page=' . ($page + 1) . '">Next</a>';
}
?>
數據庫連接:我們通過PDO創建數據庫連接。
獲取總記錄數:首先通過SELECT COUNT(*) FROM users查詢數據庫中的記錄總數,然後使用fetchColumn()獲取結果的第一個字段(即總記錄數)。
分頁計算:我們根據當前頁碼$page和每頁顯示的記錄數$limit來計算出偏移量$offset 。總頁數則通過ceil()函數計算得出。
查詢當前頁數據:通過LIMIT和OFFSET來查詢當前頁的數據。
分頁輸出:根據總頁數輸出分頁鏈接,用戶可以點擊鏈接跳轉到前一頁或後一頁。
性能優化:在大數據量情況下,使用rowCount來獲取總記錄數可能會影響性能。如果數據表非常大,可以考慮使用其他優化方案,如只查詢需要的數據並使用緩存。
SQL 注入防範:在上面的代碼中,我們通過prepare和bindParam預處理SQL 查詢,確保避免SQL 注入的風險。