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

Problema de SQL ao adiciona / alterar produtos.

Após organizar o produto em classe, o programa passou a apresentar o erro abaixo:

O produto moto não foi alterado: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ' usado = false where id = ''' at line 3

Segue o codigo:

<?php require_once("conecta.php");
     require_once ("class/Produto.php");
     require_once ("class/Categoria.php");
    ?>
    <?php
    function listaProdutos($conexao){
        $produtos = array();
        $resultado = mysqli_query($conexao, "select p.*, c.nome as categoria_nome from produtos as p join categorias as c on p.categoria_id = c.id");

        while($produto_array = mysqli_fetch_assoc($resultado)){
            $categoria = new Categoria();
            $categoria->nome = $produto_array['categoria_nome'];


            $produto = new Produto();
            $produto->id = $produto_array['id'];
            $produto->nome = $produto_array['nome'];
            $produto->descricao = $produto_array['descricao'];
            $produto->categoria = $categoria;
            $produto->preco = $produto_array['preco'];
            $produto->usado = $produto_array['usado'];

            array_push($produtos, $produto);
        }

        return $produtos;
    }

    function insereProduto($conexao, $produto) {
        $nome = mysqli_real_escape_string($conexao, $produto->nome);
        $query = "insert into produtos (nome, preco, descricao, categoria_id, usado) values ('{$produto->nome}', {$produto->preco}, '{$produto->descricao}', {$produto->categoria_id}, {$produto->usado})";
        $resultadoDaInsercao = mysqli_query($conexao, $query);
        return $resultadoDaInsercao;
    }

    function alteraProduto($conexao, Produto $produto) 
    {
        $nome = mysqli_real_escape_string($conexao, $produto->nome);
        $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, $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);
    }
<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" <?=$produto->usado?> value="true"> Usado
</tr>
<tr>
   <td>Categoria</td>
    <td>
        <select name="categoria_id" class="form-control">
            <?php
            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>
</tr>
<?php 
require_once("cabecalho.php");
require_once("banco-produto.php");
require_once("class/Produto.php");
require_once("class/Categoria.php");

$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(array_key_exists('usado', $_POST)) {
    $produto->usado = 'true';
} else {
    $produto->usado = 'false';
}

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
}
?>

<?php include("rodape.php"); ?>
<?php require_once("cabecalho.php");
require_once("banco-produto.php");
require_once("logica-usuario.php");
require_once("class/Produto.php");
require_once("class/Categoria.php");
?>

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

if(array_key_exists('usado', $_POST)){
    $produto->usado = 'true';
} else{
    $produto->usado = 'false';
}
?>
<?php 
if(insereProduto($conexao, $produto)) { 
?>
<p class="text-success">Produto <?= $produto->nome; ?>, <?= $produto->preco; ?> adicionado com sucesso!</p>
<?php 
} 
else { 
    $msg = mysqli_error($conexao);
?>
<p class="text-danger">O produto <?=$produto->nome; ?> não foi adicionado: <?=$msg ?></p>
<?php } ?>

<?php include("rodape.php"); ?>
    <?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, 15) ?></td>
        <td><?=$produto->categoria->nome?></td>
        <td> <?=$produto->usado?> </td>
        <td><a href="produto-altera-formulario.php?id=<?=$produto->id?>" class="btn btn-primary">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
    }
?>
</table>

<?php include("rodape.php"); ?>
4 respostas

Nilson, na sua query de atualização, retira as aspas de

id = '{$produto->id}'

deixando

id = {$produto->id}

Testa aí e dá um retorno.

Resolveu não meu amigo. O problema está na variavel "$produto->usado" que deixou de receber informação ou inserir dados do BD apos ser alterado para utilizar a classe Produto os campos "id" e "categoria_id" estão indo em branco tambem.

update produtos set nome = 'moto', preco = 2000.00, descricao = 'teste', categoria_id= , usado = false where id = O produto moto não foi alterado: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ' usado = false where id =' at line 3

solução!

Pela mensagem de erro e pelo código postado, o problema está no formulário.

Quando você posta os dados, ele cria a seguinte variável

$produto = new Produto();
$produto->id = $_POST['id'];
//Demais campos

E depois de carregar este objeto, ele executa a alteração do produto

O que ocorre é que neste formulário não tem nenhum campo "ID", ou seja, como não tem o ID do produto que se quer alterar, ocorre erro no update.

Para corrigir, bastaria acrescentar algo assim no formulário

<input type="hidden" name="id" value="<?=$produto->id?>">

Depois de inserir isso e editar o produto, antes de mandar salvar abra o código fonte no navegador para conferir se a variavel deste campo hidden foi preenchida.

Como na função buscaProduto o retorno é do tipo fetch_assoc, para imprimir o campo se faz $nome_da_variavel->nome do campo.

Se o retorno fosse fetch_array, seria $nome_da_variavel["nome_do_campo"]

Perfeito Daniel Bins!!! Funcionou perfeitamente. Eu fico agradecido.