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

Após refatorar o código, "quebrou" a alteração e a exclusão de produtos

Meu código não está carregando o formulário de alteração de produto e também não está excluindo mais!! Tudo o correu após eu tentar encapsular tdo, até sei aonde está o problema (eu acho!! rsrsr) mas não sei como resolver... alguém pode me ajudar?? Vou colocar os códigos abaixo:

1) Arquivo: produto-altera-formulario.php

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

$id = $_GET['id']; //ACHO QUE O PROBLEMA ESTÁ AQUI JÁ QUE NÃO ESTÁ CARREGANDO O ID
$produto = buscaProduto($conexao, $id); //OU O PROBLEMA É AQUI!!
$categorias = listaCategorias($conexao);

$selecao_usado = $produto->isUsado() ? "checked='checked'" : "";
$produto->setUsado($selecao_usado);
?>
        <h1>Alterando produto</h1>
... continua o código

2) Arquivo: banco-produto.php

function buscaProduto($conexao, $id){
    $query = "select * from produtos where id = $id";
    echo $query; //para debug
    $resultado = mysqli_query($conexao, $query);
    $produto_buscado = mysql_fetch_assoc($resultado);

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

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

    return $produto;
}
...continua o código

3)Resultado apresentado na página quando tento alterar:

select * from produtos where id = 
( ! ) SCREAM: Error suppression ignored for
( ! ) Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in C:\wamp\www\loja\banco-produto.php on line 59
Call Stack
#    Time    Memory    Function    Location
1    0.0017    143744    {main}( )    ..\produto-altera-formulario.php:0
2    1.0210    183072    buscaProduto( )    ..\produto-altera-formulario.php:7
3    1.0215    183440    mysql_fetch_assoc ( )    ..\banco-produto.php:59
...seguido do formulário em branco...

4) Arquivo: altera-produto.php

<?php
require_once("cabecalho.php");  
require_once("banco-produto.php"); 
require_once("class/Produto.php");
require_once("class/Categoria.php");

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

$id = $_POST['id'];
$nome = $_POST['nome'];
$preco = $_POST['preco'];
$descricao = $_POST['descricao'];
$categoria = $categoria;

if (array_key_exists('usado', $_POST)) {//verifica se existe a variavel usado no post (se foi selecionado o checkbox)
    $usado = "true";
} else{
    $usado = "false"; //tem que ser colocado entre aspas senao dá pau na query pq ele entende como nulo sem aspas
}
$produto= new Produto($nome, $preco, $descricao, $categoria, $usado);

5) Arquivo: remove-produto.php

<?php
require_once("cabecalho.php"); 
require_once("banco-produto.php");
require_once("logica-usuario.php");

$id = $_POST['id'];    //PROBLEMA AQUI
removeProduto ($conexao, $id); //OU O PROBLEMA É AQUI!!
$_SESSION["success"] = "Produto removido com sucesso.";
header("location: produto-lista.php"); //o retorno nao e dado em outra pagina, volta para ela mesma
die(); //força o encerramento do script
?>

6) Resultado na tela ao tentar remover:

Produto removido com sucesso.

(A mensagem de removido com sucesso aparece, mas não remove o produto da lista)

Com o echo que incluí pra degub, identifiquei que na verdade o id do produto que eu quero alterar/ remover não está sendo carregado para a página de alteração/ remoção seguinte e com isso, está trazendo em branco o resultado da query!! Só não sei como resolver... Alguém se habilita? :-D

8 respostas

Priscila, edita teu post, clica no botão "{ } inserir código" e coloca os códigos entre os sinais. Assim tá muito difícil verificar o código pra te dar esse help... rsrs :)

Bom dia Manoel, alterei! Acho que agora ficou melhor de ver!

Uma parte do problema eu consegui entender, para acessar a página produto-altera-formulario.php tem que ser assim (exemplo)

produto-altera-formulario.php?id=numero_do_produto

Se tentar ler direto o $_GET sem passar nada vai dar problema. Uma forma de contornar (nesta mesma página )seria a seguinte:

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

$id = 0;
if (isset($_GET['id'])){
$id = $_GET['id']; //ACHO QUE O PROBLEMA ESTÁ AQUI JÁ QUE NÃO ESTÁ CARREGANDO O ID
}
$produto = buscaProduto($conexao, $id); //OU O PROBLEMA É AQUI!!
//Resto do codigo

?>

Teria que ver a programação da função do remove-produto, mas talvez seja o mesmo problema, ou seja, não tem o ID no formulario, como ele está recebendo via POST, tem que ver se o formulário tem este campo, e se ele está preenchido.

