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

时间:2015-03-08 07:20:50

标签: php mysql forms validation login

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

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');
   }

1 个答案:

答案 0 :(得分:0)

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

我们先来看看connect函数:

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

这是正确的。

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

  • 检索电子邮件与loginName匹配的行。
  • 如果没有行(电子邮件与任何用户都不匹配),请重定向到管理员的home.php?变量$err = 1
  • 重新检查电子邮件(适合?)并验证密码。
    • 如果密码正确,它会检查权限并重定向到通讯员home.php
    • 请注意,如果权限没有匹配项,则会将您重定向到admin 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