准备好的陈述和"真正的逃脱字符串"

时间:2015-12-04 09:49:41

标签: php

我在这个网站上看过,当使用预处理语句时,我不需要使用real_escape_string。我是准备好的陈述的新手。 我创建了一个传递string的预准备语句。

 $stmt = $conn->prepare("INSERT INTO `messages` (`topic`, `message`,         `user`)VALUES(?, ?, ?)");
 $stmt->bind_param("sss", $topic, $message, $user);

然后我将此字符串输入任何字段:{ /n \n /r \r " I'm cooking" ' }(括号内的内容。) 这就是数据库中正好显示的内容。 但是,如果我添加一个real_escape_string,我会得到{ /n \\n /r \\r \" I\'m cooking\" \' }

所以我很困惑,real_escape_string肯定会改变输入,我需要它,还是/n /r就好了?

2 个答案:

答案 0 :(得分:1)

嗯,是的,real_escape_string 正在更改值,这是它的工作。它以一种方式更改值,当它们放在引号中时它们将是有效的SQL字符串文字。

然而,准备好的陈述避免了引号中的"字符串文字的整个问题,你根本不用担心它。准备好的语句将使用任何字符串,并确保将其插入数据库,而不会因为被评估为字符串而导致格式错误或产生语法问题文字。这正是您所看到的:您的价值观与您提供的数据库完全一致,这正是您所希望的。

使用带有值绑定的预准备语句时,您不需要real_escape_string

请阅读:The Great Escapism (Or: What You Need To Know To Work With Text Within Text)

答案 1 :(得分:0)

使用预准备语句时不需要real_escape_string。实际上,不需要转义输入数据。

您无法逃脱准备好的声明值。

当您说real_escape_string正在更改值时,您是对的。这是因为如果您没有使用预准备语句,则需要转义数据。因此,real_escape_string执行所需的转义并提供您看到的输出(\\n等)。如上所述,准备好的陈述不需要这个过程。