Попытка получить доступ к смещению массива по значению типа bool - PullRequest
1 голос
/ 04 февраля 2020
$query = $pdo -> prepare("SELECT * FROM Users WHERE Username =:Username");
$query->bindParam(':Username', $name);
$query->execute();

$nameRes = $query->fetch(PDO::FETCH_ASSOC);
if ($nameRes['Username']==$_POST['username']) {
    die ("Username is already in use!");
}   

$query = $pdo -> prepare("SELECT * FROM Users WHERE Email =:Email");
$query->bindParam(':Email', $email);
$query ->execute();
$emailRes = $query->fetch(PDO::FETCH_ASSOC);

if ($emailRes['Email']==$_POST['email']) {
    die ("Email is already in use!");
}

У меня есть этот код на странице регистрации моего приложения, и когда имя пользователя свободно, но электронная почта не используется, и наоборот, я получаю это

Примечание: Попытка получить доступ к смещению массива на значение типа bool

Хорошо, результат возвращает false, но что делать в этой ситуации? Примечание: это на php v7.4 то же самое работало на v7.3

1 Ответ

1 голос
/ 24 марта 2020

Вы получаете эту ошибку, вероятно, потому что в базе данных не найдено записей, соответствующих вашим критериям.

Это не то, как вы бы проверяли наличие в БД с помощью PDO. Правильный путь будет следующим:

$query = $pdo->prepare("SELECT COUNT(*) FROM Users WHERE Username =:Username");
$query->execute([':Username' => $name]);
if ($query->fetchColumn()) {
    throw new \Exception("Username is already in use!");
}

$query = $pdo->prepare("SELECT COUNT(*) FROM Users WHERE Email =:Email");
$query->execute([':Email' => $email]);
if ($query->fetchColumn()) {
    throw new \Exception("Email is already in use!");
}

Вместо извлечения строки и повторного сравнения в PHP Я извлекаю количество совпадающих строк из базы данных и использую это число в качестве логического значения в if заявление. fetchColumn() извлечет один столбец из первой строки, и если я использую COUNT(*), я знаю, что всегда будет одна строка.

Вы также можете сделать это одним запросом:

$query = $pdo->prepare("SELECT COUNT(*) FROM Users WHERE Username =:Username OR  Email =:Email");
$query->execute([':Username' => $name, ':Email' => $email]);
if ($query->fetchColumn()) {
    throw new \Exception("Username or email is already in use!");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...