MySQL条件检查

时间:2013-01-23 22:34:31

标签: mysql

如何构建此查询验证,以便它独立验证电子邮件和密码。因此,如果用户输入正确的电子邮件,则位置(请参阅代码)将与用户输入正确的密码但错误的电子邮件不同?这是查询,以及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();    
} 

2 个答案:

答案 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_pa​​ssword和$ 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
    }

}