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

Aula 2 Evoluindo lista de produtos - Error 500 ao adicionar/alterar produto

Ao adicionar ou alterar um produto dá erro 500, o que pode estar acontecendo?

page: adiciona-produto

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

verificaUsuario();

$produto = new Produto;
$categoria = new Categoria;

$categoria->id = $_POST['categoria_id']

$produto->nome = $_POST['nome'];
$produto->preco = $_POST['preco'];
$produto->descricao = $_POST['descricao'];
$produto->categoria = $categoria;
#$produto->usado = $usado;

if(insereProduto($conexao, $produto)) { ?>
    <p class="text-success">O produto <?= $produto->nome ?>, <?= $produto->preco ?> foi adicionado.</p>
<?php } else {
    $msg = mysqli_error($conexao);
?>
    <p class="text-danger">O produto <?= $produto->nome ?> não foi adicionado: <?= $msg ?></p>
<?php
}
?>

page: altera-produto

require_once("cabecalho.php");         
require_once("banco-produto.php"); 

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

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

if(alteraProduto($conexao, $id, $nome, $preco, $descricao, $categoria_id, $usado)) { ?>
    <p class="text-success">O produto <?= $nome ?>, <?= $preco ?> foi alterado.</p>
<?php } else {
    $msg = mysqli_error($conexao);
?>
    <p class="text-danger">O produto <?= $nome ?> não foi alterado: <?= $msg?></p>
<?php
}

page: banco-produto

require_once("class-produto.php");
require_once("class-categoria.php");
require_once("conecta.php");            


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

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

        $produto = new Produto;
        $produto = new Categoria;

        $categoria->nome = $produtoAtual['categoria_nome'];

        $produto->id = $produtoAtual['id'];
        $produto->nome = $produtoAtual['nome'];
        $produto->preco = $produtoAtual['preco'];
        $produto->descricao = $produtoAtual['descricao'];
        $produto->categoria = $categoria;
        $produto->usado = $produtoAtual['usado'];

        array_push($produtos, $produto);
    }

    return $produtos;
}


function insereProduto($conexao, $produto) {
    if(array_key_exists('usado', $_POST)):
        $produto->usado = "true";
    else:
        $produto->usado = "false";
    endif;

    $query = "insert into produtos (nome, preco, descricao, categoria_id, usado) values ('{$produto->nome}', {$produto->preco}, '{$produto->descricao}', 
{$produto->categoria_id}, {$produto->usado})";

    return mysqli_query($conexao, $query);
}


function alteraProduto($conexao, $id, $nome, $preco, $descricao, $categoria_id, $usado) {
    $query = "update produtos set nome = '{$nome}', preco = {$preco}, descricao = '{$descricao}', categoria_id= {$categoria_id}, usado = {$usado} where id = '{$id}'";
    return mysqli_query($conexao, $query);
}


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


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

page: banco-categoria

require_once("conecta.php");            

function listaCategorias($conexao) {
    $categorias = array();
    $query = "select * from categorias";
    $resultado = mysqli_query($conexao, $query);
    while($categoria = mysqli_fetch_assoc($resultado)) {
        array_push($categorias, $categoria);
    }
    return $categorias;
}

page: produto-lista

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

<table class="table table-striped table-bordered">
    <?php
        $produtos = listaProdutos($conexao);
        foreach($produtos as $produto) :
    ?>
    <tr>
        <td><?= $produto->nome ?></td>
        <td><?= $produto->preco ?></td>
        <td><?= substr($produto->descricao, 0, 40) ?></td>
        <td><?= $produto->categoria->nome ?></td>
        <td><a class="btn btn-primary" href="produto-altera-formulario.php?id=<?=$produto->id?>">alterar</a></td>
        <td>
            <form action="remove-produto.php" method="post">
                <input type="hidden" name="id" value="<?=$produto->id?>">
                <button class="btn btn-danger">remover</button>
            </form>
        </td>
    </tr>
    <?php
        endforeach
    ?>    
</table>
10 respostas

Tente incluir a página produto.php nos arquivos que usam a classe.

então, as pages de class já estão no banco-produto.php

class-produto.php class-categoria.php

sendo assim, não preciso importá-las novamente nas outras pages se eu já importo o banco-produto.php ou estou errado?

