首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

PHP mysqli 預處理語句完整指南:防注入、提升效能的最佳實踐

     編輯:MySQL 綜合教學

mysqli 預處理(Prepared Statements)是防範 SQL 注入、提升重複執行效能的核心技術。本文通過「批量新增用戶」與「條件查詢」兩個實戰案例,詳細講解 prepare、bind_param、bind_result、execute 等核心 API 的用法。

核心流程圖解

  1. 建立 mysqli 連接
  2. prepare(sql) 建立預編譯對象
  3. bind_param(type, vars...) 綁定參數(類型須與佔位符一一對應)
  4. execute() 執行
  5. 查詢時:bind_result() 綁定結果集 → fetch() 逐行取值
  6. 釋放資源:free_result()、close()

案例一:批量新增 3 條用戶資料

<?php
$mysqli = new MySQLi("localhost", "root", "root", "test");
if ($mysqli->connect_error) die($mysqli->connect_error);

$sql = "INSERT INTO user1(name, password, email, age) VALUES (?, ?, ?, ?)";
$stmt = $mysqli->prepare($sql);

// 綁定參數類型:s=string, i=integer
$stmt->bind_param("sssi", $name, $password, $email, $age);

// 第 1 條
$name = "小芳"; $password = "123456"; $email = "xiaofang@126.com"; $age = 18;
$stmt->execute();

// 第 2 條
$name = "小楊"; $password = "123456"; $email = "xiaoyang@126.com"; $age = 18;
$stmt->execute();

// 第 3 條
$name = "小G";  $password = "123456"; $email = "xiaoG@126.com";  $age = 18;
$stmt->execute();

echo $stmt->error ? "失敗:" . $stmt->error : "成功";
$stmt->close(); $mysqli->close();
?>

案例二:查詢 id > 5 的用戶

<?php
$mysqli = new MySQLi("localhost", "root", "root", "test");
$stmt = $mysqli->prepare("SELECT id, name, email FROM user1 WHERE id > ?");
$id = 5;
$stmt->bind_param("i", $id);
$stmt->bind_result($id, $name, $email);
$stmt->execute();

while ($stmt->fetch()) {
    echo "<br>$id--$name--$email";
}

$stmt->free_result();
$stmt->close();
$mysqli->close();
?>

關鍵優勢總結

  • 安全:參數與 SQL 結構分離,徹底杜絕注入
  • 高效:同一 SQL 重複執行只需編譯一次
  • 可讀:佔位符 ? 讓 SQL 結構清晰可見

常見坑點提醒

  • bind_param 類型字串(如 "sssi")必須與參數個數、順序嚴格對應
  • 查詢務必調用 bind_result 並循環 fetch() 取值
  • 記得在 finally 或流程末尾釋放 stmt 與 conn
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved