Ricevi questo errore probabilmente perché non sono stati trovati record nel database corrispondenti ai tuoi criteri.
Il modo più semplice per risolvere questo errore è controllare prima se il database ha restituito qualcosa.
$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']) {
// ...
}
Se non ti interessa se il database ha restituito qualcosa, puoi semplicemente fornire un valore predefinito. Ad esempio:
$emailRes = $query->fetch(PDO::FETCH_ASSOC);
$email = $emailRes['Email'] ?? ''; // default: empty string
Il modo corretto per verificare l'esistenza nel DB utilizzando 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!");
}
Invece di recuperare la riga e fare di nuovo il confronto in PHP, sto recuperando un conteggio delle righe corrispondenti dal database e uso quel conteggio come booleano in if
dichiarazione. fetchColumn()
preleverà una singola colonna dalla prima riga e se utilizzo COUNT(*)
So che ci sarà sempre una riga.
Puoi anche farlo in una query:
$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!");
}