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
,因为它在该上下文中没有任何用途。在这种情况下,您没有任何可能引发异常的内容。