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

Campo Produto não aparece o nome

Boa tarde; Tinha fechado um problema anteriormente, achado que tinha resolvido mas me enganei. Ao fazer outros testes o problema persiste. Ao criar um novo produto, na hora de cadastrar eu deixei uma mensagem que o produto foi cadastrado corretamente.

O Sr(a). Mariana comprou o produto Polo 1.6 2011, no valor de R$ 18000. Produto adicionado com sucesso!

Mas quando vou na lista produto, o campo produto não aparece corretamente... Fica em branco. O produto Polo 1.6 2011 é o nome do produto (imprimir para ver se mostra o produto). No meu produtoFactory.php onde cria um novo produto está correto, mas não passa para a lista.

<?php 
class ProdutoFactory {

    private $classes = array("OutrosProdutos", "Ebook", "LivroFisico");

    public function criaPor($tipoProduto, $params) {

        $produtoNome = $params['produto'];
        $preco = $params['preco'];
        $descricao = $params['descricao'];
        $categoria = new Categoria();
        $usado = $params['usado'];

        if (in_array($tipoProduto, $this->classes)) {
            return new $tipoProduto($produtoNome, $preco, $descricao, $categoria, $usado);
        } else {

            return new OutrosProdutos($produtoNome, $preco, $descricao, $categoria, $usado);
        }
    }
}
?>

Meu adicionaproduto.php me mostra essa mensagem

/* criação do autoload - carregamento automatico no cabecalho.php - não é mais necessário carrecar as classes aqui.
         require_once("class/Produto.php");
         require_once("class/Categoria.php");
*/ 

verificaUsuario();
$nome = $_POST['nome'];
$produtonome = $_POST['produto'];
$tipoProduto = $_POST['tipoProduto'];
$categoria_id = $_POST["categoria_id"];

//instanciar o produtoFactory()
$factory = new ProdutoFactory();
$produto = $factory->criaPor($tipoProduto, $_POST);
$produto->atualizaBaseadoEm($_POST);
$produto->getCategoria()->setId($categoria_id);


if(array_key_exists('usado', $_POST)){
    $produto->setUsado("true");    
} else{
    $produto->setUsado("false");
}
//instanciar o produtoDao
$produtoDao = new produtoDao($conexao);

if ($produtoDao->insereProduto($produto)){
    ?>
        <p class = "text-success"> O Sr(a). <?=$nome; ?> comprou o produto <?= $produto->getProduto() ?>, no valor de R$ <?= $produto->getPreco() ?>. Produto adicionado com sucesso!
        <li><a class="btn btn-primary" href="produto-formulario.php">OK</a></li>

    <?php
    } else { 
        $msg = mysqli_error($conexao);
        ?>
            <p class = "text-danger"> Erro ao inserir o produto <?= $produto->getProduto() ?>, no valor de R$ <?= $produto->getPreco() ?>. Erro inserção nos campos: <?= $msg ?>
        <?php

        }
mysqli_close($conexao);
        ?>

<?php require_once ("rodape.php"); ?>

Conferi o ProdutoDao.php se estava faltando alguma coisa, mas o produto não é mostrado. Notei que quando mudo o $produtoNome = $params['produto']; passo para $produtoNome = $params['nome']; aparece minha lista, porem com os produtos novos com o nome do comprador, que não é correto. Poderia me ajudar; Estou passando meu Github: https://github.com/flavio-magela/PHP-O.Objeto

8 respostas

Flavio, veja se estou entendendo corretamente sua dúvida:

O produto foi inserido no banco, mas a coluna com o nome do produto está em branco (ou nula). É isso?

Se a mensagem Fulano comprou o produto <nome do produto>... está aparecendo corretamente, suspeito de que algo esteja acontecendo no seu DAO de produto.

Pode colocar aqui o código de seu ProdutoDAO pra gente analisar?

Fico no aguardo de sua resposta.

Daniel, boa tarde;

Perfeitamente, olhei no ProdotoDAO.php e não achei o problema.... Na hora que insiro um novo produto, ele me informa quê... o nome do produto tal inserido com sucesso...porém na minha lista e na hora de alterar o produto, o mesmo não aparece.... Estou passando meu Github: https://github.com/flavio-magela/PHP-O.Objeto

Se puder me ajudar, fico agradecido.

<?php 
class ProdutoDao{

    private $conexao;

    //-----------cosntrutor da conexão --------

    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 c.id=p.categoria_id
                 ORDER BY p.nome ASC");

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

            $tipoProduto = $produto_array['tipoProduto'];    
            $produto_id = $produto_array['id'];
            $categoria_nome = $produto_array['categoria_nome'];            

            //instanciar o produtoFactory()
            $factory = new ProdutoFactory();
            $produto = $factory->criaPor($tipoProduto, $produto_array);
            $produto->atualizaBaseadoEm($produto_array);

