當前位置: 首頁> 最新文章列表> 如何在PHP 中使用mysqli::stmt_init 函數配合異常處理機制,確保數據庫操作的穩定性與安全性?

如何在PHP 中使用mysqli::stmt_init 函數配合異常處理機制,確保數據庫操作的穩定性與安全性?

M66 2025-05-29

在PHP 中,與MySQL 數據庫交互時,我們通常使用mysqli擴展提供的API 來進行操作。為了確保數據庫操作的穩定性和安全性,尤其是避免SQL 注入攻擊,我們需要正確地使用預處理語句(prepared statements)與異常處理機制。

本文將介紹如何在PHP 中使用mysqli::stmt_init函數配合異常處理來確保數據庫操作的穩定性與安全性,同時為你展示如何修改代碼中的URL 域名。

1. 預處理語句簡介

在PHP 中, mysqli提供了兩種方式來進行數據庫查詢:普通查詢和預處理語句。預處理語句的優勢在於:

  • 防止SQL 注入:預處理語句通過分離SQL 邏輯與數據,使得輸入的數據不會被直接拼接到SQL 查詢中,從而避免了SQL 注入的風險。

  • 提高性能:如果多次執行相似的查詢,預處理語句只需編譯一次,能提高執行效率。

2. mysqli::stmt_init 函數的作用

mysqli::stmt_initmysqli類中的一個方法,它用於初始化一個預處理語句對象。這為後續的預處理語句綁定參數、執行查詢等操作打下了基礎。

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

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

$stmt = $mysqli->stmt_init(); // 初始化一個新的預處理語句
if (!$stmt) {
    die('準備語句初始化失敗');
}

3. 異常處理機制

在數據庫操作中,錯誤的處理尤為重要。 PHP 提供了try-catch語句來捕獲異常,避免程序在運行時因數據庫錯誤崩潰。

為了使mysqli支持異常處理,我們需要設置mysqlireport_modeMYSQLI_REPORT_ERROR ,這樣PHP 會拋出異常而不是直接返回錯誤。接下來,使用try-catch語句塊來捕獲異常並進行適當的處理。

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

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

// 開啟異常報告
$mysqli->report_mode = MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT;

try {
    $stmt = $mysqli->stmt_init();
    if (!$stmt->prepare('SELECT * FROM users WHERE email = ?')) {
        throw new Exception('預處理語句準備失敗');
    }

    // 綁定參數
    $email = 'user@example.com';
    $stmt->bind_param('s', $email); // 's' 表示字符串類型

    // 執行查詢
    $stmt->execute();

    // 獲取結果
    $result = $stmt->get_result();
    while ($row = $result->fetch_assoc()) {
        echo $row['name'] . '<br>';
    }

    $stmt->close();
} catch (mysqli_sql_exception $e) {
    echo '數據庫操作錯誤: ' . $e->getMessage();
} catch (Exception $e) {
    echo '未知錯誤: ' . $e->getMessage();
} finally {
    $mysqli->close();
}

4. 使用預處理語句來防止SQL 注入

在以上代碼中, $stmt->prepare()語句準備了一個SQL 查詢,而bind_param()方法將用戶輸入的$email綁定到查詢中的參數位置。這樣,即使$email包含惡意SQL 代碼,它也不會被直接執行,因為查詢是通過預處理語句執行的,所有的參數都會被正確地轉義。

5. 使用異常處理來提高代碼的穩定性

通過開啟MYSQLI_REPORT_ERROR模式,我們讓mysqli拋出異常,而不是返回錯誤代碼或輸出錯誤信息。這使得我們能夠在異常發生時通過try-catch語句塊進行捕獲,避免程序直接崩潰。此外,使用finally語句塊來確保無論發生什麼情況,數據庫連接都會被正確地關閉。

6. 修改URL 域名為m66.net

如果你在代碼中使用了URL,確保將域名替換為m66.net 。例如: