Ir para conteúdo



Como otimizar consulta a BD?


  • Por favor, faça o login para responder
2 respostas neste tópico

#1 Sérgio Toledo

Sérgio Toledo
  • Membros
  • 12 posts

Postado 14 February 2012 - 08:44 AM

Bom dia à todos.

Estou fazendo uma consulta ao meu BD MySQL onde preciso exibir o resultado em dois containers diferentes, só que para isso estou fazendo duas consultas distintas e gostaria de saber se há uma maneira de fazer a mesma coisa com apenas uma consulta. Na verdade é uma dúvida de lógica mesmo.

Segue exemplo de como está no momento:

	 <div class="produtoTexto">
	  <?php
		 $cmd = "SELECT titulo FROM produtos;";
	     $produtos = mysql_query($cmd);
	     while($produto = mysql_fetch_assoc($produtos)){
	       echo "<h3>".$produto['titulo']."</h3><br/>";
	     }	   
	  ?>  
	 </div>
	 <div class="produtoImagem">
	  <?php
	     $cmd = "SELECT foto FROM produtos;";
	     $produtos = mysql_query($cmd);
	     while($produto = mysql_fetch_assoc($produtos)){
	      echo "<img src='admin/others/uploads/fotos/".$produto['foto']."' alt='' />";
         }	   
	  ?>	   
	 </div>




#2 flaviomicheletti

flaviomicheletti
  • Membros
  • 1 posts

Postado 17 February 2012 - 01:00 PM

Oi Sérgio,

Dá sim para fazer em um consulta só,
porém não dará para fugir do laço de repetição na hora de exibir.
Quero dizer que os dois "whiles" dentro dá div terão que existir.
Na verdade até dá e simplificaria a coisa toda, mas fica meio gambiarra.

Eu fui um pouco mais além e tentei separar as obrigações do seu código,
a parte que faz a consulta ao DB (na qual chamamos de model) está logo no início do script e
a parte que e exibi(na qual chamamos de view) contém apenas os elementos necessários para gerar o html. Compliquei?

Para piorar um pouco, eu utilizei o mínimo de orientação a objeto
criando uma classe genérica com a função "stdClass".

Fiz isso pela simples razão de gosto, eu prefiro olhar para isto...
echo $produto->titulo;
do que para isto...
echo $produto['titulo'];



Segue o código reescrito...

<?php

// trecho referente ao Model
$sql	= "SELECT titulo, foto FROM produtos;";
$result = mysql_query($sql);

$array_produtos = array();
while($row = mysql_fetch_assoc($result){
   $produto	   = new stdClass(); // cria uma classe genérica
   $produto->titulo  = $produto['titulo'];
   $produto->foto	= $produto['foto'];
   $array_produtos[] = $produto;// vai montando o array com os objetos produtos
}	
?>


<?php // trecho referente a View ?>
<div class="produtoTexto">
  <?php
  foreach($array_produtos as $produto)
	echo "<h3>".$produto->titulo."</h3><br/>";
  ?>
</div>
<div class="produtoImagem">
  <?php
  foreach($array_produtos as $produto)
	echo "<img src='admin/others/uploads/fotos/".$produto->foto."' alt='' />";
  ?>
</div>


Eu reescrevi o código e não testei, isso significa que
se você rodá-lo aí pode ser que dê algum pau.
Se isso acontecer, me replica falando qual foi o erro
que eu tento concertar.

Espero ter ajudado.
Se eu viagei na maionese, me desculpe.


Obs: Experimente separar seu código por obrigações, siga o modelo MVC.
Vale lembrar que não é preciso utilizar um framework para plicar o conceito MVC.

#3 Sérgio Toledo

Sérgio Toledo
  • Membros
  • 12 posts

Postado 16 April 2012 - 01:14 PM

Olá Flávio,

Como eu acabei resolvendo jogando tudo dentro de um array, acabei nem vendo sua resposta antes, desculpe....

Então, muito legal sua abordagem, me ensinou muito, e é uma maneira bacana de resolver.

Eu não conhecia esta classe genérica "stdClass()", bom saber disso.

Com certeza em algum projeto similar eu vou usar seu esquema.

Abração irmão e fique na Luz!




1 usuário(s) está(ão) lendo este tópico

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)