我使用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()函数时也会发生这种情况。
答案 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)。