sql >> Databáze >  >> RDS >> Mysql

Pokus o přístup k offsetu pole na hodnotě typu bool

Tato chyba se vám zobrazuje pravděpodobně proto, že v databázi nebyly nalezeny žádné záznamy odpovídající vašim kritériím.

Nejjednodušší způsob, jak vyřešit tuto chybu, je nejprve zkontrolovat, zda databáze něco vrátila.

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

Pokud je vám jedno, zda databáze něco vrátila, můžete jednoduše zadat výchozí hodnotu. Například:

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

Správný způsob, jak zkontrolovat existenci v DB pomocí PDO, je:

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

Místo načítání řádku a opětovného porovnávání v PHP načítám počet odpovídajících řádků z databáze a tento počet používám jako booleovský v if prohlášení. fetchColumn() načte jeden sloupec z prvního řádku a pokud použiji COUNT(*) Vím, že vždy bude jeden řádek.

Můžete to také udělat v jednom dotazu:

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



  1. Nainstalujte PHP s Postgresql na MAC pomocí homebrew

  2. Jak nakonfigurovat Tomcat pro připojení k MySQL

  3. MySQL a NoSQL:Pomozte mi vybrat ten správný

  4. Náhodný PRIMÁRNÍ KLÍČ pro Innodb