Solucionado (ver solução)
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