            $produto->setId($produto_id);
            $produto->getCategoria()->setNome($categoria_nome);

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

    function insereProduto(Produto $produto) {

        $isbn = "";
        if($produto->temIsbn()){
            $isbn = $produto->getIsbn();
        }

        $taxaImpressao = "";
        if($produto->temTaxaImpressao()){
            $taxaImpressao = $produto->getTaxaImpressao();
        }

        $waterMark = "";
        if($produto->temWaterMark()){
            $waterMark = $produto->getWaterMark();
        }

        $tipoProduto = get_class($produto);

        $query = "insert into produtos (nome, preco, descricao, categoria_id, 
        usado, isbn, tipoProduto, taxaImpressao, waterMark) values ('{$produto->getProduto()}', 
            {$produto->getPreco()}, '{$produto->getDescricao()}', 
                {$produto->getCategoria()->getId()}, {$produto->isUsado()}, 
                    '{$isbn}', '{$tipoProduto}', '{$taxaImpressao}', '{$waterMark}')";

        return mysqli_query($this->conexao, $query);
    }

    function alteraProduto(Produto $produto) {

        $isbn = "";
        if($produto->temIsbn()){
            $isbn = $produto->getIsbn();
        }

        $taxaImpressao = "";
        if($produto->temTaxaImpressao()){
            $taxaImpressao = $produto->getTaxaImpressao();
        }

        $waterMark = "";
        if($produto->temWaterMark()){
            $waterMark = $produto->getWaterMark();
        }

        $tipoProduto = get_class($produto);

        $query = "update produtos set 
                                 nome = '{$produto->getProduto()}', 
                                 preco = '{$produto->getPreco()}',
                                 descricao = '{$produto->getDescricao()}',
                                 categoria_id= '{$produto->getCategoria()->getId()}', 
                                 usado = '{$produto->isUsado()}', 
                                 isbn = '{$isbn}', 
                                 tipoProduto = '{$tipoProduto}', 
                                 taxaImpressao = '{$taxaImpressao}', 
                                 waterMark = '{$waterMark}'  
                                             where id = '{$produto->getId()}'";

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

        $tipoProduto = $produto_buscado['tipoProduto'];
        $produto_id = $produto_buscado['id'];
        $categoria_id = $produto_buscado['categoria_id'];

        $factory = new ProdutoFactory();
        $produto = $factory->criaPor($tipoProduto, $produto_buscado);
        $produto->atualizaBaseadoEm($produto_buscado);

        $produto->setId($produto_id);
        $produto->getCategoria()->setId($categoria_id);

        return $produto;

    }

    function removeProduto($id) {

        $query = "delete from produtos where id = {$id}";

        return mysqli_query($this->conexao, $query);
    }

}



?>

Flavio, bom dia.

Dei uma olhada no seu repositório e acho que descobri o problema.

Repare que para inserir o produto você está usando o método getProduto() para colocar na coluna nome. Porém esse método (que está na classe abstrata Produto) retorna $this->produto e não $this->produtoNome. Daí essa função retorna null e esse valor acaba sendo inserido na coluna.

Confere aí pra mim.

Abraço, Daniel.

Daniel, boa tarde; Fiz a conferencia que vc me falou... agora passei tudo para $this->produtoNome, inclusive o getProduto() para getProdutoNome(). Testei, fiz uma insercão de um Liquidificador, na inserção informa que o produto foi inserido com sucesso:

O Sr(a). Mariana comprou o produto Liquidificador, no valor de R$ 130. Produto adicionado com sucesso!

Porém quando visualizo minha lista a mesma coluna de produto aparece em branco. Engraçado que na hora de inserir o produto aparece $produto->getProdutoNome(), mas na minha lista de produto não aparece....Atualizei meu Github com essas modificações. Estou passando as alterações do Produto.php, produtoFactory.php, produtoDao.php, adiciona-produto.php. Produto.php,

