Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Es wird versucht, auf den Array-Offset für einen Wert vom Typ bool zuzugreifen

Sie erhalten diesen Fehler wahrscheinlich, weil in der Datenbank keine Datensätze gefunden wurden, die Ihren Kriterien entsprechen.

Der einfachste Weg, diesen Fehler zu beheben, besteht darin, zuerst zu prüfen, ob die Datenbank etwas zurückgegeben hat.

$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']) {
    // ...
}

Wenn es Ihnen egal ist, ob die Datenbank etwas zurückgegeben hat, können Sie einfach einen Standardwert angeben. Zum Beispiel:

$emailRes = $query->fetch(PDO::FETCH_ASSOC);
$email = $emailRes['Email'] ?? ''; // default: empty string

Der korrekte Weg, um die Existenz in der DB mit PDO zu prüfen, ist:

$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!");
}

Anstatt die Zeile abzurufen und den Vergleich erneut in PHP durchzuführen, hole ich eine Anzahl übereinstimmender Zeilen aus der Datenbank und verwende diese Anzahl als booleschen Wert im if Erklärung. fetchColumn() wird eine einzelne Spalte aus der ersten Zeile abrufen und wenn ich COUNT(*) verwende Ich weiß, dass es immer eine Zeile geben wird.

Sie können dies auch in einer Abfrage tun:

$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!");
}