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

Tentativo di accesso all'offset dell'array sul valore di tipo bool

Ricevi questo errore probabilmente perché non sono stati trovati record nel database corrispondenti ai tuoi criteri.

Il modo più semplice per risolvere questo errore è controllare prima se il database ha restituito qualcosa.

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

Se non ti interessa se il database ha restituito qualcosa, puoi semplicemente fornire un valore predefinito. Ad esempio:

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

Il modo corretto per verificare l'esistenza nel DB utilizzando PDO è:

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

Invece di recuperare la riga e fare di nuovo il confronto in PHP, sto recuperando un conteggio delle righe corrispondenti dal database e uso quel conteggio come booleano in if dichiarazione. fetchColumn() preleverà una singola colonna dalla prima riga e se utilizzo COUNT(*) So che ci sarà sempre una riga.

Puoi anche farlo in una query:

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