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