Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Julio Azevedo_32453

Filtro de dados

Recommended Posts

Olá pessoal. Preciso de ajuda na filtragem de dados em uma listagem de produtos em uma loja virtual.

Preciso que, quando o usuário fizer uma busca, por exemplo, por "camiseta", na parte superior tenha um combobox com a lista de tamanhos de camisetas para ser filtrado. Desta forma, se o usuário quiser apenas as camisetas tamanho "G", basta ele selecionar o tamanho no combobox.

 

O que está me tirando o sono, é que os tamanhos das mercadorias no banco de dados do cliente são gravados em um campo do tipo TEXT, usando quebra de linhas, como no exemplo abaixo:

 

Tamanho

P (em estoque)

M (em estoque)

G (em estoque)

GG (por pedido)

 

Para buscar estes tamanhos no BD e apresentar no combobox, fiz da seguinte forma:

 

$sql = mysql_query("SELECT * FROM produtos WHERE (titulo LIKE '%$keyword%' or descricao LIKE '%$keyword%')");
while($row = mysql_fetch_array($sql)){
   if($row[tamanho]){
   $string = $row[tamanho];
   $posicao = strpos($string, '(');
   $pos =  substr($string, 0, $posicao);
   $sel = explode("\n",$pos);
   for($i=0; $i<count($sel); $i++){			                     if(trim($sel[$i])!="") echo "<option value='".trim($sel[$i])."'>".trim($sel[$i])."</option>";
      }
   }
}

Desta forma, consigo trazer no combo os tamanhos tirando aquela parte de (em estoque)/(por pedido).

Mas como cada produto tem os mesmos tamanhos, gostaria de "juntar" os iguais para não aparecer valores duplicados, triplicados, etc. Seria tipo um GROUP BY ou DISTINCT, mas não sei como fazer.

 

Ao invés de aparecer no combo assim:

 

P

P

P

M

M
G

 

Aparecer assim:

P

M

G

 

Desculpem o post longo, mas não soube outra forma de explicar.

Valeu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ja tentou fazer o query com SELECT DISTINCT?

Sim, mas como disse acima, o campo que guarda as informações de tamanho é do tipo TEXT, e o clinte digita as informações no CMS através de um TEXTAREA, uma por linha, usando a tecla ENTER para pular de linha. Então não tem como fazer com DISTINCT e GROUP BY porque é um campo só, com várias informações.

 

Muito bom artigo, mas no meu caso peguei o "bonde andando". O site já funciona a uns 7 anos e o cliente não quer mudar nada no banco de dados. Quer implementar as novas funcionalidades aproveitando o que tem.

Valeu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, mas como disse acima, o campo que guarda as informações de tamanho é do tipo TEXT, e o clinte digita as informações no CMS através de um TEXTAREA, uma por linha, usando a tecla ENTER para pular de linha. Então não tem como fazer com DISTINCT e GROUP BY porque é um campo só, com várias informações.

 

Muito bom artigo, mas no meu caso peguei o "bonde andando". O site já funciona a uns 7 anos e o cliente não quer mudar nada no banco de dados. Quer implementar as novas funcionalidades aproveitando o que tem.

Valeu.

 

Tente explicar a situação, a tendencia é so piorar. Futuras melhorias vão ficar mais caras e demoradas. Se puder pule fora.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que é isso que vc quer...

SELECT DISTINCT produtos.tamanho, produtos.* FROM produtos WHERE (produtos.titulo LIKE '%$keyword%' or produtos.descricao LIKE '%$keyword%') GROUP BY produtos.tamanho ASC ORDER BY FIELD(produtos.tamanho,'P','M','G','GG'); 

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Acho que é isso que vc quer...

SELECT DISTINCT produtos.tamanho, produtos.* FROM produtos WHERE (produtos.titulo LIKE '%$keyword%' or produtos.descricao LIKE '%$keyword%') GROUP BY produtos.tamanho ASC ORDER BY FIELD(produtos.tamanho,'P','M','G','GG'); 

Olá. Sim, já tentei com o DISTINCT, entretanto tenho um problema com o modo que os dados são armazenados. Os tamanhos são gravados em um único campo TEXT, aí o DISTINCT não funciona.

Valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia,

 

