Получавате тази грешка вероятно, защото в базата данни не бяха намерени записи, отговарящи на вашите критерии.
Най-лесният начин да разрешите тази грешка е първо да проверите дали базата данни е върнала нещо.
$emailRes = $query->fetch(PDO::FETCH_ASSOC);
// VVV - Here I am checking if there was anything returned and then I check the condition
if($emailRes && $emailRes['Email']==$_POST['email']) {
// ...
}
Ако не ви интересува дали базата данни е върнала нещо, тогава можете просто да предоставите стойност по подразбиране. Например:
$emailRes = $query->fetch(PDO::FETCH_ASSOC);
$email = $emailRes['Email'] ?? ''; // default: empty string
Правилният начин за проверка за съществуване в DB чрез 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!");
}