當前位置: 首頁> 最新文章列表> 如何使用stmt_init 執行多次語句(prepared statement 循環執行)

如何使用stmt_init 執行多次語句(prepared statement 循環執行)

M66 2025-05-29

在PHP中,使用MySQLi擴展執行SQL語句時, stmt_init是一個非常有用的函數,它能夠初始化一個mysqli_stmt對象,使得我們可以執行預處理語句。通過預處理語句,您可以在數據庫查詢中使用佔位符,以防止SQL注入攻擊。

有時候,我們需要多次執行相同的預處理語句,只是每次執行時使用不同的參數。在這種情況下,我們可以使用stmt_init來實現多次執行預處理語句的功能。以下是一個示例,展示瞭如何在PHP中使用stmt_init來執行多次SQL語句:

 <?php
// 1. 創建數據庫連接
$servername = "localhost";
$username = "root";
$password = "password";
$dbname = "test_database";

// 創建連接
$conn = new mysqli($servername, $username, $password, $dbname);

// 檢查連接是否成功
if ($conn->connect_error) {
    die("連接失敗: " . $conn->connect_error);
}

// 2. 使用stmt_init初始化預處理語句
$stmt = $conn->stmt_init();

// 檢查準備語句是否成功
if ($stmt->prepare("INSERT INTO users (username, email) VALUES (?, ?)")) {

    // 3. 模擬一組數據,這些數據將被多次插入
    $users = [
        ['john_doe', 'john@m66.net'],
        ['jane_doe', 'jane@m66.net'],
        ['alice_smith', 'alice@m66.net'],
    ];

    // 4. 循環執行預處理語句,逐個插入用戶數據
    foreach ($users as $user) {
        $username = $user[0];
        $email = $user[1];

        // 綁定參數到預處理語句
        $stmt->bind_param("ss", $username, $email);

        // 執行語句
        if ($stmt->execute()) {
            echo "成功插入用戶: $username, $email\n";
        } else {
            echo "插入失敗: " . $stmt->error . "\n";
        }
    }

    // 5. 關閉語句
    $stmt->close();
} else {
    echo "預處理語句準備失敗: " . $conn->error;
}

// 6. 關閉數據庫連接
$conn->close();
?>

代碼說明:

  1. 建立數據庫連接:首先,我們需要連接到MySQL數據庫。在本示例中,使用的是localhost作為服務器,您需要根據實際情況調整連接參數。

  2. 初始化語句:使用$conn->stmt_init()初始化一個準備執行的語句對象。然後,通過prepare方法設置預處理SQL語句。在本例中,我們準備的是一個INSERT INTO語句,它插入了users表中的usernameemail字段。

  3. 綁定參數:我們通過bind_param方法將PHP 變量綁定到預處理語句中的佔位符。 "ss"參數表示我們綁定的是兩個字符串類型的參數。

  4. 循環執行:在foreach循環中,我們傳入一個包含多組用戶數據的數組。每次循環時,執行一次execute方法來插入一行數據。

  5. 關閉語句和連接:操作完成後,我們通過close()方法關閉stmt和數據庫連接。

優點:

  1. 防止SQL注入:由於我們使用了預處理語句和參數綁定,因此這個過程能有效防止SQL注入攻擊。

  2. 效率高:對於相同的查詢語句,通過循環執行不同的參數,避免了重複創建新的SQL語句,提高了效率。

注意事項:

  1. 每次執行循環時,都要確保bind_paramexecute方法能夠正確處理不同的輸入數據。

  2. 如果需要處理大量數據,確保數據庫的連接配置能夠處理並發請求,避免性能瓶頸。

通過這種方式,您可以有效地在PHP中使用stmt_init執行多次SQL語句,並且能夠動態傳入不同的參數。希望這個示例能夠幫助您更好地理解如何在PHP中執行多次預處理語句!