首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

PHP mysqli 預處理語句完整指南:防止 SQL 注入的最佳實踐

     編輯:MySQL 資料庫相關知識

什麼是 mysqli 預處理語句?

在 PHP 開發中,資料庫操作的安全性至關重要。mysqli 擴展庫提供的預處理語句(Prepared Statements)是防止 SQL 注入攻擊的核心機制。預處理語句將 SQL 邏輯與資料分離,先讓資料庫編譯 SQL 模板,再綁定參數執行,從根本上杜絕了惡意 SQL 代碼注入的風險。

核心優勢

  • 安全性:參數綁定機制自動處理特殊字符轉義
  • 性能:重複執行時只需解析編譯一次 SQL
  • 可讀性:SQL 結構與業務邏輯清晰分離

實戰範例一:批次新增用戶資料

以下範例展示如何使用預處理語句高效插入多筆資料:

<?php
// 1. 建立資料庫連線
$mysqli = new MySQLi("localhost", "root", "root", "test");
if ($mysqli->connect_error) {
    die("連線失敗: " . $mysqli->connect_error);
}

// 2. 準備 SQL 模板(使用 ? 佔位符)
$sql = "INSERT INTO user1 (name, password, email, age) VALUES (?, ?, ?, ?)";
$stmt = $mysqli->prepare($sql);

// 3. 綁定參數類型:s=字串, i=整數
$stmt->bind_param("sssi", $name, $password, $email, $age);

// 4. 批次執行插入
$users = [
    ["小芳", "123456", "xiaofang@126.com", 18],
    ["小楊", "123456", "xiaoyang@126.com", 18],
    ["小G", "123456", "xiaoG@126.com", 18]
];

foreach ($users as $user) {
    [$name, $password, $email, $age] = $user;
    $stmt->execute();
}

if ($stmt->error) {
    echo "操作失敗: " . $stmt->error;
} else {
    echo "成功新增 " . $stmt->affected_rows . " 筆資料";
}

// 5. 釋放資源
$stmt->close();
$mysqli->close();
?>

關鍵步驟解析

  1. prepare():將 SQL 發送給 MySQL 伺服器預編譯
  2. bind_param():綁定變數並指定類型("sssi" 代表三個字串、一個整數)
  3. execute():執行預處理語句,可重複呼叫
  4. affected_rows:獲取影響的行數

實戰範例二:條件查詢與結果綁定

預處理語句同樣適用於 SELECT 查詢,配合 bind_result() 可直接將查詢結果映射到變數:

<?php
$mysqli = new MySQLi("localhost", "root", "root", "test");
if ($mysqli->connect_error) {
    die("連線失敗: " . $mysqli->connect_error);
}

// 查詢 ID 大於 5 的用戶
$sql = "SELECT id, name, email FROM user1 WHERE id > ?";
$stmt = $mysqli->prepare($sql);

$id = 5;
$stmt->bind_param("i", $id);      // 綁定查詢條件
$stmt->bind_result($id, $name, $email); // 綁定結果欄位
$stmt->execute();

// 逐行獲取結果
while ($stmt->fetch()) {
    echo "
{$id}--{$name}--{$email}"; } // 釋放資源 $stmt->free_result(); $stmt->close(); $mysqli->close(); ?>

常見錯誤與最佳實踐

錯誤類型錯誤做法正確做法
類型不匹配bind_param("i", $stringVar)確保類型標識與變數類型一致
未檢查錯誤直接執行 execute()執行後檢查 $stmt->error
資源洩漏未關閉 statement務必呼叫 close() 釋放資源
重複 prepare迴圈中重複 prepare()迴圈外 prepare,迴圈內 bind/execute

進階技巧:動態建構 WHERE 條件

實際開發中常需根據用戶輸入動態建構查詢條件:

function buildUserQuery($mysqli, $filters) {
    $conditions = [];
    $params = [];
    $types = "";
    
    if (!empty($filters['name'])) {
        $conditions[] = "name LIKE ?";
        $params[] = "%{$filters['name']}%";
        $types .= "s";
    }
    if (!empty($filters['min_age'])) {
        $conditions[] = "age >= ?";
        $params[] = $filters['min_age'];
        $types .= "i";
    }
    
    $sql = "SELECT * FROM user1";
    if ($conditions) {
        $sql .= " WHERE " . implode(" AND ", $conditions);
    }
    
    $stmt = $mysqli->prepare($sql);
    if ($params) {
        $stmt->bind_param($types, ...$params); // PHP 5.6+ 支援參數解包
    }
    $stmt->execute();
    return $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
}

總結

mysqli 預處理語句是 PHP 開發者必須掌握的核心技能。它不僅提供了企業級的安全防護,更能提升高併發場景下的資料庫性能。記住三個核心原則:永不拼接 SQL 字串、嚴格綁定參數類型、及時釋放資源。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved