MySQLi
PHP Manual

mysqli::real_escape_string

mysqli::escape_string

mysqli_real_escape_string

(PHP 5, PHP 7)

mysqli::real_escape_string -- mysqli::escape_string -- mysqli_real_escape_string根据当前连接的字符集,对于 SQL 语句中的特殊字符进行转义

说明

面向对象风格

string mysqli::escape_string ( string $escapestr )
string mysqli::real_escape_string ( string $escapestr )

过程化风格

string mysqli_real_escape_string ( mysqli $link , string $escapestr )

此函数用来对字符串中的特殊字符进行转义, 以使得这个字符串是一个合法的 SQL 语句。 传入的字符串会根据当前连接的字符集进行转义,得到一个编码后的合法的 SQL 语句。

Caution

安全:默认字符集

在调用 mysqli_real_escape_string() 函数之前, 必须先通过调用 mysqli_set_charset() 函数或者在 MySQL 服务器端设置字符集。 更多信息请参考 字符集

参数

link

仅以过程化样式:由mysqli_connect()mysqli_init() 返回的链接标识。

escapestr

需要进行转义的字符串。

会被进行转义的字符包括: NUL (ASCII 0),\n,\r,\,'," 和 Control-Z.

返回值

转义后的字符串。

错误/异常

在无效的连接上调用此函数会返回 NULL 并发出一个 E_WARNING 级别的错误。

范例

Example #1 mysqli::real_escape_string() 例程

面向对象风格

<?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 进行转义,此次查询会失败 */
if (!$mysqli->query("INSERT into myCity (Name) VALUES ('$city')")) {
    
printf("Error: %s\n"$mysqli->sqlstate);
}

$city $mysqli->real_escape_string($city);

/* 对 $city 进行转义之后,查询可以正常执行 */
if ($mysqli->query("INSERT into myCity (Name) VALUES ('$city')")) {
    
printf("%d Row inserted.\n"$mysqli->affected_rows);
}

$mysqli->close();
?>

过程化风格

<?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 进行转义,此次查询会失败 */
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 进行转义之后,查询可以正常执行 */
if (mysqli_query($link"INSERT into myCity (Name) VALUES ('$city')")) {
    
printf("%d Row inserted.\n"mysqli_affected_rows($link));
}

mysqli_close($link);
?>

以上例程会输出:

Error: 42000
1 Row inserted.

注释

Note:

如果你之前都是使用 mysql_real_escape_string() 函数来转义 SQL 语句的, 那么需要注意的是 mysqli_real_escape_string()mysql_real_escape_string() 两个函数的参数顺序不同。 mysqli_real_escape_string() 中, link 是第一个参数, 而在 mysql_real_escape_string() 函数中,要转义的字符串是第一个参数。

参见


MySQLi
PHP Manual