Campo com essa estrutura é complicado demais de trabalhar. :(

 

Minha sugestão:

 

Carregue em um array o conteúdo deste campo ("Esse onde você tira os tamanho P, G, M, etc..")

Aí de acordo com o que você disse vai ser um array com posições duplicadas certo?

 

P

P

P

M

M
G

 

 

Se for isso mesmo... basta você utilizar a função array_unique (http://php.net/manual/pt_BR/function.array-unique.php)que ele vai eliminar os items duplicados. Aí depois disso você carrega o seu Combo.

 

Espero ter ajudado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia,

 

Campo com essa estrutura é complicado demais de trabalhar. :(

 

Minha sugestão:

 

Carregue em um array o conteúdo deste campo ("Esse onde você tira os tamanho P, G, M, etc..")

Aí de acordo com o que você disse vai ser um array com posições duplicadas certo?

 

P

P

P

M

M

G

 

 

Se for isso mesmo... basta você utilizar a função array_unique (http://php.net/manual/pt_BR/function.array-unique.php)que ele vai eliminar os items duplicados. Aí depois disso você carrega o seu Combo.

 

Espero ter ajudado!

 

Olá Uerlen,

 

Obrigado pela resposta, mas ainda não deu certo. Vou tentar explicar melhor. A estrutura da tabela "produtos" e dada abaixo:

 

id_produto (int(10)

titulo (varchar (200)

descricao (text)

tamanho (text)

....

 

No formulario, tem um TEXTAREA que o cliente digita os tamanho assim: ( a quebra de linha no campo textarea é dada pela tecla ENTER)

 

EUR40 (EM ESTOQUE)

EUR41 (EM ESTOQUE)

EUR42 (POR PEDIDO)

....

 

e fica gravado no BD desta forma, para cada produto.

 

Então, vamos a um exemplo:

 

Produto 1 :

EUR40 (EM ESTOQUE)

EUR41 (EM ESTOQUE)

EUR42 (POR PEDIDO)

 

Produto 2 :

EUR40 (POR PEDIDO)

EUR41 (EM ESTOQUE)

EUR42 (POR PEDIDO)

 

O que preciso é apresentar num combo, desta forma:

 

Selecione um tamanho para filtrar :

EUR40

EUR41

EUR42

 

Da maneira que fiz, o combo apresenta TODOS os valores, assim:

 

Selecione um tamanho para filtrar :

EUR40

EUR41

EUR42

EUR40

EUR41

EUR42

 

Com o array_unique, não consegui resolver.

 

Um exemplo do filtro que quero fazer pode ser visto aqui:http://www.rs1.com.br/main.php?menu_novo=1&familia=STREET&classe=SEU%20CORPO&grupo=Botas

 

Na lateal esquerda, vemos os tamanhos que ao serem clicados, listam os produtos. A diferença é que vou colocar estes valores num combo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá pessoal,

 

Ainda não consegui resolver o problema e vou convencer o cliente a mudar a estrutura do banco de dados.

Gostaria de sugestões para o cadastro dos produtos, já que tem vários tamanhos em medidas brasileiras, americanas e européias.

Devo cadastrar os tamanhos em campos distintos (um campo para cada tamanho)?

Qual seria a melhor forma de fazer?

 

 

Desde já, agradeço a quem puder ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, Julio, você pode compartilhar o código do array_unique que tentou pra gente analisar? Se consegue carregar um combo, deveria conseguir eliminar os dups com o array_unique.

 

testaisso, aí está.

 

<form name="formFiltro" method="post" action="" enctype="multipart/form-data">
Filtrar por tamanho disponível
<select name="tamanho">
<option value="" selected="selected">Selecione</option>
<?php 
$sql = mysql_query("SELECT * FROM produtos WHERE (titulo LIKE '%$keyword%' or descricao LIKE '%$keyword%')");
					
while($row = mysql_fetch_array($sql)){
if(isset($row['tamanho'])){
$string = $row['tamanho'];
$sel = explode("\n",$string);
for($i=0; $i<count($sel); $i++){
if(trim($sel[$i])!="") echo "<option value='".trim($sel[$i])."'>".trim($sel[$i])."</option>";
}
}
}
?>
</select>
</form>	

 

Desta forma eu consigo listar TODOS os tamanhos de TODOS os produtos da query. Pretento fazer um filttro para quando o usuário selecionar um tamanho no combo, sejam apresentados somente os produtos que satisfação a condição.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok, então colocando $sel_unique = array_unique($sel); entre a linha 11 e 12 não funcionou?

 

Infelizmente, não. Continuam vindo todos os registros. Acredito que o maior problema seja a forma que os dados estão armazenados, mas valeu pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.