在使用PHP 操作MySQL 數據庫時, mysqli擴展提供了豐富的預處理語句(Prepared Statements)支持,可以有效防止SQL 注入攻擊,並提高數據庫操作的安全性和效率。本文將重點介紹如何使用mysqli::stmt_init方法初始化一個語句對象,並通過該對象執行SQL 語句。
mysqli::stmt_init()是mysqli類的一個方法,用於初始化一個空的語句對象( mysqli_stmt )。這個對像後續可以通過調用prepare()方法綁定SQL 查詢語句,並進一步調用bind_param() 、 execute()等方法進行操作。
其基本語法如下:
$stmt = $mysqli->stmt_init();
其中$mysqli是一個已經連接到數據庫的mysqli對象。
以下是一個使用stmt_init初始化語句並執行SQL 查詢的完整PHP 示例:
<?php
// 數據庫連接
$mysqli = new mysqli("localhost", "username", "password", "database");
// 檢查連接
if ($mysqli->connect_error) {
die("連接失敗: " . $mysqli->connect_error);
}
// 初始化語句對象
$stmt = $mysqli->stmt_init();
// 預處理 SQL 語句
if ($stmt->prepare("SELECT name, email FROM users WHERE id = ?")) {
// 綁定參數
$id = 1;
$stmt->bind_param("i", $id);
// 执行語句
$stmt->execute();
// 綁定結果變量
$stmt->bind_result($name, $email);
// 獲取查詢結果
while ($stmt->fetch()) {
echo "用戶姓名: $name, 郵箱: $email<br>";
}
// 关闭語句
$stmt->close();
} else {
echo "SQL 預處理失败: " . $stmt->error;
}
// 關閉連接
$mysqli->close();
?>
在調用stmt_init()後,你必須使用prepare()方法才能實際綁定SQL 語句。
bind_param()中的類型參數例如"i"表示整型, "s"表示字符串,必須正確設置。
一定要在使用完語句對像後調用$stmt->close()以釋放資源。
雖然可以直接使用$mysqli->prepare()來進行語句準備, stmt_init()提供了更細緻的控制,比如在需要檢查語句是否可複用或使用低級接口時更有用。