9
respostas

Erro no banco-produto

Quando tento adicionar um novo produto, está aparecendo esse erro:

Catchable fatal error: Object of class mysqli could not be converted to string in C:\wamp\www\Curso PHP\Loja\banco-produto.php on line 1

Podem me ajudar?

9 respostas

Oi Diego,

Pode colar aqui o seu código, assim fica mais fácil de te ajudar. De todo jeito, o erro indica que vc está, provavelmente, tentando usar o retorno de uma query como se fosse uma String. Vamos ver o código para ter certeza :).

<?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 = mysqli_fetch_assoc($resultado)) {
        array_push($produtos, $produto);
    }

    return $produtos;

}

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


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

Olá, Diego. Tudo bem?

Seu código do banco-produto está correto. Provavelmente o erro está ocorrendo no formulario, onde algum retorno do tipo mysqli está sendo usado como string (normalmente isso ocorre quando tentamos dar echo em uma função do tipo mysqli).

Você pode colar aqui o código do seu formulário pra gente dar uma olhada?

<?php include ("cabecalho.php");
include ("conecta.php");
include ("banco-categoria.php");

$categorias = listaCategorias($conexao);
?>

<h1>Produtos</h1>

<form action="adiciona-produto.php" method="post">
    <table class="table">
        <tr>
            <td>Nome</td>
            <td><input class="form-control" type="text" name="nome" /></td>
        </tr>
        <br>
        <tr>
            <td>Preço</td>
            <td><input class="form-control"  type="number" name="preco" /></td>
        </tr>
        <br>
        <tr>
            <td>Descrição</td>
            <td><textarea class="form-control"  type="text" name="descricao" ></textarea></td>
        </tr>

        <tr>
            <td>Categoria</td>
            <td>
               <?php foreach ($categorias as $categoria) : ?>
                <input type="radio" name="categoria_id" value="<?$categoria['id']?>">
                <?=$categoria['nome']?><br/>
               <?php endforeach;?>

            </td>
        </tr>

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


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

Beleza, seu formulário está chamando o adiciona-produto.php. Tudo certo!

Posso dar uma olhada agora no seu código do adiciona-produto.php?

<?php include 'conecta.php'; 
include ("cabecalho.php");
include 'banco-produto.php';
$nome = $_POST ['nome'];
$preco = $_POST ['preco'];
$descricao = $_POST ['descricao'];
$categoria_id = $_POST['categoria_id'];


if (insereProduto($conexao, $nome, $preco, $descricao, $categoria_id)) {
    ?>
<p class="text-success">Produto <?php echo $nome . ' Valor: ' . $preco?> adicionado com Sucesso!</p>
<?php }else {
    $msg = mysqli_error($conexao);
?>
<p class="text-danger">O Produto <?php $nome ?> Não foi adicionado!  <?php $msg?></p>

<?php 

}

mysqli_close ( $conexao );

?>

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

Primeiramente, no arquivo adiciona-produto.php estamos usando a função insere produto como condição do if:

if (insereProduto($conexao, $nome, $preco, $descricao, $categoria_id)) {...

E na classe, banco-produto, não estamos retornando nada para realizar essa verificação:

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

Se vamos usar um retorno booleano na função insereProduto, devemos realizar este retorno. Neste caso, podemos retornar o proprio $resultadoDaInsercao já que a função mysqli_query retorna um booleano quando realizamos um insert, simplesmente adicionando o código:

return $resultadoDaInsercao;

Outra coisa, a função insereProduto estamos usando uma conexão para realizar nosso mysqli_query:

$resultadoDaInsercao = mysqli_query($conexao, $query);

Mas não recebemos essa conexão nos parametros:

function insereProduto($nome, $preco, $descricao, $categoria_id) {}

Tente adicionar mais um parametro, para receber a conexão:

function insereProduto($conexao,$nome, $preco, $descricao, $categoria_id) {}

Teste essas alterações pra gente ver se o problema permanece!

Alem do que o Andre falou, passar a $conexao na function insereProdutos e dar um return $resultadoDaInsercao

No produto-formulario.php

Ta faltando um '='

<?=$categoria['nome']?>

Correto: <?=$categoria['nome']?>

value="<?$categoria['id']?>"

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software