我试图在我的应用上完成我的登录功能但是在完成它时遇到了麻烦。我不得不将users
与reps
分成两个不同的表格。当创建其中任何一个帐户时,我会仔细检查两个表中是否已经退出用户名,因此没有重复的用户名。
说到我的登录功能,我知道我的查询不正确,因为如果我只搜索用户表并尝试使用该用户表中的用户登录,它就可以正常工作。我想同时查看两个表,但我在以下查询中遇到错误:
public function login($username, $password){
// Find the username if it exists
$user = $this->fetch_array("SELECT * FROM users WHERE username='{$username}' UNION SELECT * FROM reps WHERE username='{$username}'");
// Kill the query if the username is not found
if(!$user){
session_unset();
$_SESSION["message"] = "Username/Password not found.";
$_SESSION["message-color"] = "red";
}
// If username is found, verify if the password is correct
if(password_verify($password, $user["password"])) {
// If password is correct, set our `$_SESSION` variables
// Then redirect to selected page
$_SESSION['current_user'] = $user['username'];
$_SESSION['current_user_id'] = $user['id'];
$_SESSION['current_user_role'] = $user['role'];
switch ($_SESSION['current_user_role']) {
case "administrator":
redirect_to("mod-administrator/");
break;
case "manager":
redirect_to("mod-manager/");
break;
case "representative":
redirect_to("mod-representative/");
break;
}
}else{
// If password is not correct just return false and stay on login page and unset the session;
session_unset();
$_SESSION['message'] = 'Username/Password not found';
$_SESSION['message-color'] = 'red';
}
}
也许我没有使用' UNION'正确的方法?任何帮助将不胜感激。
答案 0 :(得分:1)
当您使用UNION
时,两个子查询都必须选择相同数量的列,并且等效列应位于列表中的相同位置,因为列名称将来自{{ 1}}第一个查询的列表。您应该更改查询,以便只选择所需的特定列,这些列位于两个表中。
SELECT
如果我怀疑$user = $this->fetch_array("SELECT id, username, role, password FROM users WHERE username='{$username}'
UNION
SELECT id, username, role, password FROM reps WHERE username='{$username}'");
表中没有role
列,则需要在其中放置占位符。
users
更好的整体设计是在$user = $this->fetch_array("SELECT id, username, 'user' AS role, password FROM users WHERE username='{$username}'
UNION
SELECT id, username, role, password FROM reps WHERE username='{$username}'");
表中获取用户和代表的登录信息。 users
表只有reps的附加信息,并且reps
表的外键用于登录详细信息。然后,您可以使用users
LEFT JOIN