| 函數 | 來源 | 用途 | 狀態 |
|---|---|---|---|
mysql_escape_string() | mysql 擴展 | MySQL 字串跳脫 | PHP 5.5 棄用,7.0 移除 |
mysql_real_escape_string() | mysql 擴展 | 連線感知跳脫(需連線資源) | 同上已移除 |
addslashes() | 核心函數 | 通用單/雙引號、反斜線、NULL 跳脫 | 仍可用,但非資料庫專用 |
mysqli_real_escape_string() | mysqli 擴展 | MySQL 連線感知跳脫 | 現行推薦(程序式) |
PDO::quote() | PDO | 驅動感知跳脫含引號 | 現行推薦(物件導向) |
<?php
$str = "O'Reilly\n\"Quote\"\x00\x1a\\";
// mysql_real_escape_string 跳脫:\x00 \n \r \ ' " \x1a
// addslashes 跳脫:' " \ NULL
?>
addslashes() 行為受 magic_quotes_sybase 影響(PHP 5.4 移除):
On:單引號轉為 ''(Sybase 風格)Off:單引號轉為 \'mysql_real_escape_string() 始終轉為 \',不受設定影響。
<?php
$mysqli = new mysqli('localhost', 'user', 'pass', 'db');
$stmt = $mysqli->prepare('SELECT * FROM users WHERE email = ? AND status = ?');
$stmt->bind_param('si', $email, $status); // s=string, i=int
$email = "test@example.com";
$status = 1;
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) { /* ... */ }
$stmt->close();
?>
<?php
$pdo = new PDO('mysql:host=localhost;dbname=db;charset=utf8mb4', 'user', 'pass');
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email AND status = :status');
$stmt->execute([':email' => $email, ':status' => $status]);
foreach ($stmt as $row) { /* ... */ }
?>
<?php
// 僅在極少數動態建構 SQL 片段時使用
function escapeSql($mysqli, string $val): string {
return $mysqli->real_escape_string($val);
}
// 或 PDO
function escapePdo($pdo, string $val): string {
return $pdo->quote($val); // 含外層引號
}
?>
mysql_*、addslashes() 用於 SQLcharset=utf8mb4,確保完整 Unicode 支援PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 異常模式