Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Uncaught Error: Call to a member function fetchAll() on bool (PDO)

Eu estou tentando verificar se o usuário acertou o seu login e senha para realizar login, mas toda vez que chamo o fetchAll do PDO, uma exceção é lançada... o que está de errado? alguém sabe me dizer?

ERRO: Fatal error: Uncaught Error: Call to a member function fetchAll() on bool in C:\Users\usuario\Desktop\php\logar.php:24 Stack trace: #0 C:\Users\usuario\Desktop\php\index.php(19): require_once() #1 {main} thrown in C:\Users\usuario\Desktop\php\logar.php on line 24.

PS: código abaixo foi resumido, não se baseie pela linha da exception.

   $senha = md5($_POST['senha']);
    $email = $_POST['email'];

    $query = "SELECT * FROM usuario WHERE email = :email AND senha = :senha";

    $queryResultado = $conexao->prepare($query)->query(array(':email' => $email, ':senha' => $senha));

    if ($queryResultado->fetchAll())
    {
        $_SESSION['usuario_logado'] = $email;
        header("Location: home.php");
        die();
    }
4 respostas

Victor, boa tarde!

Isso está ocorrendo pois o retorno de $queryResultado é um booleano, dados boleanos não possuem a função fetchAll();

Como solução tente usar o bindParam() ao invés de usar array().

Abaixo vou deixar um exemplo com o bindParam():

public function logarUsuario($email, $senha)
    {
        try {
            $sql  = "SELECT * FROM usuario WHERE email = :email AND senha = :senha";
            $stmt = DB::prepare($sql);
            $stmt->bindParam(':email', $email);
            $stmt->bindParam(':senha', $senha);
            $stmt->execute();
            return json_decode(json_encode($stmt->fetch()), true);
        }
        catch (PDOException $e) {
            echo "Error:" . $e->getMessage();
        }
    }

espero ter ajudado e bons estudos!

Olá, Victor.

O erro está na linha $queryResultado = $conexao->prepare($query)->query(array(':email' => $email, ':senha' => $senha));.

O método prepare devolve um PDOStatement. Você está tentando chamar o método query dele, que não existe.

   $senha = md5($_POST['senha']); 
    $email = $_POST['email'];

    $query = "SELECT * FROM usuario WHERE email = :email AND senha = :senha";

    $queryResultado = $conexao->prepare($query)->query(array(':email' => $email, ':senha' => $senha));

Só pra ressaltar, utilizar MD5 para armazenar senhas não é seguro.

No futuro curso de PHP para a Web (que já está no forno pra sair), é ensinado com mais detalhes como trabalhar com senhas em bancos de dados.

Pelo que eu entendi, para eu armazenar os resultados eu chamo diretamente o FetchAll() depois do query, pois de baixo dos panos pelo que eu entendi, o método query registra os resultados na instância?? e não pelo retorno dele? (que no caso, é boolean).

Então, seria assim?


$sql  = "SELECT * FROM usuario WHERE email = :email AND senha = :senha";
$stmt = DB::prepare($sql);
$stmt->bindParam(':email', $email);
$stmt->bindParam(':senha', $senha);
$stmt->query();

#Vai dar erro por não ter percorido todo o resultado da query.?
$stmt->fetch(); 

Só mais uma dúvida: No caso, o query ele exige que eu itere por todo o resultado se não ele dará erro na próxima query que eu for fazer, certo? e enquanto o Execute não?

Eu vou usar o Execute mesmo, mas é só para matar duvida :p

solução!

Victor, a classe PDOStatement não tem esse método query. Você não deve chamá-lo.

Antes de executar um método fetch você precisa chamar o método execute do PDOStatement, da forma que o Felipe exemplificou na primeira resposta.