Limitar a busca de Imagens?

Agradeceria me ajudarem a limitar o resultado a ser exibido de imagens que a query faz no BD.

Tenho este código html que deverá exibir somente 3 imagens:

    <div class="section">
       <div class="container">
           <h2 class="section-title">Estes Você Não Pode Perder!</h2>
           <div class="row">
                <div class="col-md-4">
                <?php 
            $dao=new produtoDAO($conexao);
            $produtos = $dao->pegaDestaques();
            foreach($produtos as $produto) : 
            ?>
               
                    <div class="card card-product card-plain">
                    
                        <div class="image">
                           <a href="precompra.php?id=<?=$produto->getId()?>">
                                <img src="../cadastro/fotos/<?=$produto->getFoto() ?>" width="235px" height="245px" alt="foto"/>
                            </a>
                        </div>
                        <div class="content">
                            <a href="#">
                                <h4 class="title"><?=$produto->getMarca()->getNome() ?></h4>
                            </a>
                            <p class="description">
                               <?=$produto->getDescricao() ?>
                            </p>
                            <div class="footer">
                                <span class="price price-old"> R&dollar;<?=$produto->getPreco() ?></span>
                                <span class="price price-new">R&dollar;<?= $produto->calculaDesconto() ?></span>
                             </div>
                        </div>
                        
                    </div> <!-- end card -->
                  <?php endforeach ?>
                 </div>
               </div>
           </div>
       </div>
</div><!-- section -->

e este é a função que busca as fotos escolhidas mas tenho que restringir porque o usuário poderá sem querer escolher mais de 3 fotos:

    function pegaDestaques() {
    $produtos = array();
    $resultado = mysqli_query($this->conexao, "select p.*, c.nome as categoria_nome, sc.nome as 
    subcategoria_nome, m.nome as marca_nome 
    from produtos p 
     inner join categorias c on(p.categoria_id = c.id)
    inner join subcategorias sc on(p.subcategoria_id = sc.id)
inner join marcas m on(p.marca_id = m.id) LIMIT 3 WHERE destaque = 1 ");

 while($array = mysqli_fetch_assoc($resultado)) {
 $produto = new Produto();

$produto->setId($array['id']);
$produto->setNome($array['nome']);
$produto->setPreco($array['preco']);
$produto->setCodigo($array['codigo']);
$produto->setReferencia($array['referencia']);
$produto->setPeso($array['peso']);
$produto->setMedida($array['medida']);
$produto->setNcm($array['ncm']);
$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->setSubcategoria(new Subcategoria());
$produto->getSubcategoria()->setId($array['subcategoria_id']);
$produto->getSubcategoria()->setNome($array['subcategoria_nome']);
$produto->setDestaque($array['destaque']);
$produto->setQuantidade($array['quantidade']);
$produto->carregaCaminhoFoto($array['foto']);

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

Boa noite jovem!
Não compreendi direito a sua dúvida, pois o limite ja está determinado na sua query. LIMIT 3.

Obrigado Wallace, pois é, eu fiz isso acreditando que era isso que resolveria o problema, mas mesmo assim o retorno da query não está limitando a 3 a exibição das fotos. Se eu marcar 4 fotos ou mais no setDestaque ele exibe mais que 3 fotos.

Onde estou errando?

1 curtida

Desculpe @Sergio_Guerjik falha minha! Ao ver seu código não percebi um erro de sintaxe na query.
Troque > LIMIT 3 WHERE destaque = 1 por > WHERE destaque = 1 LIMIT 3
Espero ter ajudado, abraço!

PS: Aqui vai uma dica! Para seu código não ficar tão extenso assim com os métodos
$produto->setName | $produto->setPreco etc…
Utilize o método construtor, o código fica mais limpo.
Ex:
> $produto = new Produto($array['id'], $array['nome'], $array['preco'], (etc ....));

1 curtida

Obrigado Wallace, isso mesmo funcionou.

Vou alterar o meu método utilizando o construtor. Valeu a dica!

Abraços!!!

1 curtida

ou um método privado, como,

    private Produto createProduto(Ponteiro ponteiro){
        produto->setId(ponteiro['id']);
        produto->setNome(ponteiro['nome']);
    }

Amigo o Sergio está utilizando a linguagem PHP e não java rsrs…
Além de que esse método privado que você sugeriu não muda nada, continua com o mesmo bloco desnecessário.

Sim, mas você tem que avaliar com objetivo. No caso o construtor só é feito se queremos obrigar ao programador que instanciar o objeto a setar os atributos antes. Se não houver essa necessidade, cria métodos privado seria ideal, o beneficio é em deixar o código mais legível.
É uma dica de arquitetura que não se aplica somente á este contexto, englobando em qualquer linguagem, a sintaxe só foi de exemplo, pois não sei como se aplica em PHP, porém presumo que se utilize de cursores.