當前位置: 首頁> 最新文章列表> 用mysqli_stmt::prepare 函數如何實現分頁查詢?詳細步驟和示例解析

用mysqli_stmt::prepare 函數如何實現分頁查詢?詳細步驟和示例解析

gitbox 2025-05-28

在開發基於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子句的參數不能直接綁定變量,我們需要藉助一點技巧來繞過這個限制。

二、準備工作

  1. 確保使用的是MySQLi 擴展並啟用了預處理語句。

  2. 數據庫連接已經建立。

  3. 有一張用於查詢的數據表,如users

三、分頁查詢的實現步驟

步驟1:建立數據庫連接

<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_error) {
    die("連接失敗: " . $mysqli->connect_error);
}
?>

步驟2:設定分頁參數

<?php
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$page_size = 10;
$offset = ($page - 1) * $page_size;
?>

步驟3:編寫預處理語句

由於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();
?>

步驟4:輸出查詢結果

<?php
while ($row = $result->fetch_assoc()) {
    echo "<p>{$row['id']} - {$row['name']} - {$row['email']}</p>";
}
?>

步驟5:分頁導航鏈接

假設總記錄數為變量$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綁定數字類型參數來實現安全、可靠的分頁功能。在實際項目中,這種方式比傳統字符串拼接更安全,也更易於維護。結合頁面導航邏輯,你可以構建完整的分頁數據展示系統,提高系統的用戶體驗與性能。