Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql\u real\u escape\u string和addslashes之间有什么区别?_Php - Fatal编程技术网

Php mysql\u real\u escape\u string和addslashes之间有什么区别?

Php mysql\u real\u escape\u string和addslashes之间有什么区别?,php,Php,mysql\u real\u escape\u string和addslashes都用于在数据库查询之前转义数据,那么有什么区别呢?(这个问题不是关于参数化查询/PDO/mysqli)似乎mysql\u real\u escape\u string是二进制安全的-文档说明: 如果要插入二进制数据,则必须使用此函数 我认为总是使用mysql\u real\u escape\u string可能比addslashes更安全。string mysql\u real\u escape\u string(

mysql\u real\u escape\u string
addslashes
都用于在数据库查询之前转义数据,那么有什么区别呢?(这个问题不是关于参数化查询/PDO/mysqli)

似乎
mysql\u real\u escape\u string
是二进制安全的-文档说明:

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


我认为总是使用
mysql\u real\u escape\u string
可能比addslashes更安全。

string mysql\u real\u escape\u string(string$unescaped\u string[,resource$link\u identifier])

mysql\u real\u escape\u string()

string addslashes(string$str)

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


它们影响不同的角色
mysql\u real\u escape\u字符串
是特定于mysql的。Addslashes只是一个通用函数,可以应用于MySQL和其他东西。

MySQL\u real\u escape\u string
应该在接收二进制数据时使用,
Addslashes
用于文本输入


您可以在这里看到差异:mysql\u real\u escape\u string()
通过可选的link\u identifier参数正确转义数据库字符集的文本输入

角色集感知是一个关键的区别
addslashes()
将在每个要转义的字符的每八位二进制表示之前添加一个斜杠

如果您使用的是某种形式的多字节字符集,则十六位或三十二位字符表示的一部分或两半可能与字符的八位完全相同,尽管可能只是由于字符集的设计不好

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


如果需要转义数据库查询中的内容,应尽可能使用
mysql\u real\u escape\u string()
<如果您确定数据库或表仅使用7位或8位ASCII编码,则code>addslashes()可以使用。

案例1:

$str = "input's data";

print mysql_real_escape_string($str);      input\'s data

print addslashes($str);                    input\'s data;
$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;
$str = "input\'s data";

print mysql_real_escape_string($str);      input\'s data

print addslashes($str);                    input\\'s data;

我认为使用参数化查询可能更安全,尽管询问者已经排除了这一点。@Hank Gay:同意,但在这两种查询中,mysql\u real\u escape\u string是可靠的,您只是复制了定义,并没有真正回答什么是真正的区别,即什么是用法,什么是陷阱,哪一种功能比另一种更好。更好的答案是:再读一遍,你会注意到最后一段,我说不同的字符会受到影响,它总结了引用的文档。你会看到这个问题得到了回答。这个问题没有问“为什么一个比另一个好”或“好处和缺点”。如果您仍然不清楚上述内容,那么链接的答案会更深入,如果值得一读,但我认为没有必要在我的答案中找出漏洞。类似于此问题: