sql >> Databasteknik >  >> RDS >> Mysql

Försöker komma åt arrayoffset på värdet av typen bool

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



  1. Hur förhindrar jag att en databastrigger återkommer?

  2. Hur uttrycker jag en har många genom relation i Entity Framework 5?

  3. Skillnad mellan kodning och sortering?

  4. Är det någon som har betydande bevis på att CHAR är snabbare än VARCHAR?