Realmente...Testei aqui e parece não ser necessário incluir... Além de erro 500, apareceu outra mensagem?

não, apenas essa mesmo, sem idéia do que seja, já revisei inúmeras vezes, ai vai ver é algo super simples rsrs

Encontrei um erro.

Em adiciona-produto.php na 7a linha está sem ponto e vírgula:

$categoria->id = $_POST['categoria_id']

Só uma pergunta:

O PHP da sua máquina está configurado para exibir erros Leandro?

No arquivo php.ini

a linha

display_errors=On

Está On ? Mas se estiver Off o navegador não exibe os erros.

Se for o caso altere para On, depois fica mais fácil rastrear o erro.

Erro 500 pode ser qualquer problema de código, fica difícil identificar.

ah obg, ao colocar o ";" o erro 500 continua no altera produto, mas sumiu do adiciona produto e exibe esta mensagem:

O produto banana não foi adicionado: 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 ' false)' at line 2

No caso do php.ini, o display_errors está on, mas e esse?

display_startup_errors = Off

tbm precisa estar on?

Leandro , na função insere produto, você está acessando $produto->categoria_id, tente $produto->categoria->id.

vlw Hugo e Edson, seguindo as dicas resolvi alguns problemas e gerei outros (rs), vou colocar mais uma vez os códigos, se for melhor abrir um novo tópico, me deem um toque!

Ocorrem 3 erros:

Erro 1: remove o produto mas não aparece a mensagem de produto removido;

#remove-produto.php
require_once("cabecalho.php");
require_once("banco-produto.php");
require_once("logica-usuario.php");

$produto = new Produto;
$produto->id = $_POST['id'];

removeProduto($conexao, $produto);

$_SESSION["success"] = "Produto removido com sucesso.";
header("Location: produto-lista.php");
die();

#banco-produto.php
function removeProduto($conexao, $produto)
{
    $query = "delete from produtos where id = '{$produto->id}'";
    return mysqli_query($conexao, $query);
}

Erro 2: ao clicar no botao alterar produto exibe os seguintes erros e nao carrega os dados do produto;

#produto-altera-formulario.php
Notice: Trying to get property of non-object in /home/lsmn/Documentos/lsmn-web-server/curso/curso-php-oo/produto-altera-formulario.php on line 15

#msg de error dentro do campo nome
Notice: Trying to get property of non-object in /home/lsmn/Documentos/lsmn-web-server/curso/curso-php-oo/produto-formulario-base.php on line 3

#msg de error dentro do campo descricao
Notice: Trying to get property of non-object in /home/lsmn/Documentos/lsmn-web-server/curso/curso-php-oo/produto-formulario-base.php on line 11

#produto-formulario-base.php
<tr>
    <td>Nome</td>
    <td><input class="form-control" type="text" name="nome" value="<?=$produto->nome?>"></td>
</tr>
<tr>
    <td>Preço</td>
    <td><input class="form-control" type="number" name="preco" value="<?=$produto->preco?>"></td>
</tr>
<tr>
    <td>Descrição</td>
    <td><textarea class="form-control" name="descricao"><?=$produto->descricao?></textarea></td>
</tr>
<tr>
    <td></td>
    <td><input type="checkbox" name="usado" value="<?=$produto->usado?>"> Usado
</tr>
<tr>
    <td>Categoria</td>
    <td>
        <select name="categoria_id" class="form-control">
        <?php
        $categoria = listaCategorias($conexao);

        foreach($categorias as $categoria):
            $essaEhACategoria = $produto->categoria->id == $categoria->id;
            $selecao = $essaEhACategoria ? "selected='selected'" : "";
            ?>
            <option value="<?=$categoria->id?>" <?=$selecao?>>
                    <?=$categoria->nome?>
            </option>
        <?php endforeach ?>
        </select>
    </td>
</tr>

#produto-formulario.php
require_once("cabecalho.php");
require_once("banco-produto.php");
require_once("banco-categoria.php");
require_once("logica-usuario.php");

verificaUsuario();

$produto = new Produto;
$categoria = new Categoria;

#$produto = array("nome" => "", "descricao" => "", "preco" => "", "categoria_id" => "1");
#$produto = array("nome" => "", "descricao" => "", "preco" => "", "categoria_id" => "1");
#$usado = "";

