【发布时间】:2008-09-18 09:32:48
【问题描述】:
mysql_real_escape_string和addslashes都是用来在数据库查询前转义数据,那有什么区别呢? (本题与参数化查询/PDO/mysqli无关)
【问题讨论】:
标签: php
mysql_real_escape_string和addslashes都是用来在数据库查询前转义数据,那有什么区别呢? (本题与参数化查询/PDO/mysqli无关)
【问题讨论】:
标签: php
string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )mysql_real_escape_string()调用 MySQL 的库函数 mysql_real_escape_string,该函数在以下字符前添加反斜杠:\x00、\n、\r、\、'、" 和 \x1a。
1234565>
string addslashes ( string $str )
在需要在数据库查询等中引用的字符之前返回带有反斜杠的字符串。这些字符是单引号 (')、双引号 (")、反斜杠 (\) 和 NUL(NULL 字节)。它们影响不同的角色。
mysql_real_escape_string特定于 MySQL。 Addslashes 只是一个通用函数,它可能适用于其他事物以及 MySQL。
【讨论】:
mysql_real_escape_string() 具有额外的好处,即通过可选的 link_identifier 参数相对于数据库的字符集正确转义文本输入。
字符集意识是一个关键的区别。 addslashes() 将在每个要转义的字符的每八位二进制表示之前添加一个斜杠。
如果您使用某种形式的多字节字符集,尽管可能只是由于字符集设计不佳,16 位或 32 位字符表示的一半或两半与字符 addslashes() 会添加一个斜线。
在这种情况下,您可能会在不应转义的字符前添加斜杠,或者更糟糕的是,您可能会在十六(或三十二)位字符中间添加斜杠,这会破坏数据。
如果您需要转义数据库查询中的内容,您应该尽可能使用mysql_real_escape_string()。如果您确定数据库或表仅使用 7 位或 8 位 ASCII 编码,addslashes() 很好。
【讨论】:
案例 1:
$str = "input's data";
print mysql_real_escape_string($str); input\'s data
print addslashes($str); input\'s data;
案例 2:
$str = "input\'s data";
print mysql_real_escape_string($str); input\'s data
print addslashes($str); input\\'s data;
【讨论】:
mysql_real_escape_string 似乎是二进制安全的 - 文档指出:
如果要插入二进制数据,必须使用该函数。
我认为始终使用 mysql_real_escape_string 可能比使用 addlashes 更安全。
【讨论】:
mysql_real_escape_string用于接收二进制数据,addslashes用于文本输入。
您可以在这里看到不同之处:mysql-real-escape-string 和 addslashes
【讨论】: