(PHP 5, PHP 7, PHP 8)
mysqli::real_escape_string -- mysqli::escape_string -- mysqli_real_escape_string — 根據(jù)當(dāng)前連接的字符集,對(duì)于 SQL 語句中的特殊字符進(jìn)行轉(zhuǎn)義
面向?qū)ο箫L(fēng)格
$escapestr
): string過程化風(fēng)格
此函數(shù)用來對(duì)字符串中的特殊字符進(jìn)行轉(zhuǎn)義, 以使得這個(gè)字符串是一個(gè)合法的 SQL 語句。 傳入的字符串會(huì)根據(jù)當(dāng)前連接的字符集進(jìn)行轉(zhuǎn)義,得到一個(gè)編碼后的合法的 SQL 語句。
在調(diào)用 mysqli_real_escape_string() 函數(shù)之前, 必須先通過調(diào)用 mysqli_set_charset() 函數(shù)或者在 MySQL 服務(wù)器端設(shè)置字符集。 更多信息請(qǐng)參考 字符集。
mysql
僅以過程化樣式:由mysqli_connect() 或 mysqli_init() 返回的 mysqli 對(duì)象。
escapestr
需要進(jìn)行轉(zhuǎn)義的字符串。
會(huì)被進(jìn)行轉(zhuǎn)義的字符包括: NUL (ASCII 0),\n,\r,\,'," 和
Control-Z
.
轉(zhuǎn)義后的字符串。
在無效的連接上調(diào)用此函數(shù)會(huì)返回
null
并發(fā)出一個(gè) E_WARNING
級(jí)別的錯(cuò)誤。
示例 #1 mysqli::real_escape_string() 例程
面向?qū)ο箫L(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";
/* 由于未對(duì) $city 進(jìn)行轉(zhuǎn)義,此次查詢會(huì)失敗 */
if (!$mysqli->query("INSERT into myCity (Name) VALUES ('$city')")) {
printf("Error: %s\n", $mysqli->sqlstate);
}
$city = $mysqli->real_escape_string($city);
/* 對(duì) $city 進(jìn)行轉(zhuǎn)義之后,查詢可以正常執(zhí)行 */
if ($mysqli->query("INSERT into myCity (Name) VALUES ('$city')")) {
printf("%d Row inserted.\n", $mysqli->affected_rows);
}
$mysqli->close();
?>
過程化風(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";
/* 由于未對(duì) $city 進(jìn)行轉(zhuǎ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);
/* 對(duì) $city 進(jìn)行轉(zhuǎn)義之后,查詢可以正常執(zhí)行 */
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() 函數(shù)來轉(zhuǎn)義 SQL 語句的, 那么需要注意的是 mysqli_real_escape_string() 和 mysql_real_escape_string() 兩個(gè)函數(shù)的參數(shù)順序不同。 mysqli_real_escape_string() 中,
link
是第一個(gè)參數(shù), 而在 mysql_real_escape_string() 函數(shù)中,要轉(zhuǎn)義的字符串是第一個(gè)參數(shù)。