这个问题已经在这里有了答案:
已关闭8年。
如果他们做的不完全一样,有什么区别? MySQL查询中值的定界符是'
是吗?或者,也许是"
,但也可以通过添加斜线转义。
在其他数据库引擎中,我理解了(并且肯定在PDO之类的db包装器中),但是为什么有那么多人如此热衷于使用mysql(i)_escape_string而不是adslashes?
最佳答案
首先:不使用mysql_escape_string
,已弃用(出于某种原因)!
如果必须支持通过mysql
扩展名(即has been deprecated)连接到数据库的旧版应用程序,请改为使用 mysql_real_escape_string
。否则从switch immediately到mysqli
,其中准备好的语句和绑定(bind)参数为转义用户输入提供了更健壮的机制。
也就是说,可以通过阅读 mysql_real_escape_string
和 addslashes
的描述找到答案:
差异#1 addslashes
对MySql连接编码一无所知。如果向其传递一个字符串,该字符串包含表示MySql连接使用的编码以外的其他编码的字节,则它将愉快地转义所有具有字符'
,"
,\
和\x00
的值的字节。如果您使用的不是8位编码和UTF-8编码,则此字符可能与所有字符'
,"
,\
和\x00
不同。结果将是MySql接收的字符串将被破坏。
要触发此错误,请尝试使用 iconv
将变量转换为UTF-16,然后使用addslashes
对其进行转义。查看您的数据库收到了什么。
这是addslashes
不应用于转义的原因之一。
差异#2
与addslashes
相比,mysql_real_escape_string
还会转义字符\r
,\n
和\x1a
。与MySql交谈时,似乎也必须转义这些字符,否则可能会导致格式错误的查询
这是不应该使用addslashes
进行转义的另一个原因。
关于php - PHP的addlashes和mysql(i)_escape_string有什么区别? [复制],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4486016/