我正在尝试从SQL注入中保护我的数据库,我似乎无法使这个语句起作用。我已经完成了几次这些尝试,但不是这个。
$stmt = $db->prepare("SELECT name, pass, email FROM users WHERE salt=?");
$stmt->bind_param("s", $salt);
$stmt->execute();
$stmt->bind_result($stuff1,$stuff2,$stuff3);
$stmt->store_result();
while ( $stmt->fetch() ) {
var_dump($stuff1." - ".$stuff2." - ".$stuff3."<br />");
}
$stmt->free_result();
$stmt->close();
我已经设法通过放置var_dump来一直执行它,但我不明白为什么结果/获取不起作用。对我错过的内容有一个简单的解释吗?
编辑:我期待的是从我的表中检索姓名,通过和发送电子邮件,但我只是得到NULL。
答案 0 :(得分:2)
试试这个:
if($stmt = $db->prepare("SELECT name, pass, email FROM users WHERE salt=?")) {
$stmt->bind_param("s", $salt);
$stmt->execute();
$stmt->bind_result($name, $pass, $email);
while ($stmt->fetch()) {
echo "{$name} - {$pass} - {$email}<br>";
}
$stmt->close();
} else {
print_r($db->errorInfo());
}
主要更改是检查在任何参数执行任何操作之前是否设置了$stmt
。您也不需要store_result()
或free_result()
。另外,我添加了else
语句,如果无法设置$stmt
,则应显示错误。
注意:您应该使用 PHP的built-in functions (password_hash()
和password_verify()
)来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用password_hash()
compatibility pack。 没有必要到escape passwords或在散列之前使用任何其他清理机制。这样做更改密码并导致不必要的额外编码。