sql >> Database teknologi >  >> RDS >> Mysql

Forsøger at få adgang til array offset på værdien af ​​typen bool

Du får sandsynligvis denne fejl, fordi der ikke blev fundet nogen poster i databasen, der matchede dine kriterier.

Den nemmeste måde at løse denne fejl på er at kontrollere, om databasen returnerede noget 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']) {
    // ...
}

Hvis du er ligeglad med, om databasen returnerede noget, så kan du blot angive en standardværdi. For eksempel:

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

Den korrekte måde at kontrollere, om der findes i DB ved hjælp af PDO, er:

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

I stedet for at hente rækken og foretage sammenligningen igen i PHP henter jeg en optælling af matchende rækker fra databasen, og jeg bruger denne optælling som en boolean i if udmelding. fetchColumn() henter en enkelt kolonne fra den første række, og hvis jeg bruger COUNT(*) Jeg ved, at der altid vil være én række.

Du kan også gøre det i én forespørgsel:

$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. MySQL-forbindelse over SSH-tunnel

  2. 9 virkelig nyttige MySQL-datofunktioner, der er nemme at huske

  3. Azure Automation Methods

  4. Left Join udkonkurrerer Inner Join?