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)
15
respostas

Php LISTA DE PRODUTOS

Boa tarde. Preciso de ajuda. Temos uma lista de produtos criada a partir de um select. O problema é que quando a página é carregada, me parece que ela faz a query no BD automaticamente e como não há ainda uma escolha (id) ele retorna erro. Segue: Notice: Undefined index: id in C:\Bitnami\wampstack-5.6.19-0\apache2\htdocs\casamento\escolha-produtos.php on line 128 $id = $_GET["id"];

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in C:\Bitnami\wampstack-5.6.19-0\apache2\htdocs\casamento\banco-produto.php on line 104 while($array = mysqli_fetch_assoc($resultado)) {

Gostaria de que quando a página seja carregada, esse erro não aparecesse. Quando seleciono a categoria, ele traz o resutado sem problemas o problema aparece no carregamento da página Obrigado.

seguem os códigos:

pagina escolha-produtos que é carregada:

<?php
$id = $_GET["id"];
$produtos = listaProdutosporCategoria($conexao, $id);
?>
<table class="table table-striped table-bordered">
<?php foreach($produtos as $produto) : ?>

 <div class="section ">
      <div class="container container-border">


          <div class="title">
            <h4>Escolha os Produtos que Deseja Ganhar</h4>
               </div>
            <div class="row">

                <div class="col-md-3">
                    <div class="card card-product card-plain">
                        <div class="image">
                            <a href="#">
                                <img width="90px" height="90px" width="auto" height="auto" img src="../cadastro/fotos/<?=$produto->getFoto() ?>" alt="Sem Imagem"/>
                            </a>
                        </div>
                        <div class="content">
                            <a href="#">
                                <h4 class="title"><?=$produto->getNome() ?></h4>
                            </a>
                            <p class="description">
                              <?= substr($produto->getDescricao(), 0, 40) ?>
                            </p>
                            <div class="footer">
                                <span class="price">R$ <?=$produto->getPreco() ?></span>
                                <button class="btn btn-danger btn-simple btn-hover pull-right" rel="tooltip" title="" data-placement="left" data-original-title="Adicionar a lista">
                                    <i class="fa fa-heart-o"></i>
                                </button>
                            </div>
                        </div>
                    </div> <!-- end card -->
                </div>


    </div>

banco-produto na função listaProdutoporCategoria

function listaProdutosporCategoria($conexao,$id){

$retorno = 0;

$produtos = array();
$resultado = mysqli_query($conexao, "select p.*, c.nome as categoria_nome,
    m.nome as marca_nome 
from produtos p 
inner join categorias c on(p.categoria_id = c.id)
inner join marcas m on(p.marca_id = m.id) 
where c.id = {$id}");
while($array = mysqli_fetch_assoc($resultado)) {

$produto = new Produto();
$produto->setId($array['id']);
$produto->setNome($array['nome']);
$produto->setPreco($array['preco']);
$produto->setReferencia($array['referencia']);
$produto->setDescricao($array['descricao']);
$produto->setMarca(new Marca());
$produto->getMarca()->setId($array['marca_id']);
$produto->getmarca()->setNome($array['marca_nome']);
$produto->setCategoria(new Categoria());
$produto->getCategoria()->setId($array['categoria_id']);
$produto->getCategoria()->setNome($array['categoria_nome']);
$produto->carregaCaminhoFoto($array['foto']);


array_push($produtos, $produto);
}
return $produtos;
 }
15 respostas

Oi Sérgio.

Você já pensou em tratar o caso em que o id não é recebido? Por exemplo:

$id = $_GET["id"];
if ($id != null):
    $produtos = listaProdutosporCategoria($conexao, $id);
endif;

Oi Giovana, obrigado pelo seu retorno. A idéia é ótima, acredito que seja realmente o caminho. Porque quando a página é carregada ainda não definimos o id. Tentei fazer a alteração que sugeriu mas o retorno foi esse:

Notice: Undefined index: id in C:\Bitnami\wampstack-5.6.19-0\apache2\htdocs\casamento\escolha-produtos.php on line 127

Notice: Undefined variable: produtos in C:\Bitnami\wampstack-5.6.19-0\apache2\htdocs\casamento\escolha-produtos.php on line 133

Warning: Invalid argument supplied for foreach() in C:\Bitnami\wampstack-5.6.19-0\apache2\htdocs\casamento\escolha-produtos.php on line 133

Você pode mandar as linhas em que ele está acusando erro?

escolha-produtos.php linha 133 e 127

Oi Giovana, claro que sim. Segue:

126   <?php
127   $id = $_GET["id"];
128   if ($id != null):
129    $produtos = listaProdutosporCategoria($conexao,    $id);
130   endif;
131   ?>
132   <table class="table table-striped table-bordered">
133    <?php foreach($produtos as $produto) : ?>

O erro da linha 127 quer dizer que você tem que verificar se o parâmetro 'id' foi recebido antes de tentar pegar, você resolve fazendo:

if (isset($_GET['id']):
    $id = $_GET['id'];
    $produtos = listaProdutosporCategoria($conexao,    $id);
endif;

Os erros que estão sendo indicados na linha 133 referem-se ao fato de que quando o seu id não está setado, ou seja, quando ele não entra no if que eu fiz logo acima, a variável $produtos não é declarada (por isso não dava esse erro antes), então ele não consegue reconhecer, para arrumar isso, basta fazer o mesmo if (isset($_GET['id']) antes do foreach, ou testar o $produtos direto, fazendo if(isset($produtos)).

Oi Giovana não estou conseguindo fechar a sintaxe php onde estou errando?

Desta forma não está funcionando com o fechamento da tag ?>

Você poderia me ajudar?

<?php
if (isset($_GET['id']):
    $id = $_GET['id'];
    $produtos = listaProdutosporCategoria($conexao,    $id);
endif;
?>

Opa, escrevendo a sintaxe errada p vc (confundi com a do javascript) heheh

<?php
if (isset($_GET['id']) {
    $id = $_GET['id'];
    $produtos = listaProdutosporCategoria($conexao,    $id);
}
?>

Assim deve funcionar.

PS: Estava mexendo num javascipt quando fui responder e acabei trocando.

OI Giovana, consegui desta forma:

<?php
if (isset($_GET["id"])){
    $id = $_GET['id'];
    $produtos = listaProdutosporCategoria($conexao, $id);

  }
  ?>

mas continua um erro na linha 137 no foreach <?php foreach($produtos as $produto) : ?> esse é o erro:

Notice: Undefined variable: produtos in C:\Bitnami\wampstack-5.6.19-0\apache2\htdocs\casamento\escolha-produtos.php on line 137

Warning: Invalid argument supplied for foreach() in C:\Bitnami\wampstack-5.6.19-0\apache2\htdocs\casamento\escolha-produtos.php on line 137

Tem certeza que você adicionou o if que eu falei num dos posts acima antes do foreach? Porque esse erros nos diz que o php não está reconhecendo a variável $produtos. E ele só faria isso se isset($_GET["id"]) é falso certo?

Esse erro da linha 137, é por que a variável $produtos só está sendo declarada dentro do if, ou seja, apenas quando $_GET['id'] existir.

Basta declarar esta variável como um array vazio, antes do if, ou em um else, ou de qualquer outra forma antes do foreach.

Segue um exemplo:

<?php
    $id = $_GET["id"];

    if ($id != null):
        $produtos = listaProdutosporCategoria($conexao, $id);
    endif;

// se neste ponto a $produtos nao existir, cria um array vazio, mas se existir permanece com o valor existente
$produtos = isset( $produtos ) ? $produtos : array();

?>
<table class="table table-striped table-bordered">
    <?php foreach($produtos as $produto) : ?>

Obrigado Adriano, fiz exatamente como sugeriu e ocorreu o seguinte erro:

Notice: Undefined index: id in C:\Bitnami\wampstack-5.6.19-0\apache2\htdocs\casamento\escolha-produtos.php on line 128

128     $id = $_GET["id"];

Sérgio, esse é o mesmo erro que estava acontecendo antes, pra vc pegar o valor do id por GET vc tem que garantir que esse valor está lá, por isso o if (isset($_GET["id"])).

Seu código ficaria assim.

<?php
    if (isset($_GET["id"])) {
        $id = $_GET["id"];
        $produtos = listaProdutosporCategoria($conexao, $id);
   }
   $produtos = isset( $produtos ) ? $produtos : array();

?>
<table class="table table-striped table-bordered">
    <?php foreach($produtos as $produto) : ?>
solução!

Sim, por que o link que você está acessando não possui o id. Ele espera algo como:

http://link/?id=qualquer_coisa

Basta adicionar uma verificação também nesta linha, veja:

$id = isset( $_GET["id"] ) ? $_GET["id"] : null;

A solução da Giovana é melhor.

Usa o if que ela explicou antes, e o teste que coloquei antes do foreach, tudo deve funcionar.

Funciona sim. Isso mesmo.

Muito obrigado mesmo aos dois Giovana e Adriano pela sua ajuda.

Deus abençoe vocês.

abraços