U krijgt deze foutmelding waarschijnlijk omdat er geen records in de database zijn gevonden die aan uw criteria voldoen.
De eenvoudigste manier om deze fout op te lossen, is door eerst te controleren of de database iets heeft geretourneerd.
$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']) {
// ...
}
Als het u niet uitmaakt of de database iets heeft geretourneerd, kunt u eenvoudig een standaardwaarde opgeven. Bijvoorbeeld:
$emailRes = $query->fetch(PDO::FETCH_ASSOC);
$email = $emailRes['Email'] ?? ''; // default: empty string
De juiste manier om te controleren op bestaan in DB met behulp van PDO is:
$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!");
}
In plaats van de rij op te halen en de vergelijking opnieuw uit te voeren in PHP, haal ik een telling van overeenkomende rijen uit de database en ik gebruik die telling als een boolean in de if
uitspraak. fetchColumn()
haalt een enkele kolom op uit de eerste rij en als ik COUNT(*)
. gebruik Ik weet dat er altijd één rij zal zijn.
Je kunt het ook in één zoekopdracht doen:
$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!");
}