sql >> Base de Datos >  >> RDS >> Mysql

Intentando acceder al desplazamiento de matriz en el valor de tipo bool

Está recibiendo este error probablemente porque no se encontraron registros en la base de datos que coincidan con sus criterios.

La forma más fácil de resolver este error es verificar si la base de datos devolvió algo primero.

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

Si no le importa si la base de datos devolvió algo, simplemente puede proporcionar un valor predeterminado. Por ejemplo:

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

La forma correcta de verificar la existencia en DB usando PDO es:

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

En lugar de buscar la fila y hacer la comparación nuevamente en PHP, estoy obteniendo un recuento de filas coincidentes de la base de datos y uso ese recuento como un valor booleano en if declaración. fetchColumn() obtendrá una sola columna de la primera fila y si uso COUNT(*) Sé que siempre habrá una fila.

También puedes hacerlo en una sola consulta:

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