PHP& mySQLi:使用prepare语句时是否还需要检查用户输入?

时间:2012-01-04 23:27:11

标签: php database mysqli sql-injection prepared-statement

如果我在mySQLi中使用prepare语句,我是否还需要以任何方式转义或检查用户输入。例如,如果我有代码:

$members = new mysqli("localhost", "user", "pass", "members");
$r_email = $_POST['r_email'];
$check = $members->prepare("select user_id from users where email = ?");
$check->bind_param('s', $r_email);
$check->execute();
$check->store_result();
if ($check->num_rows > 0) {
    echo "user already registered";
    $check->close();
}
$members->close();

我是否需要将$r_email = $_POST['r_email']更改为$r_email = mysql_real_escape_string($_POST['r_email']);

感谢。

3 个答案:

答案 0 :(得分:6)

您不需要使用预准备语句进行转义,但验证用户输入仍然是一个好主意(例如,已填充必填字段,数字字段包含数值等)

答案 1 :(得分:4)

如果您要作为参数传递,则无需转义值。实际上,您不应该这样做,因为您将在文档中插入文字反斜杠。

这些必须是准备时SQL查询的一部分,因此RDBMS可以解析和验证它们。或者在表单上验证用户输入。

始终在SQL语句中放入SQL-Escape数据。永远不要在SQL语句之外使用SQL-Escape数据。

答案 2 :(得分:2)

无需转义输入,但不要吝啬验证,您仍然可能会出现逻辑错误,例如提交空电子邮件,或者其他一些可能会让您感到厌烦的副作用。

始终验证,以后在进行错误测试时保持理智,这是我的座右铭@@。