Проверка, существует ли имя пользователя в двух таблицах 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 совпадают