使用者輸入含單引號、雙引號、反斜線等特殊字元,直接拼接 SQL 會導致語法錯誤或 SQL 注入 風險。
string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier = NULL ] )
\x00, \n, \r, \\, ', ", \x1a。% 與 _(LIKE 查詢通配符需自行處理)。<?php
$link = mysql_connect('localhost', 'user', 'pass');
mysql_select_db('test', $link);
$item = "Zak's and Derick's Laptop";
$escaped = mysql_real_escape_string($item, $link);
// 輸出:Zak\'s and Derick\'s Laptop
printf("Escaped string: %s\n", $escaped);
// 正確用法:只轉義值
$name = mysql_real_escape_string($_POST['name'], $link);
$sql = "SELECT * FROM users WHERE name = '$name'";
mysql_query($sql, $link);
// ❌ 錯誤:對整條 SQL 使用,會破壞語法
$sql = "SELECT * FROM users WHERE name = 'test'";
$bad = mysql_real_escape_string($sql); // 會轉義引號、空格等,導致 SQL 無效
強烈建議改用 PDO 或 mysqli 預處理語句,徹底分離 SQL 結構與資料,免除手動轉義。
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->prepare('SELECT * FROM users WHERE name = :name');
$stmt->execute(['name' => $name]); // 自動處理轉義與型別
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
mysql_real_escape_string 針對單一字串值轉義。%、_ 在 LIKE 查詢需額外轉義(str_replace(['%','_'], ['\\%','\\_'], $val))。