我决定尝试mysqli::prepare
,我想知道在我做的另一次准备中使用prepare是否有效:
$stmt = $mysqli->prepare('SELECT mail FROM members WHERE id = ?') or die($mysqli->error);
$stmt->bind_param('i', $db['id']);
$db['id'] = $_SESSION['id'];
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($db['mail']);
if($stmt->num_rows === 1) {
$stmt->fetch();
$stmt = $mysqli->prepare('UPDATE members SET pass = ? WHERE id = ?') or die($mysqli->error);
$stmt->bind_param('si', $db['pass'], $db['id']);
$db['pass'] = $data['pass'];
$db['id'] = $_SESSION['id'];
$stmt->execute();
echo 'Your password has been changed';
}
$stmt->close();
我仍然没有理解为什么使用prepare
而不仅仅是query
更好。我的意思是,如果我需要获取输入,并在提交之前清除它(删除标签和不允许的特殊字符以及MySQL SELECT
,WHERE
等...),有什么区别?
答案 0 :(得分:0)
SQL注入是在将数据绑定到查询之前准备数据的原因。你没有注射问题,这就是你不能看到不同的原因。 当您将用户输入的数据提交到数据库时,始终使用prepare语句,这样您就不必担心转义单个字符串。 用户可以输入类似" myUser //?"这可以使您的查询忽略queryString的某些部分。 例: 如果您的网站需要用户名和密码,用户可以输入 用户名字段中的-james //?在密码字段上 这可以使您的查询忽略密码字段。