我如何构造此查询验证,以便它独立验证电子邮件和密码。因此,如果用户输入正确的电子邮件,位置(见代码)将不同于用户输入正确密码但输入错误电子邮件的位置?这是查询,if 语句设置的是 GET 错误变量:
$mysql = mysql_query("SELECT * FROM employees WHERE email = '{$email}' AND hashed_password = '{$hashed_password} '");
if ( mysql_num_rows($mysql) < 1 )
{
header ("Location: index.php?error=1");
die();
}
最佳答案
SELECT hashed_password = '{$hashed_password}' AS is_password_correct
FROM employees WHERE email = '{$email}'
如果没有与 $email 匹配的条目,此查询将返回零行。
如果有匹配 $email 的行,查询将根据选择列表中的 bool 相等比较是真还是假返回 1 或 0。
然后,您可以根据三种可能的状态在您的应用中执行不同的操作。
您应该停止在 PHP 中使用已弃用的“mysql”函数,它们将在下一版本的 PHP 中消失。使用 mysqli 或 PDO。
您还应该学习使用准备好的查询并将您的 $hashed_password 和 $email 作为查询参数传递。这样您就可以避免 SQL 注入(inject)漏洞,而不必担心转义字符串。
这是一个完整的 PDO 示例(未经测试):
$stmt = $pdo->prepare("SELECT hashed_password = :password AS is_password_correct
FROM employees WHERE email = :email");
if ($stmt === false) {
// always check for errors
}
$result = $stmt->execute(array(":password"=>$hashed_password, ":email"=>$email));
if ($result === false) {
// always check for errors
}
if ($stmt->rowCount() == 0) {
// no such user
} else {
while ($row = $stmt->fetch()) {
if ($row["is_password_correct"] == 1) {
// password is correct for the given user
} else {
// password is wrong
}
}
}
关于MySQL条件检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14490660/