(PHP 5, PHP 7, PHP 8)
mysqli::real_escape_string -- mysqli::escape_string -- mysqli_real_escape_string — 根據當前連接的字符集,對于 SQL 語(yǔ)句中的特殊字符進(jìn)行轉義
面向對象風(fēng)格
$escapestr
): string過(guò)程化風(fēng)格
此函數用來(lái)對字符串中的特殊字符進(jìn)行轉義, 以使得這個(gè)字符串是一個(gè)合法的 SQL 語(yǔ)句。 傳入的字符串會(huì )根據當前連接的字符集進(jìn)行轉義,得到一個(gè)編碼后的合法的 SQL 語(yǔ)句。
在調用 mysqli_real_escape_string() 函數之前, 必須先通過(guò)調用 mysqli_set_charset() 函數或者在 MySQL 服務(wù)器端設置字符集。 更多信息請參考 字符集。
mysql
僅以過(guò)程化樣式:由mysqli_connect() 或 mysqli_init() 返回的 mysqli 對象。
escapestr
需要進(jìn)行轉義的字符串。
會(huì )被進(jìn)行轉義的字符包括: NUL (ASCII 0),\n,\r,\,'," 和
Control-Z
.
轉義后的字符串。
在無(wú)效的連接上調用此函數會(huì )返回
null
并發(fā)出一個(gè) E_WARNING
級別的錯誤。
示例 #1 mysqli::real_escape_string() 例程
面向對象風(fēng)格
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* 檢查連接 */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$mysqli->query("CREATE TEMPORARY TABLE myCity LIKE City");
$city = "'s Hertogenbosch";
/* 由于未對 $city 進(jìn)行轉義,此次查詢(xún)會(huì )失敗 */
if (!$mysqli->query("INSERT into myCity (Name) VALUES ('$city')")) {
printf("Error: %s\n", $mysqli->sqlstate);
}
$city = $mysqli->real_escape_string($city);
/* 對 $city 進(jìn)行轉義之后,查詢(xún)可以正常執行 */
if ($mysqli->query("INSERT into myCity (Name) VALUES ('$city')")) {
printf("%d Row inserted.\n", $mysqli->affected_rows);
}
$mysqli->close();
?>
過(guò)程化風(fēng)格
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* 檢查連接 */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City");
$city = "'s Hertogenbosch";
/* 由于未對 $city 進(jìn)行轉義,此次查詢(xún)會(huì )失敗 */
if (!mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
printf("Error: %s\n", mysqli_sqlstate($link));
}
$city = mysqli_real_escape_string($link, $city);
/* 對 $city 進(jìn)行轉義之后,查詢(xún)可以正常執行 */
if (mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
printf("%d Row inserted.\n", mysqli_affected_rows($link));
}
mysqli_close($link);
?>
以上例程會(huì )輸出:
Error: 42000 1 Row inserted.
注意:
如果你之前都是使用 mysql_real_escape_string() 函數來(lái)轉義 SQL 語(yǔ)句的, 那么需要注意的是 mysqli_real_escape_string() 和 mysql_real_escape_string() 兩個(gè)函數的參數順序不同。 mysqli_real_escape_string() 中,
link
是第一個(gè)參數, 而在 mysql_real_escape_string() 函數中,要轉義的字符串是第一個(gè)參數。