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

Erro no buscaProduto

Boa tarde pessoal, quando fui rodar o código o php mostrou esse erro: Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in C:\wamp64\www\loja\banco-produto.php on line 23

O meu código está igualzinho o do exercício:

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

Boa tarde.

Acredito que seu código está funcionando, esse "Warning" que está retornando na verdade é um alerta e não um erro.

Para contornar alertas utilize um @ na frente dos comandos:

return @mysqli_fetch_assoc($resultado);

Tente utilizar isso, e de um retorno no tópico se resolver o problema.

Olá Alexandre, então, tentei aqui, mas continua com o warning... Ele aparece quando eu clico no botão "alterar".

Ele vai para a pagina do formulario de alteração, dá o warning e não carrega os dados...

Tens como postar o código do arquivo banco-produto.php aqui?

Segue o código do banco-produto.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 = mysqli_fetch_assoc($resultado)) {
      array_push($produtos, $produto);
    }
    return $produtos;
  }

  function insereProduto($conexao, $nome, $preco, $descricao, $categoria_id, $usado){
    $query = "insert into produtos (nome, preco, descricao, categoria_id, usado)
      values ('{$nome}' , {$preco}, '{$descricao}', {$categoria_id}, {$usado})";
    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 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 removeProduto ($conexao, $id){
    $query = "delete from produtos where id={$id}";
    return mysqli_query($conexao, $query);
  }

?>

Vi que você colocou o @ no mysqli_query da function alteraProduto, mas o erro diz que está ocorrendo na linha 23 na function buscaProduto.

Você colocou o @ antes do mysqli_fetch_assoc ?

coloquei sim, não aparece o erro, porém não aparece nada no formulário. Ele deveria estar todo preenchido. Segue em anexo o código da página produto-altera-formulario.php

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

$id = $_GET['id'];
$produto = buscaProduto($conexao, $id);

$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">
        <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" <?=$usado?> value="true"> Usado
        </tr>
        <tr>
            <td>Categoria</td>
            <td>
                <select class="form-control" name="categoria_id">
                    <?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>
            <td><button class="btn btn-primary" type="submit">Alterar</button></td>
        </tr>
    </table>
</form>

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

Estou achando estranho a url... olha como ela está:

http://localhost:8443/loja/produto-altera-formulario.php?id=<?$produto[%27id%27]?>

repara que ele não está aparecendo o id certinho do produto, tem essa %.

Seria isso o pq dele não estar preenchendo o formulário.

Reparei agora que mesmo adicionando outro produto ele dá essa mesma URL.

Utilize assim para teste: produto-altera-formulario.php?id=27

solução!

Fiz o teste no produto-lista.php igual você falou e funcionou. E descobri que meu código estava faltando um igual, ou o echo. Obrigado pessoal pela ajuda, um erro bobo que cometi.