尝试获取登录错误消息/验证以在登录表单上工作


Trying to get login error messages/validation to work on login form?

我有一个会员/管理员站点的登录系统。登录工作正常,但我想验证用户,如果不是正确的用户或密码,则给出错误消息。到目前为止,以我所拥有的,它不会给出任何错误消息,尽管我也没有收到任何错误。

function error_message(){ $error = '';
$loginName = isset($_REQUEST['loginName']) ? $_REQUEST['loginName'] : "";
$password = isset($_REQUEST['password']) ? $_REQUEST['password'] : ""; 
{$results = connect($loginName);
    $loginName === $results['email'];
    $passwords = password_verify($password,$results['password']);
    if(!$results) {$error = 'Username not found'; echo $error; header     ('Location: home.php');} //if no records returned, set error to no username
  else //if found     {if ((isset($password)) !== (isset($passwords)))  //check password, if matched log him in
     { $error = 'Password is wrong'; echo $error; header('Location:     home.php');} //if not matched then set error message
   }
 }
   if(isset($error)) {echo $error; }//if there is an error print it, this      can be anywhere in the page
}

这是我的连接以及它是如何登录的:

function connect($loginName) {
    global $db;
 $query = "SELECT email, level, password FROM members WHERE email     ='$loginName'";
    $result = $db->query($query);
    $results = $result->fetch(PDO::FETCH_ASSOC);
    return $results;
}

登录:

 function login($loginName, $password) {
    $results = connect($loginName);
    if(!$results) {
        header('Location: /tire/admin/home.php?err=1');
    }
    if ($loginName === $results['email'] && password_verify($password,$results['password'])) {
        $_SESSION['loginName'] = $loginName;
        if ($results['level'] === 'a') { // 1 == Administrator
            $_SESSION['level'] = 'Administrator';
            header('Location: /tire/admin/home.php');
         } elseif ($results['level'] === 'm') { // 1 == Member
            $_SESSION['level'] = 'Member';
         header('Location: /tire/member/home.php');
            exit;
     }
     }
     header('Location: /tire/admin/home.php');
   }

哇,这是我们这里有一些讨厌的代码。让我们开始吧:

我们先来看看connect函数:

  • 获取电子邮件与提供的loginName匹配的行。
  • 返回包含所需行的数组。

没错。

现在让我们来看看login函数:

  • 检索电子邮件与loginName匹配的行。
  • 如果没有行(电子邮件与任何用户不匹配),则重定向到带有变量 $err = 1 的 ¿ADMIN? 的home.php
  • 重新检查电子邮件(干什么?)并验证密码。
    • 如果密码正确,它会检查权限并重定向到相应的home.php
    • 请注意,如果没有匹配的权限,它会将您重定向到管理员home.php
    • 请注意,如果密码不正确,则不执行任何操作。

我将改进此代码:

function login($loginName, $password) {
    $results = connect($loginName);
    if(!$results) {
        header('Location: /tire/error.php?code=1');
    }
    if (password_verify($password,$results['password'])) {
        $_SESSION['loginName'] = $loginName;
        if ($results['level'] === 'a') { // 1 == Administrator
            $_SESSION['level'] = 'Administrator';
            header('Location: /tire/admin/home.php');
         } elseif ($results['level'] === 'm') { // 1 == Member
            $_SESSION['level'] = 'Member';
         header('Location: /tire/member/home.php');
            exit;
         }
    } else {
         header('Location: /tire/error.php?code=2');
    }
}

然后在error.php(或任何你想显示错误的地方,这只是一个例子):

switch($_GET['code']){
    case 1:
        $error = "Email invalid";
        break;
    case 2:
        $error = "Password invalid";
        break;
}
print $error

话虽如此,我强烈建议您阅读有关异常的信息并基于此实现逻辑。它比上面的代码干净得多,但我不想如此彻底地更改您的代码。

请参阅:http://php.net/manual/en/language.exceptions.php