我怎样才能使这个准备好的语句代码?

时间:2017-11-30 12:11:20

标签: php mysqli prepared-statement

我的印象是这是一个准备好的声明脚本,但看起来我错了。我该怎么把它变成一个呢?什么是准备好的声明?

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

$sql = "SELECT Status FROM Users WHERE Username = ? AND Password = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ss", $_GET['username'], $_GET['password']);
$stmt->execute();
$result = $stmt->get_result();
$rows = $result->fetch_all(MYSQLI_ASSOC);

if ($result->num_rows > 0) {
// output data of each row or remove while loop if you wish
    while($row = $result->fetch_assoc()) {
        echo "<b style='color:green'>Found</b>";
    }
} else {
    echo "0 results";
}
$conn->close();
?>

1 个答案:

答案 0 :(得分:1)

那不是使用准备好的陈述。这是一个没有错误/结果检查的基本示例: -

$sql = "SELECT Status FROM Users WHERE Username = ? AND Password = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ss", $_GET['username'], $_GET['password']);
$stmt->execute();
$result = $stmt->get_result();
$rows = $result->fetch_all(MYSQLI_ASSOC);

但是,您应该考虑仅选择用户名并检索密码进行比较。如果您不这样做,也应该在数据库中哈希密码。使用php的password_hash()password_verify()。前者有助于散列密码,而后者则用于验证来自html表单或原始来源的发布密码是否与散列密码匹配

语法是

password_hash($_GET['password'], PASSWORD_DEFAULT);

password_verify($_GET['password'], $hashedPasswordFromDatabase);

确保存储密码的列至少为varchar(60)