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

Problemas com o uso de DAO

Nos exercícios da aula 8 é proposto para alterarmos o arquivo banco-produto.php e banco-categoria.php para um DAO. Alterei o banco-produto, e aparentemente está ok. Mas estou tendo um problema na inserção de novos dados.

Quando chamo a página produto-formulario.php, o select que continha as categorias está vindo vazio. Não consigo mais mostrar o nome das categorias.

segue o código do select no produto-formulario-base.php

       <select class="form-control" name="categoria_id">
            <?php foreach($categorias as $categoria) :
                $essaEhaCategoria = $produto->getCategoria()->getId() == $categoria->getId();
                $selecao = $essaEhaCategoria ? "selected='selected'" : ""?>
                <option value="<?=$categoria->getId()?>" <?=$selecao?>> <?=$categoria->getNome()?></option>
            <?php endforeach ?>
        </select>

Aqui está o código do produto-formulario.php

$categoria = new Categoria();
$categoria->getId();
$categoria->getNome();

if(array_key_exists('usado', $_POST)){
    $usado = "true";
} else {
    $usado = "false";
}
$produto = new Produto($_POST['nome'], $_POST['preco'], $_POST['descricao'], $categoria, $usado);

$categoriaDAO = new categoriaDAO($conexao);
$categorias = $categoriaDAO->listaCategorias();
?>
    <h1>Formulário de cadastro de produtos</h1>
    <form action="adiciona-produto.php" method="post">
        <table class="table">

            <?php include ("produto-formulario-base.php");?>

            <tr>
                <td><button class="btn btn-primary" type="submit">Cadastrar</td>
            </tr>
        </table>
    </form>
<?php include("footer.php");?>

e por fim minha categoriaDAO.php

class categoriaDAO{

    private $conexao;

    function __construct($conexao)
    {
        $this->conexao = $conexao;
    }

    function listaCategorias(){
        $categorias = [];

        $query = "select * from categorias";

        $resultado = mysqli_query($this->conexao, $query);

        while($categoria_atual = mysqli_fetch_assoc($resultado)){

            $categoria = new Categoria();
            $categoria->setId($categoria_atual['categoria_id']);
            $categoria->setNome($categoria_atual['categoria_nome']);

            array_push($categorias, $categoria);
        }
        return $categorias;
    }
}
8 respostas

Olá amigo, aparentemente seu código esta correto. Dei uma rápida olhada por ele e me parece ok.

Um dica para achar o erro. De um echo do seu objeto categoria antes de adicionar no array lá no CategoriaDAO. Caso seja impressa as categorias saberemos que o erro não esta no DAO. Outra dica (sou novo em PHP portanto posso estar falando besteira) quando voce faz $categorias = [];

Tenta atribuir um array $categorias = array();

espero ter dado um caminho....

ahh tem que ver também se a conexão esta vindo corretamente....

coloca um var_dump($categorias); exit; e você vai conseguir saber se ele esta vindo com valor ou nao na categoriaDAO ou você pode dar o mesmo comando porem passando o $resultado

Opa obrigado pelas respostas. Então, dei um echo $categoria e simplesmente não aparece nada ¬¬. Não tá carregando do banco.

Sobre criar um array declarando array ou chaves, pelo que pude entender o resultado é o mesmo, mas pra desencargo de consciência eu alterei para $categorias = array(). Mesmo assim não funciona

solução!

Então printa $categoria_atual['categoria_id'] se mesmo assim não vier nada descarta erro na hora de inserir no array.

Considerando que sua query esta correta o problema pode estar na conexão com o banco. Faz o teste para o produto, obtendo e passando a conexão da mesma maneira.

Oi Mateus. Então, fiz assim var_dump($categoria_atual['categoria_nome']); e o resultado foi NULL.

Agora o estranho é que essa função está exatamente igual a função do produtoDAO. Mesma coisa. A conexão funciona, tem dados no banco.

Putz cara, veio uma luz que me disse o seguinte: muda o 'categoria_nome' para 'categoria_nome'. E o array funcionou.

Eu me perco com os valores que são passados para as variáveis. Tipo, esses valores são aqueles informados na propriedade value do HTML correto? Isso me zoa a cabeça demais ainda.

vixi escrevi errado ali, é 'categoria_nome' para 'nome'

o nome ali é o nome da coluna no seu banco, você fala para a conexão "me traga o valor que esta contido na coluna que tenha o seguinte nome: { nome}"

Espero ter ajudado.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software