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

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.