如何转义输入但保存未转义到数据库中

时间:2011-07-08 22:35:27

标签: php mysql escaping

据说为了防止SQL注入,应该过滤输入数据,例如。使用addslashes或mysql_real_escape_string取决于使用的连接模块

但是,使用斜杠将使用addslashes转义的数据保存到数据库中,因此用户姓氏将保存为O \'Reilly而不是O'Reilly。需要使用stripslashes正确显示它。

那么如何使用addslashes并保存到数据库中而不使用斜杠?实际上它应该是这样做的吗?

3 个答案:

答案 0 :(得分:6)

您不能使用addslashes使用适当的特定于数据库的转义函数,例如mysql_real_escape_string

如果您正在使用PDO,那么使用预准备语句将作为绑定过程的一部分转义变量。在这种情况下,您需要做的就是:

$pdo = new PDO($dsn, $user, $name);
$stmt = $pdo->prepare('INSERT INTO your_table (col1, col2,col3) VALUES (?, ?, ?)');
$stmt->execute(array('value 1', 'value 2', 'value 3');

OR为了额外的可读性和更高的重用性,您可以使用命名参数:

$pdo = new PDO($dsn, $user, $name);
$stmt = $pdo->prepare('INSERT INTO your_table (col1, col2,col3) VALUES (:col1, :col2, :col3)');
$stmt->execute(array(':col1' =>'value 1', ':col2' =>'value 2', ':col3' =>'value 3');

答案 1 :(得分:0)

addslashes应该是一种适合所有人的逃避机制。如果MySQL转义addslash - 转义字符串,当然包含addslash斜杠的值将保存到数据库中。使用或者,不是两者都使用。

话虽如此,不要使用addslashes 。它没有任何实际意义。在适当的情况下使用特定的转义机制。即,仅使用mysql_real_escape_string。或准备好的陈述,以避免开始的整个逃避混乱。

答案 2 :(得分:0)

如果您使用预准备语句(例如,通过PDO或mysqli库),则无需转义或过滤任何内容。