PHP显示一次错误代码

PHP显示一次错误代码,php,Php,当用户单击登录时,数据库阵列中的每个用户都会显示“错误的电子邮件或密码”。如果用户输入错误的电子邮件/密码,是否有人能告诉我正确的方向,只显示一次错误代码? 我正在使用存储用户 if (isset($_POST['login'])) { $TempEmail = strtolower($_POST['email']); $TempPass = $_POST['password']; // Get Keys From DB; $keys = $users-&

当用户单击登录时,数据库阵列中的每个用户都会显示“错误的电子邮件或密码”。如果用户输入错误的电子邮件/密码,是否有人能告诉我正确的方向,只显示一次错误代码? 我正在使用存储用户

    if (isset($_POST['login'])) {
    $TempEmail = strtolower($_POST['email']);
    $TempPass = $_POST['password'];
    // Get Keys From DB;
    $keys = $users->getKeys();
    // Check If DB is Empty
    if (!empty($keys)) {
        foreach ($keys as $key) {
            $user = $users->get($key);
            $email = strtolower($user['Email']);
            $password = $user['Password'];
            $hash = password_verify($TempPass, $password);
            try {
                if (($TempEmail === $email) && ($hash === true))
                {
                    $_SESSION['use']=$email;
                    // On Successful Login redirects to home page
                    header("Location:/home/");
                }
                else
                {
                    echo "Wrong Email Or Password";
                    //break;
                }
            } catch (Exception $e) {
                return $e->getMessage();
            }
        }
    } else {
        echo "DB Is Empty";
        exit;
    }
}

foreach循环遍历所有的$keys,因此对于每个错误的key,它都会回显“错误的电子邮件或密码”。 将成功查询的结果保存在变量中,即$success=false。如果找到正确的登录名,请将其设置为true。在foreach循环之后,您可以编写

if(!$success){echo "Wrong password"};
只需将
echo“错误的电子邮件或密码”
移动到
foreach
-循环之后,而不是移动到循环内部。如果找到电子邮件且密码匹配,则在代码到达该点之前,用户仍将被重定向

foreach ($keys as $key) {
    // Your current code, minus the echo.
}

// This is after the foreach and will only be executed if there were
// no match for the email and password.
echo "Wrong Email Or Password";

只需记住添加一个
退出
标题('Location:…')之后阻止PHP执行更多操作。

我认为这更方便用户:

$login = false;
foreach ($keys as $key) {
    $user = $users->get($key);
    $email = strtolower($user['Email']);
    $password = $user['Password'];
    $hash = password_verify($TempPass, $password);
    try {
        if ($TempEmail === $email) {
            if ($hash === true) {
                $login = true;
                $_SESSION['use'] = $email;
                // On Successful Login redirects to home page
                header("Location:/home/");
            } else {
                break;
            }
        }
    } catch (Exception $e) {
        return $e->getMessage();
    }
}
if (!$login) {
    echo "Wrong Email Or Password";
}

@chris85如果我取消注释//break,那么它将只在数组中的一个用户上运行并退出。在查询中使用
WHERE
仅获取带有该电子邮件的用户。哦,是的。我看错了。将其分配给变量,并在执行后回显该变量。不过,这可能应该用另一种方法来完成。@MagnusEriksson这不是SQL,在这种情况下,我使用的最佳解决方案是什么?正如Magnus Eriksson回答的那样,最好的方法是更改SQL查询。如果您不能做到这一点,那么快速猜测是将成功查询的结果保存在一个变量中,即$success=false。如果找到正确的登录名,请将其设置为true。在foreach循环之后,您可以放置if(!$success){echo“error password”};我怎么就想不起来?哇,谢谢你,真是太好了。“有什么办法改进我的代码吗?”丹尼克-不用担心。有时很容易忽略明显的解决方案:-)@Danik-首先,您可以删除整个
try/catch
,因为它在该上下文中没有任何用途。在这种情况下,您没有任何可能引发异常的内容。