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

Aula 11 - Classes Abstratas

Após a atualização com os códigos dessa aula recebo o erro:

Produto ebook não foi adicionado com sucesso: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' true, '12121212', 'Ebook', '', '')' at line 1

E o nome a categoria também não estão aparecendo.

adiciona-produto.php

<?php
    require_once("includes/cabecalho.php");
    require_once("conexao.php");
    require_once("logica-usuario.php");

    verificaUsuario();

    $tipoProduto = $_POST["tipoProduto"];

    $categoria = new Categoria;
    $categoria->setId($_POST["categoria_id"]);

    if (array_key_exists("usado", $_POST)) {
        $usado = "true";
    }else{
        $usado = "false";
    }

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

    $dao = new ProdutoDAO($conexao);

    if($dao->insereProduto($produto)){ ?>

        <h3 class="text-success">Produto <?=$produto->getNome()?>, R$<?=$produto->getPreco()?> adicionado com sucesso!</h3>
<?php
    } else {
        $msg = mysqli_error($conexao);
?>
        <h3 class="text-danger">Produto <?=$produto->getNome()?> não foi adicionado com sucesso: <?=$msg?></h3>
<?php
    }
?>

<?php include("includes/rodape.php"); ?>

ProdutoDAO.php

<?php 

    class ProdutoDAO{
        private $conexao;

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

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

                $categoria = new Categoria();
                $categoria->setNome($produto_atual['categoria_nome']);
                $tipoProduto = $produto_atual['tipoProduto'];

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

                $produto->setId($produto_atual['id']);
                array_push($produtos, $produto);
            }

            return $produtos;
        }

        function insereProduto(Produto $produto){
            $produto->setNome(mysqli_real_escape_string($this->conexao, $produto->getNome()));
            $produto->setDescricao(mysqli_real_escape_string($this->conexao, $produto->getDescricao()));

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

            $waterMark = "";
            if($produto->temMarkWater()) {
                $waterMark = $produto->getMarkWater();
            }

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

            $tipoProduto = get_class($produto);

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

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

        function buscaProduto($id) {
            $query = "select * from produtos where id = {$id}";
            $resultado = mysqli_query($this->conexao, $query);
            return mysqli_fetch_assoc($resultado);
        }

        function alteraProduto(Produto $produto) {
            $produto->setNome(mysqli_real_escape_string($this->conexao, $produto->getNome()));
            $produto->setDescricao(mysqli_real_escape_string($this->conexao, $produto->getDescricao()));

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

            $waterMark = "";
            if($produto->temMarkWater()) {
                $waterMark = $produto->getMarkWater();
            }

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

            $tipoProduto = get_class($produto);

            $query = "update produtos set nome = '{$produto->getNome()}', preco = {$produto->getPreco()}, descricao = '{$produto->getDescricao()}', categoria_id = {$produto->getCategoria()->getId()}, usado = {$produto->getUsado()}, isbn = '{$isbn}', tipoProduto = '{$tipoProduto}', markWater = '{$markWater}', taxaImpressao = '{$taxaImpressao}' 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);
        }
    }

 ?>
3 respostas

Olá Caroline, o meu ProdutoDAO ficou conforme abaixo e funcionou, vê se te ajuda.

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

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

        $id = $produto_atual['id'];
        $tipoProduto = $produto_atual['tipoProduto'];

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

        $produto->setId($id);
        $produto->getCategoria()->setNome($produto_atual['categoria_nome']);

        array_push($produtos, $produto);
    }
    return $produtos;
}
function insereProduto(Produto $produto) {

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

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

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

    $tipoProduto = get_class($produto);

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

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

function alteraProduto(Produto $produto) {

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

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

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

    $tipoProduto = get_class($produto);

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

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

Att,

Obrigada, mas o erro ainda persiste :/

solução!

Após adicionar esse código nas classes Ebook e LivroFisico, o erro foi corrigido.

public function atualizaBaseadoEm($params) {
            $this->setIsbn($params["isbn"]);
            $this->setMarkWater($params["markWater"]);

            $this->setNome($params["nome"]);      
            $this->setPreco($params["preco"]);
            $this->setDescricao($params["descricao"]);
            $categoria = new Categoria();
            $categoria->setId($params["categoria_id"]);
            $this->setCategoria($categoria);
        }