Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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