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

Código não altera produto e não retorna erro!

Boa tarde pessoal, meu código não está alterando produto e não retorna erros, ficando dificil a resolução do problema.

Segue o código do produtoDAO.php :

<?php


class ProdutoDAO {


    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");
        while($produto_atual = mysqli_fetch_assoc($resultado)) {
            $categoria = new Categoria;
            $categoria->setNome($produto_atual['categoria_nome']);
            $id = $produto_atual['id'];
            $nome = $produto_atual['nome'];
            $preco = $produto_atual['preco'];
            $descricao = $produto_atual['descricao'];
            $usado = $produto_atual['usado'];
            $isbn = $produto_atual['isbn'];
            if($produto_atual['tipoProduto'] == "Livro") {
                $produto = new Livro($nome,$preco,$descricao,$categoria,$usado);        
                $produto->setIsbn($isbn);
            }
            else {
                $produto = new Produto($nome,$preco,$descricao,$categoria,$usado);    
            }
            $produto->setid($id);


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

    function insereProduto(Produto $produto) {
        if($produto->temIsbn()) {
            $isbn = $produto->getIsbn();
        }
        else {
            $isbn = null;
        }
        $tipoProduto = get_class($produto);
        $query = "insert into produtos (nome, preco, descricao, categoria_id, usado, tipoProduto, isbn) values ('{$produto->getnome()}', {$produto->getPreco()}, '{$produto->getdescricao()}', {$produto->getcategoria()->getId()}, {$produto->getusado()}, '{$tipoProduto}', '{$isbn}')";
        return mysqli_query($this->conexao, $query);
    }
    function alteraProduto(Produto $produto) {
        if ($produto->temIsbn()) {
        $isbn = $produto->getIsbn();
    } else {
        $isbn = "";
    }
        $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()}, tipoProduto = '{$tipoProduto}', isbn = '{$isbn}' 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);
        return mysqli_fetch_assoc($resultado);
    }

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

}

Código do produto-altera-formulario.php :

<?php require_once("cabecalho.php"); 
#require_once("banco-categoria.php");
#require_once("banco-produto.php");



$id = $_GET['id'];
$produtoDAO = new ProdutoDAO($conexao);

$produto_buscado = $produtoDAO->buscaProduto($id);

$categoriaDAO = new categoriaDAO($conexao);

$categorias = $categoriaDAO->listaCategorias();


$id = $produto_buscado['id'];
$nome = $produto_buscado['nome'];
$preco = $produto_buscado['preco'];
$descricao = $produto_buscado['descricao'];
$categoria = new Categoria;
$categoria->setId($produto_buscado['categoria_id']);
$usado = $produto_buscado['usado'] ? "checked='checked'" : "";
$isbn = $produto_buscado['isbn'];
$tipoProduto = $produto_buscado['tipoProduto'];
if ($tipoProduto == "Livro") {
    $produto = new Livro($nome,$preco,$descricao,$categoria,$usado);
    $produto->setIsbn($isbn);
}
else {
    $produto = new Produto($nome,$preco,$descricao,$categoria,$usado);    
}
$produto->setid($id);
?>            
    <h1>Alterando produto</h1>
    <form action="altera-produto.php" method="post">
        <input type="hidden" name="id" value="<?=$produto->getid()?>">
        <table class="table">
            <?php include("produto-formulario-base.php"); ?>
            <tr>
                <td>
                    <button class="btn btn-primary" type="submit">Alterar</button>
                </td>
            </tr>
        </table>
    </form>
<?php include("rodape.php"); ?>

E por fim o código do altera-produto.php :

<?php require_once("cabecalho.php");         


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


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

$isbn = $_POST['isbn'];
$tipoProduto = $_POST['tipoProduto'];
$nome = $_POST['nome'];
$preco = $_POST['preco'];
$descricao = $_POST['descricao'];


if($tipoProduto == "Livro") {
    $produto = new Livro ($nome,$preco,$descricao,$categoria,$usado,$tipoProduto);
    $produto->setIsbn($isbn);
}
else {
    $produto = new Produto ($nome,$preco,$descricao,$categoria,$usado,$tipoProduto);
}
$produto->getid($_POST['id']);

$produtoDAO = New ProdutoDAO($conexao);
if($produtoDAO->alteraProduto($produto)) { ?>
    <p class="text-success">O produto <?= $produto->getNome() ?>, <?= $produto->getPreco() ?> foi alterado.</p>
<?php } else {
    $msg = mysqli_error($conexao);
?>
    <p class="text-danger">O produto <?= $produto->getNome() ?> não foi alterado: <?= $msg?></p>
<?php
}
?>

<?php include("rodape.php"); ?>
6 respostas

