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

Problema com PDO

Senhores, boa noite, estou tendo dificuldade para popular os set da minha classe FuncaoDao com o array da minha consulta com PDO. Alguém poderia me explicar o que estou fazendo errado ?

Classe Função

<?php


class Funcao{

    private $id;
    private $nome;



    public function getId() {
        return $this->id;
    }

    public function setId($id) {
        $this->id = $id;
    }

    public function getNome() {
        return $this->nome;
    }

    public function setNome($nome) {
        $this->nome = $nome;
    }


Classe FuncãoDao. A function inserir está funcionando normalmente, equan

<?php

class FuncaoDao 
{

    public function inserir(Funcao $funcao)
    {
    $query  = "INSERT INTO funcoes(nome) VALUES (:nome)";
    $conexao = Conexao::pegarConexao();
    $stmt = $conexao->prepare($query);
    $stmt->bindValue(':nome',$funcao->getNome());
    $stmt->execute();

    }
    public static function listar()
    {
        $funcoes = array();
        $query = "SELECT id,nome FROM funcoes ORDER BY nome ASC";
        $conexao = Conexao::pegarConexao();
        $resultado = $conexao->query($query);
      while($linha = $resultado->fetchAll(PDO::FETCH_ASSOC))
        {
            $id = $linha['id'];
            $nome = $linha['nome'];

            $funcao = Funcao();

            $funcao->setId($id);
            $funcao->setNome($nome);

            array_push($funcoes,$funcao);
        }
        return $funcoes;
    }

Quando chamo a function listar nada é exibido e nenhuma mensagem de erro é exibida.

<?php
$funcoes = FuncaoDao::listar();
foreach($funcoes as funcao) :
    echo $funcao->getId()." - ".$funcao->getNome();
    echo"</br:>";
endforeach;
?>

`
4 respostas

Seu problema está aqui, Gerson:

while($linha = $resultado->fetchAll(PDO::FETCH_ASSOC))

O fetchAll() retorna um array associativo com todos os resultados da query. Não faz sentido esse while sem comparação. O correto seria:


    public static function listar()
    {
        $conexao = Conexao::pegarConexao();
        $resultado = $conexao->query("SELECT id,nome FROM funcoes ORDER BY nome ASC");
        $funcoes = $resultado- >fetchAll(\PDO::FETCH_CLASS, Funcao::CLASS);

        return $funcoes;
    }

Assim já é retornado um array com instâncias da classe Funcao.

;-)

Vinicius, bom dia, fiz as alterações conforme sugeridas, mas a mensagem de erro abaixo foi exibida. Detalhe, se eu remover Funcao::CLASS consigo acessar os atribuídos do objeto, mas sem utilizar os get e set da classe.

PDOException Object
(
    [message:protected] => SQLSTATE[HY000]: General error: could not find user-specified class
    [string:Exception:private] => 
    [code:protected] => HY000
    [file:protected] => C:\xampp\htdocs\UO-BA\class\FuncaoDao.php
    [line:protected] => 12
    [trace:Exception:private] => Array
        (
            [0] => Array
                (
                    [file] => C:\xampp\htdocs\UO-BA\class\FuncaoDao.php
                    [line] => 12
                    [function] => fetchAll
                    [class] => PDOStatement
                    [type] => ->
                    [args] => Array
                        (
                            [0] => 8
                            [1] => Funcao
                        )

                )

            [1] => Array
                (
                    [file] => C:\xampp\htdocs\UO-BA\visualiza-servidor.php
                    [line] => 13
                    [function] => listar
                    [class] => FuncaoDao
                    [type] => ::
                    [args] => Array
                        (
                        )

                )

        )

    [previous:Exception:private] => ParseError Object
        (
            [message:protected] => syntax error, unexpected end of file, expecting function (T_FUNCTION) or const (T_CONST)
            [string:Error:private] => 
            [code:protected] => 0
            [file:protected] => C:\xampp\htdocs\UO-BA\class\Funcao.php
            [line:protected] => 28
            [trace:Error:private] => Array
                (
                    [0] => Array
                        (
                            [function] => carrregaClasse
                            [args] => Array
                                (
                                    [0] => Funcao
                                )

                        )

                    [1] => Array
                        (
                            [function] => spl_autoload_call
                            [args] => Array
                                (
                                    [0] => Funcao
                                )

                        )

                    [2] => Array
                        (
                            [file] => C:\xampp\htdocs\UO-BA\class\FuncaoDao.php
                            [line] => 12
                            [function] => fetchAll
                            [class] => PDOStatement
                            [type] => ->
                            [args] => Array
                                (
                                    [0] => 8
                                    [1] => Funcao
                                )

                        )

                    [3] => Array
                        (
                            [file] => C:\xampp\htdocs\UO-BA\visualiza-servidor.php
                            [line] => 13
                            [function] => listar
                            [class] => FuncaoDao
                            [type] => ::
                            [args] => Array
                                (
                                )

                        )

                )

            [previous:Error:private] => 
        )

    [errorInfo] => Array
        (
            [0] => HY000
            [1] => 0
        )

Fala, Gerson! Beleza?

Você tá usando autoload?

Senão, precisa dar o require do arquivo da sua classe Funcao no arquivo FuncaoDao.

solução!

Vendo melhor sua stack da exceção, tem outro erro sendo exibido:

syntax error, unexpected end of file, expecting function (T_FUNCTION) or const (T_CONST)

Pelo que vi no código que você colou, falta fechar } na sua classe Funcao.