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

Problemas com a categoria na alteração após as mudanças

Olá pessoal,

Não consigo achar o erro e talvez seja o momento de pedir ajudar. A inserção está ok, conferi no banco de dados e está tudo bonitinho, mas a mudança está com dois problemas:

1) ele não traz a categoria correspondente do produto selecionado, o formulário traz a categoria padrão;

2) a alteração não ocorre. Dá mensagem de sucesso, mas quando olho no banco está tudo igual.

Já conferi com o projeto do curso. Detalhe, meu código tem o mysqli_real_escape do curso anterior, que não sei porque nesse curso não estão considerando o quê fizemos antes. Seguem os códigos:

banco-produto.php

<?php
/**
 * Created by PhpStorm.
 * User: Aram
 * Date: 14/02/2017
 * Time: 14:02
 */
require_once("conecta.php");
require_once("class/Produto.php");
require_once("class/Categoria.php");

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

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

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

        $produto = new Produto();
        $produto->setId($produto_array["id"]);
        $produto->setNome($produto_array["nome"]);
        $produto->setPreco($produto_array["preco"]);
        $produto->setDescricao($produto_array["descricao"]);
        $produto->setCategoria($categoria);
        $produto->setUsado($produto_array["usado"]);

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

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

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

function buscaProduto($conexao, $id){
    $query = "select * from produtos where produtos.id = {$id}";
    $resultado = mysqli_query($conexao, $query);
    $produtoBuscado = mysqli_fetch_assoc($resultado);

    $categoria = new Categoria();
    $categoria->setNome($produtoBuscado["categoria_nome"]);

    $produto = new Produto();
    $produto->setId($produtoBuscado["id"]);
    $produto->setNome($produtoBuscado["nome"]);
    $produto->setPreco($produtoBuscado["preco"]);
    $produto->setDescricao($produtoBuscado["descricao"]);
    $produto->setCategoria($categoria);
    $produto->setUsado($produtoBuscado["usado"]);


    return $produto;
}

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

produto-formulario-base.php

<tr>
    <td>N/td>
    <td>
        <input class="form-control" type="text" name="nome"
               value="<?=$produto->getNome() ?>">
    </td>
</tr>
<tr>
    <td>Preço</td>
    <td><input class="form-control" type="number" name="preco" step="0.01"
               value="<?=$produto->getPreco() ?>"></td>
</tr>
<tr>
    <td>Descrição</td>
    <td><textarea class="form-control" name="descricao"><?=$produto->getDescricao() ?></textarea></td>
</tr>
<td>Categorias</td>
<td>
    <select name="categoria_id" class="form-control">
        <?php foreach ($categorias as $categoria):
            $selCategoria = $produto->getCategoria()->getId() == $categoria->getId();
            $selecao = $selCategoria ? "selected='selected'" : "";
            ?>
            <option value="<?=$categoria->getId() ?>" <?=$selecao?>>
                <?=$categoria->getNome()?></option>
        <?php endforeach; ?>
    </select>
</td>
</tr>
<td><input type="checkbox" name="usado" <?=$produto->getUsado() ?> value="true">Usado</td>

produto-altera-formulario.php

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

$id = $_GET['id'];

$produto = buscaProduto($conexao, $id);
$categorias = listaCategorias($conexao);

$selUsado = $produto->getUsado() ? "checked='checked'" : "";
$produto->setUsado($selUsado);

?>
    <h1>Alterando Produto</h1>

    <form action="altera-produto.php" method="post">
        <input type="hidden" name="id" value="<?=$produto->getId()?>">
        <table class="table">
            <?php require_once("produto-formulario-base.php") ?>
            <tr>
                <td><button class="btn btn-primary" type="submit">Alterar</td>
            </tr>
        </table>
    </form>

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

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->setId($_POST['categoria_id']);

$produto = new Produto();
$produto->setId($_POST['id']);
$produto->setNome($_POST['nome']);
$produto->setPreco($_POST['preco']);
$produto->setDescricao($_POST['descricao']);
$produto->setCategoria($categoria);

if(array_key_exists('usado', $_POST)) {
    $produto->setUsado("true");
} else {
    $produto->setUsado("false");
}


if(alteraProduto($conexao, $produto)): ?>
    <p class="text-success">Produto <?= $produto->getNome() ?>, <?= $produto->getPreco() ?> alterado com sucesso!</p> <?php
else:
    $error = mysqli_error($conexao); ?>
    <p class="text-danger">Produto não alterado: <?= $error;?> </p>
    <?php
endif
?>


<?php require_once("rodape.php"); ?>
2 respostas
solução!

Oi Aram, tudo bom?

Você pode passar pra gente um o que está sendo retornado da sua query?

Algo como;

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

    var_dump(mysqli_query($conexao, $query));die(); // adicione essa linha

    return mysqli_query($conexao, $query);
}

Copia e cola aqui o resultado =)

Não esquece de remover a linha que a gente adicionou depois ^^

Quanto a sua categoria, dando uma olhada no seu busca produto:

function buscaProduto($conexao, $id){
    $query = "select * from produtos where produtos.id = {$id}";
    $resultado = mysqli_query($conexao, $query);
    $produtoBuscado = mysqli_fetch_assoc($resultado);

    $categoria = new Categoria();
    $categoria->setNome($produtoBuscado["categoria_nome"]);
// adicionamos o nome, mas e o id?

    $produto = new Produto();
    $produto->setId($produtoBuscado["id"]);
    $produto->setNome($produtoBuscado["nome"]);
    $produto->setPreco($produtoBuscado["preco"]);
    $produto->setDescricao($produtoBuscado["descricao"]);
    $produto->setCategoria($categoria);
    $produto->setUsado($produtoBuscado["usado"]);


    return $produto;
}

Em nenhum momento estamos colocando um id pra categoria que a gente criou. E, lá no form a gente verifica se o id da categoria do produto é igual ao id da categoria do select. Como o nosso id esta vazio, ele sempre devolve false e não marca como selecionado sua categoria =)

Aguardo retorno!

Abraço e bons estudos.

Olá André,

É verdade. Eu tinha notado isso antes também, mas quando conferia com a função do curso não enxerguei que estava fazendo setting no ID ao invés do nome. São coisas que eu bato o olho e não percebo.

Obrigado pela ajuda!