一次搜索更多的表比一个找到价值

时间:2016-01-25 22:05:22

标签: php mysql login

我试图在我的应用上完成我的登录功能但是在完成它时遇到了麻烦。我不得不将usersreps分成两个不同的表格。当创建其中任何一个帐户时,我会仔细检查两个表中是否已经退出用户名,因此没有重复的用户名。

说到我的登录功能,我知道我的查询不正确,因为如果我只搜索用户表并尝试使用该用户表中的用户登录,它就可以正常工作。我想同时查看两个表,但我在以下查询中遇到错误:

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'正确的方法?任何帮助将不胜感激。

1 个答案:

答案 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