Olá Caio, tudo bom?

Verifique seu ProdutoDAO, está faltando atribuir o atributo $conexão:

class ProdutoDAO {

    private $conexao;

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

Verifique também, que está faltando adicionar () ao criar sua categoria no formulário, no altera produto e no ProdutoDAO.

$categoria = new Categoria();

Além disso, tente verificar qual é o retorno da query para alterar produtos:

 function alteraProduto(Produto $produto) {
//resto do método
//adicione as proximas duas linhas para verificar o que está sendo retornado da função mysqli_query
var_dump(mysqli_query($this->conexao, $query));
die();        
return mysqli_query($this->conexao, $query);
 }

Essa função retorna FALSE se falhar e TRUE se der certo, quando fazemos um update. Tente atualizar um produto e verifique o retorno =)

Fala André!

O retorno foi: bool(true)

Ele tá adicionando normalmente, tá removendo normalmente, só não altera de maneira nenhuma :(

Já adicionei o atributo private $conexao, tanto no produtoDAO como no categoriaDAO, adicionei os () nos arquivos mencionados (só não entendi o por que de adiciona-los).

E agora ? :(

É necessario adicionar oa tributo privado $conexao, pois é ele quem você está utilizando ao realizar suas querys com $this->conexao. Os parenteses são necessários para indicarmos que estamos chamando um método, ou seja, uma funcionalidade. Caso contrario poderiamos estar acessando apenas um atributo. É bom estarmos atentos a estes detalhes para conseguir encontrar a origem do problema =)

Se o retorno está sendo true é porque a query está funcionando. Significa que o problema não está na query nem na conexão com o banco. Também significa que estamos passando uma condição verdadeira para o if:

if($produtoDAO->alteraProduto($produto)) { ?>
    <p class="text-success">O produto <?= $produto->getNome() ?>, <?= $produto->getPreco() ?> foi alterado.</p>
<?php }

A menssagem de produto alterado, consequentemente, deveria ser executada. Você chegou a visualizar a menssagem?

Quais dados você está passando no formulário para testar a alteração do produto? Tente verificar o conteudo da variavel $produto que está chegando no método alteraProduto():

function alteraProduto(Produto $produto) {
//resto do método
var_dump($produto);
die();        
return mysqli_query($this->conexao, $query);
 }

Veja se o que está no objeto, confere com o que está inserido no formulário.

Qualquer dificuldade, compartilhe com a gente =)

Andrézão,

Adicionei um produto com sucesso, contendo os seguintes atributos:

Nome : Livro de PHP Preço: 300.00 Descrição: Livro de PHP Novo! Categoria: Escolar Tipo do Produto: Livro ISBN: 123456

Foi adicionado com sucesso, quando vou alterar coloquei no altera-produto.php como você orientou o var_dump($produto) e o que me é retornado é isto:

object(Livro)#3 (7) { ["isbn":"Livro":private]=> string(6) "123456" ["id":"Produto":private]=> NULL ["nome":"Produto":private]=> string(12) "Livro de PHP" ["preco":"Produto":private]=> string(6) "300.00" ["descricao":"Produto":private]=> string(19) "Livro de PHP Usado!" ["categoria":"Produto":private]=> object(Categoria)#2 (2) { ["nome":"Categoria":private]=> NULL ["id":"Categoria":private]=> string(1) "2" } ["usado":"Produto":private]=> string(5) "false" }

Onde eu apenas alterei a descricao de Livro de PHP Novo! para Livro de PHP Usado!

E então?

Cara, acho que achei o erro agora.

Note que o ID do produto está sendo setado como NULL, é isso?

solução!

Cara, era isso mesmo. E o pior André, eu já tinha anteriormente dado um var_dump para verificar justamente isso mas não tinha prestado atenção no ID, putz!

Funcionou, o erro estava justamente aqui ó:

No altera-produto.php neste o trecho estava assim:

if($tipoProduto == "Livro") {
    $produto = new Livro ($nome,$preco,$descricao,$categoria,$usado);
    $produto->setIsbn($isbn);
}
else {
    $produto = new Produto ($nome,$preco,$descricao,$categoria,$usado);
}

$produto->getid($id);

Onde o mesmo devia estar assim:

if($tipoProduto == "Livro") {
    $produto = new Livro ($nome,$preco,$descricao,$categoria,$usado);
    $produto->setIsbn($isbn);
}
else {
    $produto = new Produto ($nome,$preco,$descricao,$categoria,$usado);
}

$produto->setid($id);

Antes estava GETID com o parâmetro ID, onde no caso se fosse um get mesmo não teria parametros. Eu pensei no SET e escrevi o GET! kkkkkk

Valeu meu amigo!

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