Vous obtenez probablement cette erreur parce qu'aucun enregistrement n'a été trouvé dans la base de données correspondant à vos critères.
Le moyen le plus simple de résoudre cette erreur consiste à vérifier si la base de données a d'abord renvoyé quelque chose.
$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']) {
// ...
}
Si vous ne vous souciez pas de savoir si la base de données a renvoyé quelque chose, vous pouvez simplement fournir une valeur par défaut. Par exemple :
$emailRes = $query->fetch(PDO::FETCH_ASSOC);
$email = $emailRes['Email'] ?? ''; // default: empty string
La bonne façon de vérifier l'existence dans la base de données à l'aide de PDO est :
$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!");
}
Au lieu de récupérer la ligne et de refaire la comparaison en PHP, je récupère un nombre de lignes correspondantes dans la base de données et j'utilise ce nombre comme un booléen dans le if
déclaration. fetchColumn()
va récupérer une seule colonne de la première ligne et si j'utilise COUNT(*)
Je sais qu'il y aura toujours une ligne.
Vous pouvez également le faire en une seule requête :
$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!");
}