5
respostas

não esta acessando $produto->getCategoria()->getNome()

Identifiquei que não está acessando o método do atributo objeto $categoria conforme: $produto->getCategoria()->getNome(), fiz var_dump($produto) e retorna o produto com $categoria NULL porém $categoria->nome contém os valores, o que pode estar ocorrendo? Site https://loja2.kaiowadobrasil.com.br/produto-lista

código de produto-lista

<?php
    require_once('logica-usuario.php');
    require_once('cabecalho.php');
?>
    <table class="table table-striped table-bordered">
<?php
        $produtoDao = new ProdutoDao($conexao);
        $produtos = $produtoDao->listaProdutos();

        foreach($produtos as $produto):
?>
            <tr>
                <td><?= $produto->getNome() ?></td>
                <td><?= $produto->getPreco() ?></td>                
                <td><?= $produto->precoComDesconto(0.1) ?></td>
                <td><?= substr($produto->getDescricao(), 0, 40) ?></td>
                <td><?= $produto->getUsado() ?></td>
                <td><?= $produto->getCategoria()->getNome() ?></td>

<?php
                if(usuarioEstaLogado()):
?>
                    <td>
                        <a class="btn btn-primary" href="/produto-altera-formulario?id=<?= $produto->getId() ?>">Alterar</a>
                    </td>
                    <td>
                        <form action="/remove-produto" method="post">
                            <input type="hidden" name="id" value="<?= $produto->getId() ?>" />
                            <button class="btn btn-danger">Remover</button>
                        </form>
                    </td>
<?php
                endif;
?>
            </tr>
<?php
        endforeach;
?>
    </table>
<?php
    require_once("rodape.php");
?>

código de ProdutoDao

<?php

class ProdutoDao {

private $conexao;

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

function listaProdutos() { $produtos = array(); $resultado = mysqli_query($this->conexao, "select p.*, c.nome as categoria_nome from produtos as p join categorias as c on p.categoria_id = c.id");

while($produto_array = mysqli_fetch_assoc($resultado)) { $categoria = new Categoria(); $categoria->setNome($produto_array['categoria_nome']);

$nome = $produto_array['nome']; $preco = $produto_array['preco']; $descricao = $produto_array['descricao']; $usado = $produto_array['usado'];

$produto = new Produto($nome, $preco, $descricao, $categoria, $usado); $produto->setId($produto_array['id']);

array_push($produtos, $produto); } return $produtos; }

function insereProduto(Produto $produto) { $query = "insert into produtos (nome, preco, descricao, categoria_id, usado) values ('{$produto->getNome()}', {$produto->getPreco()}, '{$produto->getDescricao()}', {$produto->getCategoria()->getId()}, {$produto->getUsado()})"; return mysqli_query($this->conexao, $query); }

function alteraProduto(Produto $produto) { $query = "update produtos set nome = '{$produto->getNome()}', preco = {$produto->getPreco()}, descricao = '{$produto->getDescricao()}',categoria_id= {$produto->getCategoria()->getId()}, usado = {$produto->getUsado()} where id = '{$produto->getId()}'"; return mysqli_query($this->conexao, $query); }

function removeProduto($id) { $query = "delete from produtos where id = {$id}"; return mysqli_query($this->conexao, $query); }

function buscaProduto($id) { $query = "select * from produtos where id = {$id}"; $resultado = mysqli_query($this->conexao, $query); $produto_buscado = mysqli_fetch_assoc($resultado); $categoria = new Categoria(); $categoria->setId($produto_buscado['categoria_id']);

$nome = $produto_buscado['nome']; $preco = $produto_buscado['preco']; $descricao = $produto_buscado['descricao']; $usado = $produto_buscado['usado'];

$produto = new Produto($nome, $preco, $descricao, $categoria, $usado); $produto->setId($produto_buscado['id']);

return $produto; } }

?>

5 respostas

Oi José,

A princípio seu código está correto.

Mas poste aqui o código da sua classe Produto, pois o problema deve estar nela.

Oi Rodrigo, segue o código da classe Produto. Obrigado.

<?php

class Produto {

private $id; private $nome; private $preco; private $descricao; private $categoria; private $usado;

function __construct($nome, $preco, $descricao, Categoria $categoria, $usado){ $this->nome = $nome; $this->preco = $preco; $this->descricao = $descricao; $this->catgoria = $categoria; $this->usado = $usado; }

public function precoComDesconto($valor) { if ($valor > 0 && $valor <= 0.5): $this->preco -= $this->preco * $valor; endif; return $this->preco; }

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; }

public function getPreco(){ return $this->preco; }

public function setPreco($preco) { if ($preco > 0): $this->preco = $preco; endif; }

public function getDescricao(){ return $this->descricao; }

public function setDescricao($descricao) { $this->descricao = $descricao; }

public function getCategoria(){ return $this->categoria; }

public function setCategoria($categoria) { $this->categoria = $categoria; }

public function getUsado(){ return $this->usado; }

public function setUsado($usado) { $this->usado = $usado; }

function __toString() { return $this->nome . ": R$ " . $this->preco . "" . $this->descricao . "" . $this->categoria; }

function __destruct() { } }

?>

Oi José,

O problema está no construtor da sua classe Produto. Lá tem essa linha:

$this->catgoria = $categoria;

Repare que tem um erro de digitação: $this->catgoria faltou a letra E.

Alterare então para:

$this->categoria = $categoria;

Bons estudos!

Nossa! :0

Faltou aquele emoji do carinha com a mão na cara!!! Como não vi isso!!!!! Revisei o código umas 30 vezes rsrsrs

Obrigado Rodrigo!!!! Já funcionou aqui!

Opa José,

Que bom que resolveu :)

Tranquilo, esse tipo de erro acontece bastante e geralmente a gente não percebe, mesmo olhando várias vezes :D

Abraços!