Du får det här felet förmodligen för att det inte fanns några poster i databasen som matchade dina kriterier.
Det enklaste sättet att lösa detta fel är att kontrollera om databasen returnerade något först.
$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']) {
// ...
}
Om du inte bryr dig om databasen returnerade något, kan du helt enkelt ange ett standardvärde. Till exempel:
$emailRes = $query->fetch(PDO::FETCH_ASSOC);
$email = $emailRes['Email'] ?? ''; // default: empty string
Det korrekta sättet att kontrollera om det finns i DB med PDO är:
$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!");
}
Istället för att hämta raden och göra jämförelsen igen i PHP hämtar jag ett antal matchande rader från databasen och jag använder det räknat som en boolean i if
påstående. fetchColumn()
hämtar en enda kolumn från den första raden och om jag använder COUNT(*)
Jag vet att det alltid kommer att finnas en rad.
Du kan också göra det i en fråga:
$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!");
}