当我使用mysqli-> real_escape_string并向数据库添加字符串值(例如"who's")时,它会添加字符串而不以任何方式修改引号。 当我检查db时,其中的值是"who's"。

当我不使用mysqli-> real_escape_string并添加一个像"who's"这样的单引号的字符串时,它就不会被添加到数据库中。 它无处可寻。

这不正常,是吗?

你是如何查看数据库的? 这可能是原因:清理数据以便于阅读。

我正在使用phpmyadmin

我认为这取决于版本,但它可能是解压缩斜杠,以便您可以更轻松地读取数据。 例如,尝试查看MySQL Bash中的数据。 此外,您的MySQL设置是默认还是更改?

是的。以更详细的方式回答这个问题有点困难。

real_escape_string()仅转义数据,因此可以安全地在查询中使用,它不会以任何方式对其进行修改。如果不对其进行转义,则查询中会出现语法错误,因此失败 - 并且未插入数据。

但是,最安全的数据转义方法是使用预准备语句。

根据手册,它逃脱了以下:Characters encoded are NUL (ASCII 0),

,

, \, ',", and Control-Z。

我正在看这个网址,而Powerlords评论让我觉得它应该被转义:stackoverflow.com/questions/2289214/

编码? 逃逸? 字符集......哦,我的!

@steeped它被转义 - real_escape_string()返回的字符串中的'用反斜杠转义,但是当数据存储在数据库中时,数据的存储没有反斜杠。 转义字符仅用于使查询在语法上有效。

@DaveRandom,再一次,谢谢你。 你先生,太棒了。

real_escape_string的作用是,只有在数据库中添加这些字符时才会转义必要的字符。所以它就像在PHP中的字符串中转义相同类型的引号,例如:

$str = 'We escape single quotes like in O\'Connor';

单引号(撇号)是为了防止代码破坏,但字符串值实际上并不包含它。同样...

INSERT INTO table (`name`) VALUES ('O\'Connor')

在此示例中,反斜杠不会插入行中。当然,这是出于安全原因。查看Hackipedia的页面以查看一些可能的情况。

希望这是你所要求的。

这是正常的,也是正确的。 real_escape_string允许将您的字符串添加到数据库(包括引用)。没有它,撇号会干扰SQL,因此可能会抛出错误,这就是为什么它"无处可寻"。