如何准备PHP中的选择?

时间:2018-01-26 18:53:31

标签: php mysql

我正在尝试从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。

1 个答案:

答案 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或在散列之前使用任何其他清理机制。这样做更改密码并导致不必要的额外编码。