在mysql中使用mysql_real_escape_string或addslashes时,字符串不会被转义

时间:2011-11-29 06:45:42

标签: php mysql escaping

我使用mysql_real_escape_string php函数从表单中收到转义数据。我收到表格数据的代码是:

$std_id     =   mysql_real_escape_string($_POST['std_id']);
$name       =   mysql_real_escape_string($_POST['name']);
$family     =   mysql_real_escape_string($_POST['family']);

例如,如果在名称表单字段中输入 O'reilly 字符串,此函数工作正常,我的查询也完成了。但是当我转到mysql和我的表时,看到这个字符串是插入的 O'reilly 而不是 O \'reilly 。 我的疑问是:

$sql    =   "insert into student set 
            std_id  =   $std_id,
            name    =   '$name',
            family  =   '$family',
            ";

当使用addslashes()函数时也会发生这种情况。

2 个答案:

答案 0 :(得分:2)

完全应该发生什么。您想将字符串O'reilly插入数据库,而不是O\'reilly,对吗?

斜线只告诉MySQL下一个'应该是一个文字撇号,而不是表示字符串结尾的撇号/单引号。


PS:您可能需要考虑使用PDO and prepared statements,它提供了更清晰的语法。

答案 1 :(得分:2)

这就是重点。 mysql_real_escape_string仅用于确保查询语法正确。此查询语法不正确:

INSERT INTO ... name = 'O'Reilly'

字符串终结符'不明确/错位 逃脱,这变为:

INSERT INTO ... name = 'O\'Reilly'

现在语法是明确的,'之后的O 不是字符串终结符,它是一个文字值。那就是所有mysql_real_escape_string应该做的。你希望你的数据库中的值为“O \'Reilly”,因为那是垃圾。

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