【问题标题】:Checking is username exists on two tables PHP PDO?检查两个表PHP PDO上是否存在用户名?
【发布时间】:2012-04-14 10:55:23
【问题描述】:

我有一个 users 表和一个 users_banlist 表。

在我的注册表单上,我想在一个查询中检查某人在表单上输入的用户名是否存在于 users 表中,并查看它是否也存在于 users_banlist 表中。

我可以在单独的查询中自己完成它们,但宁愿一次性完成。

这是我得到的,但即使我输入了一个已被占用的用户名,它也不会告诉我它已经被占用了。

$stmt = $dbh->prepare("
SELECT
  users.user_login,
  users_banlist.user_banlist
FROM
  users ,
  users_banlist
WHERE
  users.user_login = ? OR
  users_banlist.user_banlist = ?");

// checker if username exists in users table or users_banlist table
$stmt->execute(array($username, $username));

if ( $stmt->rowCount() > 0 ) {
    $error[] = 'Username already taken';
}

基本上我认为这与执行或 rowCount() 有关,谁能告诉我哪里出错了?作为 pdo 的新手,我现在发现它有点混乱。

【问题讨论】:

    标签: php pdo mysqli multi-query


    【解决方案1】:

    你可以使用查询

    SELECT
      users.user_login
    FROM
     users 
    WHERE
      users.user_login = ? 
    UNION ALL
    SELECT
      users_banlist.user_banlist
    FROM
      users_banlist
    WHERE
      users_banlist.user_banlist = ?
    

    然后照常进行。您使用的是一个 CROSS JOIN,它返回生成行的笛卡尔积,这些行将第一个表中的每一行与第二个表中的每一行相结合。如果其中一个表返回 0 行,您将获得 0 个结果

    【讨论】:

    • 谢谢你,效果很好,并在 UNION 和 UNION ALL 上进行了搜索,但从不知道它们的存在,它们将在未来的其他查询中派上用场,所以感谢你的帮助 :) phplover
    【解决方案2】:

    改用 SQL JOINS

    SELECT
      users.user_login,
      users_banlist.user_banlist
    FROM
      users INNER JOIN
      users_banlist ON users.ID=users_banlist.user_id
    WHERE
      users.user_login = ? OR
      users_banlist.user_banlist = ?
    

    其中 users.ID 和 users_banlist.user_id 相同

    【讨论】:

    • 有什么理由特别是为什么要使用 joins 而不是 union ?谢谢phplover
    • 我没有正确检查第一行,联合将是这个问题的正确答案
    • 好的,谢谢,仍然感谢您花时间提供帮助,谢谢 phplover
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2010-12-15
    • 2016-01-14
    相关资源
    最近更新 更多