當前位置: 首頁> 最新文章列表> stmt_init 與fetch() 的配合使用詳解

stmt_init 與fetch() 的配合使用詳解

M66 2025-05-16

在使用PHP 操作MySQL 數據庫時, mysqli擴展提供了面向對象的接口,讓我們可以更安全、結構化地執行SQL 語句。特別是在執行預處理語句(Prepared Statements)時, mysqli::stmt_initfetch()是兩個非常關鍵的函數。

本文將詳細介紹如何使用mysqli::stmt_init()初始化語句對象,並結合fetch()方法安全高效地獲取數據庫中的數據。

一、什麼是mysqli::stmt_init

mysqli::stmt_init()mysqli類的方法,用於初始化一個語句對象( mysqli_stmt )。這個對象隨後可以通過prepare()方法準備SQL 語句。這樣做的好處是可以復用語句並綁定參數,提高代碼的安全性與效率。

示例:

 $mysqli = new mysqli("localhost", "username", "password", "database");

if ($mysqli->connect_errno) {
    die("連接失敗: " . $mysqli->connect_error);
}

$stmt = $mysqli->stmt_init();

二、準備和執行SQL 語句

使用stmt_init()創建語句對像後,使用prepare()準備查詢語句,並使用bind_param()綁定參數。

 $query = "SELECT id, name, email FROM users WHERE status = ?";
if ($stmt->prepare($query)) {
    $status = 'active';
    $stmt->bind_param("s", $status);
    $stmt->execute();
}

提示: bind_param的第一個參數"s"表示參數類型是字符串( string )。

三、綁定結果並使用fetch()提取數據

執行語句後,我們需要使用bind_result()將查詢結果的列綁定到變量上,隨後可以使用fetch()方法一行一行地提取數據。

 $stmt->bind_result($id, $name, $email);

while ($stmt->fetch()) {
    echo "用戶ID: $id<br>";
    echo "用戶名: $name<br>";
    echo "郵箱: $email<br><br>";
}

四、完整示例

以下是一個完整的PHP 示例程序:

 <?php
$mysqli = new mysqli("localhost", "username", "password", "database");

if ($mysqli->connect_errno) {
    die("連接失敗: " . $mysqli->connect_error);
}

$stmt = $mysqli->stmt_init();
$query = "SELECT id, name, email FROM users WHERE status = ?";

if ($stmt->prepare($query)) {
    $status = 'active';
    $stmt->bind_param("s", $status);
    $stmt->execute();
    $stmt->bind_result($id, $name, $email);

    echo "<h2>活跃用戶列表:</h2>";
    while ($stmt->fetch()) {
        echo "<div>";
        echo "<strong>ID:</strong> $id<br>";
        echo "<strong>姓名:</strong> $name<br>";
        echo "<strong>郵箱:</strong> <a href='mailto:$email'>$email</a><br>";
        echo "<a href='https://m66.net/user/profile.php?id=$id'>查看詳情</a>";
        echo "</div><hr>";
    }

    $stmt->close();
} else {
    echo "SQL 預處理失敗: " . $stmt->error;
}

$mysqli->close();
?>