mysql_real_escape_string和addslashes有什么区别?

时间:2008-09-18 09:32:48

标签: php

mysql_real_escape_stringaddslashes都用于在数据库查询之前转义数据,那有什么区别? (这个问题不是关于参数化查询/ PDO / mysqli)

5 个答案:

答案 0 :(得分:15)

string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
mysql_real_escape_string()调用MySQL的库函数mysql_real_escape_string,它将反斜杠添加到以下字符:\ x00,\ n,\ r,\,',“和\ x1a。

string addslashes ( string $str )
在需要在数据库查询等中引用的字符之前返回带反斜杠的字符串。这些字符是单引号('),双引号(“),反斜杠(\)和NUL(NULL字节)。

它们会影响不同的角色。 mysql_real_escape_string特定于MySQL。 Addslashes只是一个通用函数,可以应用于其他东西以及MySQL。

答案 1 :(得分:8)

mysql_real_escape_string()具有通过可选的 link_identifier 参数正确转义文本输入相对于数据库字符集的好处。

字符集意识是一个重要的区别。 addslashes()将在每个要转义的字符的八位二进制表示之前添加斜杠。

如果你正在使用某种形式的多字节字符集,虽然可能只是通过字符集的设计不佳,但是16或32位字符表示的一半或两半与8位字符集相同。字符addslashes()会添加斜杠。

在这种情况下,您可能会在不应该转义的字符之前添加斜杠,或者更糟糕的是,您可能会在十六(或三十二)位字符的中间添加斜杠,这会破坏数据。

如果您需要在数据库查询中转义内容,则应尽可能使用mysql_real_escape_string()。如果您确定数据库或表仅使用7位或8位ASCII编码,addslashes()就可以了。

答案 2 :(得分:1)

案例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;

答案 3 :(得分:0)

似乎mysql_real_escape_string是二进制安全的 - 文档声明:

  

如果要插入二进制数据,则必须使用此功能。

我认为总是使用mysql_real_escape_string比使用addslashes更安全。

答案 4 :(得分:0)

当您接收二进制数据时,应使用

mysql_real_escape_stringaddslashes用于文本输入。

您可以在此处查看差异:mysql-real-escape-stringaddslashes