如何构建此查询验证,以便它独立验证电子邮件和密码。因此,如果用户输入正确的电子邮件,则位置(请参阅代码)将与用户输入正确的密码但错误的电子邮件不同?这是查询,以及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();
}
答案 0 :(得分:1)
SELECT hashed_password = '{$hashed_password}' AS is_password_correct
FROM employees WHERE email = '{$email}'
如果没有与$ email相匹配的条目,此查询将返回零行。
如果存在与$ email匹配的行,则查询将返回1或0,具体取决于select-list中的布尔相等比较是true还是false。
然后,您可以根据三种可能的状态在应用中执行不同的操作。
你应该停止在PHP中使用已弃用的“mysql”函数,它们将在下一版本的PHP中消失。使用mysqli或PDO。
此外,您应该学会使用准备好的查询并将$ hashed_password和$ email作为查询参数传递。然后,您可以避免SQL注入漏洞,而不必担心转义字符串。
以下是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
}
}
}
答案 1 :(得分:0)
这样做的一个简单方法是使用OR
子句而不是AND
并在PHP端进行比较:
$mysql = mysql_query("SELECT email, hashed_password FROM employees WHERE email = '{$email}' OR hashed_password = '{$hashed_password} '");
if ( mysql_num_rows($mysql) < 1 )
{
// e-mail and password not found
header ("Location: index.php?error=1");
die();
}
else
{
$rows = mysql_fetch_assoc($mysql);
if ($rows["email"] != $email)
{
// e-mail not found
}
else if ($rows["hashed_password"] != $hashed_password)
{
// passwords do not match
}
}