我正在尝试完成应用程序上的登录功能,但在完成时遇到问题。我不得不拆分 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”?任何帮助将不胜感激。
最佳答案
当您使用UNION
时,两个子查询必须选择相同数量的列,并且等效列应位于列表中的相同位置,因为列名称将来自第一个查询的 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}'");
如果正如我怀疑的那样,users
表中没有 role
列,则需要在其中放置一个占位符。
$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
表仅包含代表的附加信息,以及用于 users
表的登录详细信息的外键。然后您可以使用LEFT JOIN
SELECT u.id, u.username, IFNULL(r.role, 'user') role, u.password
FROM users AS u
LEFT JOIN reps AS r ON u.id = r.user_id
关于php - 一次搜索多个表以查找值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35003311/