Tem que verificar se você está enviando o id por POST ou GET. Supondo que seja por POST, uma forma de somente executar a programação se o valor tiver sido enviado seria a seguinte:

<?php
require_once("cabecalho.php"); 
require_once("banco-produto.php");
require_once("logica-usuario.php");

if (isset($_POST['id'])){
$id = $_POST['id'];    //PROBLEMA AQUI
removeProduto ($conexao, $id); //OU O PROBLEMA É AQUI!!
$_SESSION["success"] = "Produto removido com sucesso.";
header("location: produto-lista.php"); //o retorno nao e dado em outra pagina, volta para ela mesma
die(); //força o encerramento do script
}
?>

Priscila, na tua página remove-produto.php, abaixo da linha

$id = $_POST['id'];

insere uma linha pra exibir o valor do id recebido e comenta a session, o redirecionamento e as funções die() e removeProduto(), para poder ver o resultado. Assim:

<?php
require_once("cabecalho.php"); 
require_once("banco-produto.php");
require_once("logica-usuario.php");

$id = $_POST['id'];
echo $id;
//removeProduto ($conexao, $id);

//$_SESSION["success"] = "Produto removido com sucesso.";

//header("location: produto-lista.php");
//die();
?>

Está exibindo o id do produto que você quer remover?

@Daniel Bins, o ID vem da página produto-lista.php

<td>
                <a class="btn btn-primary" 
                    href="produto-altera-formulario.php?id=<?=$produto->getId()?>"> //aqui ele envia o id referente ao produto pra ser alterado
                    alterar
                </a>
            </td>

Fiz as alterações no cófigo conforme vc sugeriu e na tela apresentou na tela os erros:

select * from produtos where id = 
( ! ) SCREAM: Error suppression ignored for
( ! ) Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in C:\wamp\www\loja\banco-produto.php on line 59
Call Stack
#    Time    Memory    Function    Location
1    0.0012    144040    {main}( )    ..\produto-altera-formulario.php:0
2    1.0165    183360    buscaProduto( )    ..\produto-altera-formulario.php:10
3    1.0169    183728    mysql_fetch_assoc ( )    ..\banco-produto.php:59

OBS: deixei um echo para visualizar a query executada e o id está nulo!

Como reclamou do banco-produto.php segue abaixo como está meu código:

function buscaProduto($conexao, $id){
    $query = "select * from produtos where id = $id";
    echo $query; //para debug
    $resultado = mysqli_query($conexao, $query);
    $produto_buscado = mysql_fetch_assoc($resultado); //ESSA É A LINHA 59

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

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

    return $produto;
}

Manoel, coloquei o echo e comentei o restante e apareceu uma página em branco, ou seja... não está carregando o id mesmo! :-(

solução!

O problema pelo que eu vi é que você não está enviado o ID do produto via GET.

Para validar isso, você precisa dar uma olhada na página de produto-lista.php. Depois de abrir a página, abra o código fonte gerado pelo navegador, esse trecho que você postou deve estar com o id vazio.

<td>
            <a class="btn btn-primary" 
                href="produto-altera-formulario.php?id=<?=$produto->getId()?>">
                alterar
            </a>
        </td>

A lista de resultados é uma array de elementos do tipo Produto. Verifique a sua classe produto, para ver se ela está da seguinte forma:

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->categoria = $categoria;
        $this->usado = $usado;
    }

    public function getId() {
        return $this->id;
    }

    public function setId($id) {
        $this->id = $id;
    }

    //Demais metodos de sua classe omitidos



}

Se estiver assim, então o problema ocorre ao dar carga na lista de resultados, lá na página ProdutoDao.php. A função que monta a lista deve estar assim (exemplo)

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_array = mysqli_fetch_array($resultado)) {

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

            $nome = $produto_array['nome'];
            $descricao = $produto_array['descricao'];
            $preco = $produto_array['preco'];
            $usado = $produto_array['usado'];
            $isbn = $produto_array['isbn'];
            $tipoProduto = $produto_array['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($produto_array['id']); //IMPORTANTE. Recuperando o id do banco e atribuindo a classe Produto pelo setId()!

            array_push($produtos, $produto);
        }

        return $produtos;
    }

Se a classe de produto está correta, você precisa, para cada resultado da lista, usar o $produto->setId($produto_array['id']) para atribuir o valor do campo id do banco de dados a cada resultado.

Priscila, você está enviando o id, no formulário da página anterior, por GET ou POST?

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