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