当我使用 mysqli->real_escape_string 并向数据库添加字符串值(例如“who's”)时,它会添加字符串而不以任何方式修改引号。当我检查数据库时,其中的值是“谁”。
当我不使用 mysqli->real_escape_string 并添加带有单引号的字符串时,例如“who's”,它不会被添加到数据库中。它无处可寻。
这不正常,是吗?
当我使用 mysqli->real_escape_string 并向数据库添加字符串值(例如“who's”)时,它会添加字符串而不以任何方式修改引号。当我检查数据库时,其中的值是“谁”。
当我不使用 mysqli->real_escape_string 并添加带有单引号的字符串时,例如“who's”,它不会被添加到数据库中。它无处可寻。
这不正常,是吗?
是的。以比这更详细的方式回答这个问题有点困难。
real_escape_string()
只对数据进行转义,以便可以在查询中安全地使用它,它不会以任何方式修改它。如果您不对其进行转义,则查询中会出现语法错误,因此会失败 - 并且不会插入数据。
然而,逃避数据的最安全方法是使用准备好的语句。
这是正常的,也是正确的。允许将real_escape_string
您的字符串添加到数据库中(包括引号)。没有它,撇号会干扰 SQL,因此可能会引发错误,这就是它“无处可寻”的原因。
所做的是,它仅在将必要的字符添加到数据库中时才real_escape_string
转义这些字符。所以这就像在 PHP 中转义字符串中相同类型的引号,例如:
$str = 'We escape single quotes like in O\'Connor';
并且单引号(撇号)是为了防止代码中断,但字符串值实际上并不包含它。同样……</p>
INSERT INTO table (`name`) VALUES ('O\'Connor')
在此示例中,反斜杠不会插入行中。当然,这是出于安全原因。检查Hackipedia 的页面以查看一些可能的情况。
希望这是你要问的。