Проверка, существует ли имя пользователя в двух таблицах PHP PDO?

У меня есть таблица пользователей и таблица 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';
}

По сути, я думаю, что это как-то связано с execute или rowCount(), может кто-нибудь сказать мне, где я иду не так? Будучи новичком в pdo, я нахожу это немного запутанным в данный момент.

2 ответа

Решение

Вы можете использовать запрос

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 результатов

Вместо этого используйте 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 совпадают

Другие вопросы по тегам