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

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

Olá! Resolvi o exercício e está aparecendo este erro no código sql quando vou adicionar o produto (função insereProduto()). Experimentei trocar o código que eu fiz pelo código da resposta do exercício mas continua dando o mesmo problema. Tentei então fazer a inserção de um produto pelo phpMyAdmin via linha de comando e deu tudo certo. O que está acontecendo? Segue o código da função insereProduto()

function insereProduto($conexao, Produto $produto) {
    $produto->nome = mysqli_real_escape_string($conexao, $nome);
    $produto->descricao = mysqli_real_escape_string($conexao, $descricao);
    $produto->preco = mysqli_real_escape_string($conexao, $preco);
    $produto->categoria_id = mysqli_real_escape_string($conexao, $categoria_id);
    $produto->usado = mysqli_real_escape_string($conexao, $usado);

    $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;
}
8 respostas

Segue também o código do meu arquivo adiciona-produto.php:

<?php
require_once("cabecalho.php");
require_once("banco-produto.php");
require_once("logica-usuario.php");
require_once("class/Produto.php"); //para instanciar a classe Produto

verificaUsuario();

$produto = new Produto();
$produto->nome = $_POST["nome"];
$produto->preco = $_POST["preco"];
$produto->descricao = $_POST["descricao"];
$produto->categoria_id = $_POST["categoria_id"];

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

<?php

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

Opa, o valor que você está preenchendo no formulário tem alguma aspa simples? to achando que algum valor do formulário ta gerando uma query errada... só chute mesmo.

Provavelmente pelo erro está faltando alguma aspa simples.

Qualquer aspas simples que fosse inserida no formulário seria eventualmente tratada com a função mysqli_real_scape_string que já faz esse tratamento dentro da função insere produto. Na query, todos os valores do tipo string estão passados com aspas simples.

Verdade, não tinha visto a chamada para a função, desculpa. Vou tentar achar algum especialista em PHP para nós ajudar.

Atualizando.

Quebrei a query em diversas linhas conforme o código abaixo:

function insereProduto($conexao, Produto $produto) {
    $produto->nome = mysqli_real_escape_string($conexao, $nome);
    $produto->descricao = mysqli_real_escape_string($conexao, $descricao);
    $produto->preco = mysqli_real_escape_string($conexao, $preco);
    $produto->categoria_id = mysqli_real_escape_string($conexao, $categoria_id);
    $produto->usado = mysqli_real_escape_string($conexao, $usado);

    $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;
}

E obtive a seguinte mensagem de erro do mysql: "O produto não foi adicionado: 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 ' '', , )' at line 3"

Ou seja, aparentemente o problema está na linha 3 da query, que seria a {$produto->preco},. Essa variável é declarada no banco de dados com o tipo decimal e nunca apresentou problema antes de eu implementar a orientação a objetos. Sempre foi passada sem aspas.

Nessa mesma aula do curso também é modificada a função alteraProduto() que usa o mesmo formulário base e essa função está alterando corretamente todos os dados no banco e retornado mensagem de sucesso, o que, ao meu ver, significa que o problema não está na classe Produto.

solução!

Eu acho que a galera ai pra cima acertou. Seu problema parece ser de aspas simples msm.

Eu acho que onde você escreveu:

$produto->nome = mysqli_real_escape_string($conexao, $nome);
$produto->descricao = mysqli_real_escape_string($conexao, $descricao);
...

Deveria ser:

$nome = mysqli_real_escape_string($conexao, $produto->nome);
$descricao = mysqli_real_escape_string($conexao, $produto->descricao);
...

Tenta ai, vê se dá certo.

Obrigado Yharon, você realmente matou a charada. O meu erro era passar os parâmetros errados na hora de fazer o tratamento da query. Fiz como você sugeriu e deu tudo certo. Obrigado, eu tava quase ficando maluco!