Erro na consulta em PDO

Boa tarde Pessoal, tenho método que realiza a consulta de usuário no BD. Quando passo um usuário que existe no BD ele retorna os dados certinho, mas quando passo um usuário que não tem no BD, acontece esse erro, não estou conseguindo tratar isso.

Fatal error: Uncaught TypeError: Return value of App\Models\DAO\BaseDAO::select() must be of the type array, boolean returned in C:\xampp\htdocs\bancodequestoes1\App\Models\DAO\BaseDAO.php:54 Stack trace: #0 C:\xampp\htdocs\bancodequestoes1\App\Models\DAO\UsuarioDAO.php(41): App\Models\DAO\BaseDAO->select('SELECT * FROM u...', Array) #1 C:\xampp\htdocs\bancodequestoes1\App\Controllers\UsuarioController.php(13): App\Models\DAO\UsuarioDAO->findByUsuario('sdfs') #2 C:\xampp\htdocs\bancodequestoes1\App\App.php(62): App\Controllers\UsuarioController->login(NULL) #3 C:\xampp\htdocs\bancodequestoes1\index.php(14): App\App->run() #4 {main} thrown in C:\xampp\htdocs\bancodequestoes1\App\Models\DAO\BaseDAO.php on line 54

foi como falei eu outro tópico, quando não existe registro na base ele retorna false, vc pode sempre testar o retorno assim:

$array = $stm->fetch(PDO::FETCH_ASSOC);
if (is_array($array)) {
    //faça algo...
}

Ou orientado a objetos

$obj = $stm->fetch(PDO::FETCH_OBJ);
if (is_object($obj)) {
    //faça algo...
}

E como falei antes, leia a documentação, tá tudo lá, parametros, tipos de retorno etc…

Deixo um plus: quando vc usar fetchAll, tambem pode testar assim:

$lista = $stm->fetchAll(PDO::FETCH_OBJ);
if (!empty($lista)) {
    //faça algo...
}

Isso se não usar foreach, pois o foreach tem um controle especial e se a lista não estiver vazia, ele percorre…

mas ai que ta meu problema, mesmo fazendo essa comparação da erro, não consigo entender.

public function findByUsuario($usuario) {
       
        $result = $this->select("SELECT * FROM usuarios WHERE usuario = :usuario", array(":usuario"=>$usuario));
        
        if(is_array($result)){
            var_dump($result);
        }else {
            echo "vazio";
        }
}

Vou usar só o fetchAll, pelo menos esse funciona, quando não encontra nada traz uma array vazio. já perdi muito tempo nisso.

Obrigado.

Calma…

Esse método:

public function select($rawQuery, $params = array()):array

Voce está forçando um retorno do tipo array, por isso ta dando erro, basta apenas:

public function select($rawQuery, $params = array())

Que ai o return acaba sendo mixed e o fetch funciona legal… cuidado ao usar strict modes sem saber hein!

Outra dica: o proprio execute do stm ja recebe paramentros se quiser…

AO inves de fazer isso:

$stmt = $this->conexao->prepare($rawQuery);
$this->setParams($stmt, $params);
$stmt->execute();

Basta isso:

$stmt = $this->conexao->prepare($rawQuery);
$stmt->execute($params);

Que ele faz um bindParam pra vc com todas chaves do array, vc fez um trampo desnecessário…

E pra finalizar, não duplique tópicos, eu poderia responder pelo outro que vc abriu, mas ia ficar mais confuso ainda pra quem quiser ler (lembre-se outras pessoas podem e terão a mesma duvida que vc…)

Puts! kkk

Como não percebi que tinha colocado um tipo especifico ali :man_facepalming:
Cara perdi muito tempo nisso, eu não sei como são outros desenvolvedores, mas quando não consigo fazer alguma coisa é muito frustrante, é muito desanimador, mas sigo em frente,pois é oque gosto de fazer.

Obrigado mais uma vez :v::+1:

Vai se acostumando, frustrações faz parte senão vc não evolui, sucesso!

1 curtida