$categorias = listaCategorias($conexao);
?>
    <h1>Formulário de produto</h1>

    <form action="adiciona-produto.php" method="post">
        <table class="table">

            <?php include("produto-formulario-base.php"); ?>

            <tr>
                <td>
                    <button class="btn btn-primary" type="submit">Cadastrar</button>
                </td>
            </tr>
        </table>
    </form>

#produto-altera-formulario.php
require_once("cabecalho.php");
require_once("banco-categoria.php");
require_once("banco-produto.php");

$produto = new Produto;
$categoria = new Categoria;

$id = $_GET['id'];

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

$usado = $produto->usado ? "checked='checked'" : "";
?>
    <h1>Alterando produto</h1>

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

#altera-produto.php
require_once("cabecalho.php");
require_once("banco-produto.php");
require_once("logica-usuario.php");

verificaUsuario();

$produto = new Produto;
$categoria = new Categoria;

$categoria->id = $_POST['categoria_id'];

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

if(alteraProduto($conexao, $produto)) { ?>
    <p class="text-success">O produto <?= $produto->nome ?>, <?= $produto->preco ?> foi alterado.</p><?php
} else {
    $msg = mysqli_error($conexao);?>

    <p class="text-danger">O produto <?= $produto->nome ?> não foi alterado: <?= $msg ?></p>
<?php
}
?>

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

<table class="table table-striped table-bordered">
    <?php
        $produtos = listaProdutos($conexao);
        $produto = new Produto;

        foreach($produtos as $produto) :
    ?>
    <tr>
        <td><?= $produto->nome ?></td>
        <td><?= $produto->preco ?></td>
        <td><?= substr($produto->descricao, 0, 40) ?></td>
        <td><?= $produto->categoria->nome ?></td>
        <td><a class="btn btn-primary" href="produto-altera-formulario.php?id=<?= $produto->id ?>">alterar</a></td>
        <td>
            <form action="remove-produto.php" method="post">
                <input type="hidden" name="id" value="<?= $produto->id ?>">
                <button class="btn btn-danger">remover</button>
            </form>
        </td>
    </tr>
    <?php
        endforeach
    ?>
</table>

#banco-produto.php

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

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

        $produto = new Produto;
        $categoria = new Categoria;

        $categoria->nome = $produtoAtual['categoria_nome'];

        $produto->id = $produtoAtual['id'];
        $produto->nome = $produtoAtual['nome'];
        $produto->preco = $produtoAtual['preco'];
        $produto->descricao = $produtoAtual['descricao'];
        $produto->usado = $produtoAtual['usado'];
        $produto->categoria = $categoria;

        array_push($produtos, $produto);
    }

    return $produtos;
}

function alteraProduto($conexao, $produto)
{
    if(array_key_exists('usado', $_POST)) {
        $produto->usado = "true";
    } else {
        $produto->usado = "false";
    }

    $query = "update produtos set nome={$produto->nome}, preco={$produto->preco}, descricao={$produto->descricao}, categoria_id={$produto->categoria->id}, usado={$produto->usado} where id = '{$produto->id}'";

    return mysqli_query($conexao, $query);
}

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

    return mysqli_fetch_assoc($resultado);
}

function removeProduto($conexao, $produto)
{
    $query = "delete from produtos where id = '{$produto->id}'";
    return mysqli_query($conexao, $query);
}
solução!

No erro 1, você está chamando a função que mostra o alerta no produto-lista.php?

No erro 2, na função altera produto está retornando um array, tente passar para um objeto

unction buscaProduto($conexao, $produto) { $prod = []; $produtos = new Produto; $categoria = new Categoria;

$query = "select * from produtos where id = '{$produto->id}'"; $resultado = mysqli_query($conexao, $query);

$prod = mysqli_fetch_assoc($resultado);

$categoria->id = $prod['categoria_id']; $produtos->id = $prod['id'] $produtos->nome = $prod['nome']; $produtos->descricao = $prod['descricao']; $produtos->usado = $prod['usado']; $produtos->categoria = $categoria;

return $produtos;

}

segui o que você disse Hugo, mas mesmo assim segue dando erros, cansei... mas obg, vou fechar o tópico, vlw