php - 一次搜索多个表以查找值

标签 php mysql authentication

我正在尝试完成应用程序上的登录功能,但在完成时遇到问题。我不得不拆分 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”?任何帮助将不胜感激。

最佳答案

当您使用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/

相关文章:

MySQL选择发件人和收件人之间的最后一次转换消息

c# - Microsoft 身份验证注销不起作用

php登录脚本中只有一个用户在变量中设置

php 文件不起作用

php - 使用php 5秒将数据保存到MySQL

php - Paypal Pro 不在 magento 中显示运输方式

php - 使用 FFmpeg 提取 FLV 帧 - 支持的格式

php - 使用 pdo 将克隆行插入数据库

mysql - Symfony+推进 : Setting connection collation

java - 使用 AES-GCM 中的 AAD