| 特性 | mysql_escape_string() | mysql_real_escape_string() |
|---|---|---|
| 需要資料庫連線 | **不需要** | **需要** (連線資源) |
| 字符集感知 | **無視** 當前字符集 | **依據** 連線字符集轉義 |
| 轉義字符 | 不轉義 % 和 _ | 完整轉義 (含 % _) |
| 適用場景 | 離線字串處理、舊代碼相容 | **所有實際 SQL 構建** (推薦) |
| PHP 版本狀態 | PHP 5.3.0 棄用,7.0.0 移除 | PHP 7.0.0 移除 (改用 mysqli/PDO) |
\0 (NUL), \n, \r, \\, ', ", \x1a (Ctrl+Z)
$mysqli = new mysqli("localhost", "user", "pass", "db");
if ($mysqli->connect_errno) die("Connect failed: " . $mysqli->connect_error);
$user = $_POST['user'];
$pass = $_POST['pass'];
// 參數化查詢 (最佳,完全避免注入)
$stmt = $mysqli->prepare("SELECT * FROM users WHERE user=? AND password=?");
$stmt->bind_param("ss", $user, $pass);
$stmt->execute();
// 若必須拼接 SQL (不推薦)
$safe_user = $mysqli->real_escape_string($user);
$safe_pass = $mysqli->real_escape_string($pass);
$sql = "SELECT * FROM users WHERE user='$safe_user' AND password='$safe_pass'";
$item = "zak's laptop";
$escaped = mysql_escape_string($item);
// 結果: zak\'s laptop
// 注意:% 和 _ 未轉義,LIKE 查詢會有語義改變風險
htmlspecialchars(),非資料庫轉義函數mysql_real_escape_string 是舊時代「拼接 SQL」的最佳防護,但現代開發**務必使用參數化查詢**,徹底分離代碼與資料。