在開發基於MySQL 的PHP 應用時,為了提高查詢效率和數據呈現的用戶體驗,我們通常會使用分頁查詢來分段加載數據。相比直接使用拼接SQL 的方式,使用mysqli_stmt::prepare函數不僅能有效防止SQL 注入,還能提升代碼的可讀性與維護性。本文將帶你詳細了解如何通過mysqli_stmt::prepare實現分頁查詢,並結合示例加以解析。
分頁查詢的核心在於SQL 的LIMIT子句,其語法為:
SELECT * FROM table_name LIMIT offset, page_size;
其中:
offset :偏移量,表示從第幾條記錄開始讀取。
page_size :每頁顯示的記錄數。
使用mysqli_stmt::prepare函數時,由於LIMIT子句的參數不能直接綁定變量,我們需要藉助一點技巧來繞過這個限制。
確保使用的是MySQLi 擴展並啟用了預處理語句。
數據庫連接已經建立。
有一張用於查詢的數據表,如users 。
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_error) {
die("連接失敗: " . $mysqli->connect_error);
}
?>
<?php
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$page_size = 10;
$offset = ($page - 1) * $page_size;
?>
由於LIMIT子句的變量無法通過bind_param綁定,我們只能通過字符串拼接構造SQL。但仍可使用prepare綁定其它條件參數:
<?php
$sql = "SELECT id, name, email FROM users ORDER BY id DESC LIMIT ?, ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("ii", $offset, $page_size);
$stmt->execute();
$result = $stmt->get_result();
?>
<?php
while ($row = $result->fetch_assoc()) {
echo "<p>{$row['id']} - {$row['name']} - {$row['email']}</p>";
}
?>
假設總記錄數為變量$total_rows ,你可以通過如下方式生成分頁鏈接:
<?php
$total_rows = 100; // 通常需要另行查詢得到總數
$total_pages = ceil($total_rows / $page_size);
for ($i = 1; $i <= $total_pages; $i++) {
echo "<a href='https://gitbox.net/userlist.php?page=$i'>1。 $i 頁</a> ";
}
?>
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_error) {
die("連接失敗: " . $mysqli->connect_error);
}
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$page_size = 10;
$offset = ($page - 1) * $page_size;
$sql = "SELECT id, name, email FROM users ORDER BY id DESC LIMIT ?, ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("ii", $offset, $page_size);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo "<p>{$row['id']} - {$row['name']} - {$row['email']}</p>";
}
$stmt->close();
$mysqli->close();
?>
使用mysqli_stmt::prepare實現分頁查詢的關鍵在於合理構造SQL 並理解參數綁定的限制。雖然LIMIT參數不能使用命名佔位符,但我們仍可通過bind_param綁定數字類型參數來實現安全、可靠的分頁功能。在實際項目中,這種方式比傳統字符串拼接更安全,也更易於維護。結合頁面導航邏輯,你可以構建完整的分頁數據展示系統,提高系統的用戶體驗與性能。