Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Tentando acessar o deslocamento da matriz no valor do tipo bool


Você está recebendo este erro provavelmente porque não foram encontrados registros no banco de dados que correspondam aos seus critérios.

A maneira mais fácil de resolver esse erro é verificar se o banco de dados retornou alguma coisa primeiro.
$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 você não se importa se o banco de dados retornou alguma coisa, você pode simplesmente fornecer um valor padrão. Por exemplo:
$emailRes = $query->fetch(PDO::FETCH_ASSOC);
$email = $emailRes['Email'] ?? ''; // default: empty string

A maneira correta de verificar a existência no banco de dados usando o 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!");
}

Em vez de buscar a linha e fazer a comparação novamente em PHP, estou buscando uma contagem de linhas correspondentes do banco de dados e uso essa contagem como um booleano no if demonstração. fetchColumn() irá buscar uma única coluna da primeira linha e se eu usar COUNT(*) Eu sei que sempre haverá uma linha.

Você também pode fazer isso em uma 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!");
}