Tato chyba se vám zobrazuje pravděpodobně proto, že v databázi nebyly nalezeny žádné záznamy odpovídající vašim kritériím.
Nejjednodušší způsob, jak vyřešit tuto chybu, je nejprve zkontrolovat, zda databáze něco vrátila.
$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']) {
// ...
}
Pokud je vám jedno, zda databáze něco vrátila, můžete jednoduše zadat výchozí hodnotu. Například:
$emailRes = $query->fetch(PDO::FETCH_ASSOC);
$email = $emailRes['Email'] ?? ''; // default: empty string
Správný způsob, jak zkontrolovat existenci v DB pomocí PDO, je:
$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!");
}
Místo načítání řádku a opětovného porovnávání v PHP načítám počet odpovídajících řádků z databáze a tento počet používám jako booleovský v if
prohlášení. fetchColumn()
načte jeden sloupec z prvního řádku a pokud použiji COUNT(*)
Vím, že vždy bude jeden řádek.
Můžete to také udělat v jednom dotazu:
$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!");
}