<?php

    abstract class Produto{
        private $id;
        private $produtoNome;
        private $preco;
        private $descricao;
        private $categoria;
        private $usado;    

        // --------função construtor - inicializalção de cada atributo-----------

        function __construct($produtoNome, $preco, $descricao, Categoria $categoria, $usado) {

            $this->produtoNome = $produtoNome;
            $this->preco = $preco;
            $this->descricao = $descricao;
            $this->categoria = $categoria;
            $this->usado = $usado;

        }


        // -------------Encapsulamento-------------------

        public function getId(){
            return $this->id;
        }
        public function setId($id){
            $this->id = $id;
        }
        public function getProdutoNome(){
            return $this->produtoNome;
        }

        public function getPreco(){
            return $this->preco;
        }
        // public function setPreco($preco){        não será mais utilizada, caso utilizaremos a função contrutor de inicialização.    

        //         $this->preco = $preco;            

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

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

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


        // ----------------------- fim encapsulamento---------

         // Methodo que dá desconto nos preço dinamicamente

        public function precoComDesconto($valor = 0.1){

            if($valor > 0 && $valor <= 0.5){

                $this->preco -= $this->preco * $valor;                

            }
            return $this->preco.".00";    
        }
        // ------------- Methodo is livro, verifica se é um livro-----------
        public function temIsbn(){

            return $this instanceof Livro;

        }
        public function temTaxaImpressao(){

            return $this instanceof LivroFisico;

        }
        public function temWaterMark(){

            return $this instanceof Ebook;

        }
        abstract function atualizaBaseadoEm($params); //abstract -obrigatoriamente as classes filhas tem que implementar esse methodo.


        // -- Methodo calcula Imposto sobre o produto - Polimorfismo usando o mesmo metoto na classe Livro  -Polimorfismo é reescrita do methodo - usado o mais proximo, ou seja a mais específica da classe --
        public function calculaImposto(){

             // imposto sobre qualquer produto 1.95%, menos livros...

                return $this->preco * 0.195;            

        }

        // ------- exibir o produto como string para impressão(ex. echo)--------------

        function __toString() {

            return $this->produtoNome.": R$ ".$this->preco;    
        }

        /*---- metodo chamado na hora que o produto é destruido.  usado mais para conexão com o banco de dados ou encerrar a comunicação com algum serviço externo 

        function _destruct (){
            echo "Produto destruido";
        }----------*/
    }


 ?>

O erro ainda persiste...

Flavio, bom dia.

Baixei seu projeto pra testar...

De fato tanto a listagem quanto o formulário de alteração não estão mostrando o nome do produto. Pra fazer funcionar modifiquei o seguinte código na factory de produtos:

public function criaPor($tipoProduto, $params) {

    $produtoNome = $params['nome']; //era $params['produto'];
    $preco = $params['preco'];
    $descricao = $params['descricao'];
    $categoria = new Categoria();
    $usado = $params['usado'];

    if (in_array($tipoProduto, $this->classes)) {
        return new $tipoProduto($produtoNome, $preco, $descricao, $categoria, $usado);
    } else {

        return new OutrosProdutos($produtoNome, $preco, $descricao, $categoria, $usado);
    }
}

Em minha tabela de produtos a coluna com seu nome se chama nome, não produto.

Faz esse teste aí e me dá um feedback.

Boa tarde Daniel ; Aparece a lista, mas... Também tinha colocado na class produto Factory.php essa modificação: $produtoNome = $params['nome']; //era $params['produto']; Porém na minha lista o produto aparece o nome da pessoa. Depois vc olha na sua lista o nome do produto que aparece...

O Sr(a). Michelle comprou o produto Michelle, no valor de R$ 900. Produto adicionado com sucesso! 

No meu produto-formulario-base.php que é a minha página de inserção dos dados do produto. O campo nome chama o: produto e não o nome (já que esse chama o nome do comprador)

<?php 
require_once("cabecalho.php");
require_once("BD-categoria.php");
//  $categoria = new Categoria();
// $categorias = ListaCategorias($conexao);
/* criação do autoload - carregamento automatico no cabecalho.php - não é mais necessário carrecar as classes aqui.
         require_once("class/Produto.php");
         require_once("class/Categoria.php");
*/ 

?>

        <div class="form-group col-sm-5">
            <label class="alinhar">Nome  </label><input   type="text" class="form-control" name="nome" placeholder="Nome do Comprador" required /></br>
        </div>    
        <div class="form-group col-sm-4">
            <label class="alinhar">Produto</label><input  placeholder="Nome do Produto" required type="text" class="form-control" name="produto" value="<?= $produto->getProdutoNome()?>" /></br>
        </div>    
        <div class="form-group col-sm-3">
            <label class="alinhar">Preço  </label> <input placeholder="Preço do Produto" required type="number" class="form-control" name="preco" value="<?= $produto->getPreco() ?>" /></br>
        </div>    

Nesse caso estou batendo cabeça, pq nesse formulário o nome do produto não aparece, sendo que tanta a minha classe produtoFactory.php e produto-formulario-base.php chama o "produto". Naque o "nome' está relacionado ao meu comprador e não ao meu produto.

solução!

Daniel, boa tarde; Fiz uma reformulação no meu código. Como tinha colocado no produto-formulario-base.php um campo comprador e estava referenciando "nome" e justamente estava entrando em conflito. Simplesmente o retirei do meu código pq não fazia sentido deixá-lo aí... referenciei meu campo produto com o "nome " nessa mesma classe e fiz algumas reformulações em outros .php e nos campos e deu certo. Tudo agora funcionando :) Atualizei meu Github caso queira conferir: https://github.com/flavio-magela/PHP-O.Objeto Obrigado pelo apoio e a paciência. Feliz Natal e Ano Novo com grandes realizações em 2019.

Que bom, Flavio. Um 2019 cheio de aprendizados pra você!!