Otrzymujesz ten błąd prawdopodobnie dlatego, że w bazie danych nie znaleziono rekordów spełniających Twoje kryteria.
Najłatwiejszym sposobem rozwiązania tego błędu jest sprawdzenie, czy baza danych coś zwróciła najpierw.
$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']) {
// ...
}
Jeśli nie obchodzi Cię, czy baza danych coś zwróciła, możesz po prostu podać wartość domyślną. Na przykład:
$emailRes = $query->fetch(PDO::FETCH_ASSOC);
$email = $emailRes['Email'] ?? ''; // default: empty string
Prawidłowy sposób sprawdzenia istnienia w DB za pomocą PDO to:
$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!");
}
Zamiast pobierać wiersz i ponownie przeprowadzać porównanie w PHP, pobieram liczbę pasujących wierszy z bazy danych i używam tej liczby jako wartości logicznej w if
oświadczenie. fetchColumn()
pobierze pojedynczą kolumnę z pierwszego wiersza i jeśli użyję COUNT(*)
Wiem, że zawsze będzie jeden rząd.
Możesz to również zrobić w jednym zapytaniu:
$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!");
}