Ir para conteúdo

POWERED BY:

Arquivado

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

carlosmadeiracunha

criar menu com dados vindos do banco de dados mysql

Recommended Posts

Bom dia,

 

tenho um site particular onde eu disponibilizo filmes online e ele tem um banco de dados mysql com dados dos filmes como nome, genero, entre outros. Pensei em fazer um menu com os dados vindos da coluna GENERO para poder agilizar na busca pelos filmes.

 

Na hora da gravação no Banco eu gravo vários gêneros na coluna GENERO numa mesma linha desta forma:

 

(ação, ficção, guerra) separados por vírgulas. Minha dúvida é a seguinte, tem como desmembrar estes dados para que eu possa montar o menu?

Eu andei pesquisando por DISTINCT ou GROUP BY no SELECT mas não consegui fazer funcionar, acho que foi porque estão na mesma linha da coluna GENERO e os exemplos de distinct ou group by que eu ví, existia somente um dado por linha em cada coluna, daí ele não repetia linhas com os mesmos dados e funciona bem, mas no meu caso são vários dados na mesma linha de uma coluna separados somente por vígulas.

Alguém pode me tirar esta dúvida, o DISTINCT faz esta distinção de dados na mesma linha??

 

Desde já agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

MySQL não tem um tipo de dados array (como por exemplo, no PostgreSQL).

Sugiro fazer uma tabela que ligue as duas coisas (Filmes e Generos) e realizar uma consulta com join.

Assim você consegue filtrar exatamente o que deseja. Exemplo:

 

a41pu8.jpg

 

Desta forma, para pegar todos os filmes de ação (codigo 1), você poderia fazer a seguinte consulta:

SELECT f.*, g.nome as genero
  FROM filme f, genero g, filme_genero fg
 WHERE g.codgenero = fg.codgenero
   AND f.codfilme = fg.codfilme
   AND fg.codgenero = 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu já tinha visto esta página antes, e por incrível que pareça ela fala exatamente oque eu falei no meu post inicial, o DISTINCT como o próprio nome fala distingue palavras diferentes armazenadas em uma coluna, mas não responde a minha pergunta. Ainda fiquei na dúvida se ele faz distinção das palavras em linha e se faz, como fazer o select. Mas obrigado mesmo pela atenção.

 

Sabe hufersil, tenho cadastrado no meu banco de dados mais de 400 filmes com este formato na coluna GENERO com os dados separados por vírgula, tem filme que tem somente um gênero mas a maioria tem mais de dois, como por exemplo, GIGANTES DE AÇO Gênero: Ficção científica , Ação , Drama. Vai dar uma trabalheira para cadastrar todos de novo, mas estava pensando em fazer uma tabela genero como você sugeriu pra poder usar o DISTINCT porque como existem vários filmes com os mesmos gêneros, quero montar este menu com os nomes dos gêneros. Vou ver direito como fazer mas será mesmo que não tem outro jeito de desmembrar a linha da coluna gênero? Existe alguma outra linguagem que pode ou faça isso?

 

Não tenho pressa com isso, afinal é um site particular mas já tenho pedidos para cadastro, principalmente dos meus primos e amigos, :yes: e como não tenho um formulário externo para cadastro e nem quero ter, cadastro entrando na administração, mas isso é outra coisa. Se eu conseguir alguma coisa vai ser legal, até posso usar em algum projeto. Mas vejo isso em sites como por exemplo aqui: http://www.filmesonlinegratis.net/assistir-empire-state-dublado-online.html , dá uma olhadinha na coluna da esquerda, abaixo da foto do filme, em gênero, é bem assim que eu quero fazer o meu menu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que entendi você grava os gêneros em um mesmo registro separados por vírgulas, se sim é só pegar o dado retornado no select, e usar a função explode passando a vírgula como parâmetro, assim será criado um array com os gêneros cadastrados, aí é só usar um laço e criar o menu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Puxa Osmar é bem isso mesmo que eu quero, usar as vírgulas como parâmetro, daí não vou precisar mudar nada no banco e vou continuar gravando do mesmo jeito, obrigado por me abrir os olhos pra função explode. Vou pesquisar como funciona isso, será muito me mostrar mais ou menos como funcionaria oque você falou? Daí eu adapto pro que eu quero, mais uma vez obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, você gravou assim no BD: ação,ficção,guerra, então temos:

 

<?php
$generos = "ação,ficção,guerra";
$g = explode(',',$generos);
foreach($g as $gen){
echo "$gen<br/>";
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beleza, vou testar aqui e ver como funciona, achei um exemplo na internet também neste link aqui http://www.joaofernandes.net/blog/tag/explode/ que já testei mas não entendi como pegar os dados para formar o menu mas estou chegando lá.

Meu código está assim depois de testado o exemplo do link citado.

[inline]<?php

 

/// limitei para 3 resultados senão ficaria imenso
$categorias = mysql_query("SELECT genero FROM video LIMIT 3");

while($seleciona_genero = mysql_fetch_array($categorias)){

$genero = $seleciona_genero['genero'];
$mostra_genero = explode(",", $genero);

echo "<pre>";
print_r($mostra_genero);
echo "</pre>";
}
?>[/inline]

 

O código acima me deu este resultado que não entendi como pegar os dados dos array e usá-los no menu.

 

[inline]

Array
(
[0] => Jogos de Guerra

)
Array
(
[0] => Animação
[1] => Fantasia
)
Array
(
[0] => Animação
)

[/inline]

 

Estou pensando neste instante em usar o DISTINCT porque retornou dados repetidos, mas como ?


 

Certo, você gravou assim no BD: ação,ficção,guerra, então temos:

<?php
$generos = "ação,ficção,guerra";
$g = explode(',',$generos);
foreach($g as $gen){
echo "$gen<br/>";
}
?>

 

Ah, Osmar,

o seu código ficou bem melhor de entender, adaptei para a minha necessidade e ficou assim:

 

[inline]

<?php

$categorias = mysql_query("SELECT genero FROM video LIMIT 3");
while($seleciona_genero = mysql_fetch_array($categorias)){
$generos = $seleciona_genero['genero'];
$g = explode(',',$generos);
foreach($g as $gen){
echo "$gen<br/>";
}
}

?>

[/inline]

 

O resultado foi este:

[inline]

Jogos de Guerra
Animação
Fantasia
Animação

[/inline]

 

Jóia, agora é pensar como vou fazer para não ter repetição, ainda está na minha cabeça o DISTINCT mas não tem como usar aí né? Tem alguma idéia?

 

Obrigadão Osmar já estou com meio caminho andado, você consegue imaginar a minha felicidade? Acho que já deve ter passado por isso antes mas eu a cada dia me impressiono com oque posso fazer com o php, nunca fiz um curso, só pesquisando e tentando fazer através de exemplos e ajuda de gente como você.

 

Bem isso acima foi só uma EXPLOSÃO de contentamento. :joia:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, modele novamente seu banco de dados pra usar distinct, faça um script pra passar os dados certinho nas colunas pra você, e dará menos manutenção e dor de cabeça no futuro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, modele novamente seu banco de dados pra usar distinct, faça um script pra passar os dados certinho nas colunas pra você, e dará menos manutenção e dor de cabeça no futuro.

valeu pela dica.

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza, oque vocês falam em modelagem é tipo eu retirar da tabela video onde a coluna genero está atualmente e montar uma tabela só para o gênero??

Se não for, como eu posso modelar então?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beleza, vou testar aqui e ver como funciona, achei um exemplo na internet também neste link aqui http://www.joaofernandes.net/blog/tag/explode/ que já testei mas não entendi como pegar os dados para formar o menu mas estou chegando lá.

 

Meu código está assim depois de testado o exemplo do link citado.

 

[inline]<?php

 

/// limitei para 3 resultados senão ficaria imenso

$categorias = mysql_query("SELECT genero FROM video LIMIT 3");

 

while($seleciona_genero = mysql_fetch_array($categorias)){

 

$genero = $seleciona_genero['genero'];

$mostra_genero = explode(",", $genero);

 

echo "<pre>";

print_r($mostra_genero);

echo "</pre>";

}

?>[/inline]

 

O código acima me deu este resultado que não entendi como pegar os dados dos array e usá-los no menu.

 

[inline]

Array

(

[0] => Jogos de Guerra

)

Array

(

[0] => Animação

[1] => Fantasia

)

Array

(

[0] => Animação

)

[/inline]

 

Estou pensando neste instante em usar o DISTINCT porque retornou dados repetidos, mas como ?

 

Ah, Osmar,

o seu código ficou bem melhor de entender, adaptei para a minha necessidade e ficou assim:

 

[inline]

<?php

$categorias = mysql_query("SELECT genero FROM video LIMIT 3");
while($seleciona_genero = mysql_fetch_array($categorias)){
$generos = $seleciona_genero['genero'];
$g = explode(',',$generos);
foreach($g as $gen){
echo "$gen<br/>";
}
}

?>

[/inline]

 

O resultado foi este:

[inline]

Jogos de Guerra

Animação

Fantasia

Animação

[/inline]

 

Jóia, agora é pensar como vou fazer para não ter repetição, ainda está na minha cabeça o DISTINCT mas não tem como usar aí né? Tem alguma idéia?

 

Obrigadão Osmar já estou com meio caminho andado, você consegue imaginar a minha felicidade? Acho que já deve ter passado por isso antes mas eu a cada dia me impressiono com oque posso fazer com o php, nunca fiz um curso, só pesquisando e tentando fazer através de exemplos e ajuda de gente como você.

 

Bem isso acima foi só uma EXPLOSÃO de contentamento. :joia:

 

Eu montei uma tabela somente com o ID auto increment e outra coluna com o nome genero

Tem como eu pegar o resultado deste exemplo acima e inserir nesta tabela?

Se eu pegar a variável $gen e fazer um insert, vai inserir todos de uma vez certo? E se fizer

 

Estou tentando fugir de inserir manualmente todos em cada filme porque são filmes pra caramba.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem cheguei no meu final, encontrei um jeito de gravar o resultado do explode numa tabela separada com nome de tb_genero com id auto increment e uma coluna com nome genero.

 

Meu código final ficou assim:

 

[inline]

Usando o explode

//selecionando a coluna genero da tabela video
$categorias = mysql_query("SELECT genero FROM video ORDER BY genero ASC LIMIT 5");
while($seleciona_genero = mysql_fetch_array($categorias)){

//criando variável para o resultado do select
$generos = $seleciona_genero['genero'];

//usando o explode para separar os gêneros
$g = explode(',',$generos);

//fazendo um looping dos resultados
foreach($g as $gen){

//exibindo resultado
echo $gen.",";
}

//fazendo nova consulta para não inserir duplicata na tb_genero
$consulta_genero = mysql_query("SELECT tab_genero WHERE genero = '".$gen."' ORDER BY genero ASC LIMIT 5");
//verifico se já existe registro na tabela tb_genero
if(mysql_num_rows($consulta_genero) > 0){
echo "Gênero já existe ";
} else {
//Se não existe eu gravo
$sql = "INSERT INTO tab_genero(id, genero) VALUES (NULL, '".$gen."')";

//Executo a minha query
$query = mysql_query($sql);
//Verifico se o registro foi inserido com sucesso
if ($query == true) {
echo "categoria criada - ";

}else {
echo "não gravou";
}
}
}
?>

Usando o distinct


//Novo select usando DISTINCT para ver os gêneros sem duplicação
$consulta_genero = mysql_query("SELECT DISTINCT genero FROM tab_genero ORDER BY genero ASC");
//mostro a quantidade de gêneros existentes na tabela
$numero = mysql_num_rows($consulta_genero);
echo "Total de categorias: ".$numero."
";

//looping na query
while($mostra_genero = mysql_fetch_array($consulta_genero)){
$genero = $mostra_genero['genero'];
//mostro resultado
echo $genero."
";
}

?>
[/inline]

 

Ainda existe alguma duplicação mas quando faço o select sem limitação, porque este limitado aí não tem duplicata, mas estou achando que pode ser por causa de espaços e ainda não consegui usar o trim pra ver se é mesmo por causa dos espaços.

 

Se alguém puder me ajudar nisto também seria ótimo.


Se eu conseguir resolver este problema mostro como fiz.

 

___________________________________________________________________

Este script está gravando mesmo se já existir registro no DB, porque?

 

[inline]//fazendo nova consulta para não inserir duplicata na tb_genero
$consulta_genero = mysql_query("SELECT tab_genero WHERE genero = '".$gen."' ORDER BY genero ASC LIMIT 5");
//verifico se já existe registro na tabela tb_genero
if(mysql_num_rows($consulta_genero) > 0){
echo "Gênero já existe ";
} else {
//Se não existe eu gravo
$sql = "INSERT INTO tab_genero(id, genero) VALUES (NULL, '".$gen."')";

//Executo a minha query
$query = mysql_query($sql);
//Verifico se o registro foi inserido com sucesso
if ($query == true) {
echo " ( categoria criada ) ";

}else {
echo "não gravou";
}
}
} [/inline]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu li e reli e achei o erro,

Esta linha tem erro no SELECT:

[inline]

$consulta_genero = mysql_query("SELECT tab_genero WHERE genero = '".$gen."' ORDER BY genero ASC LIMIT 5");[/inline]

 

Então arrumei:

[inline]

$consulta_genero = mysql_query("SELECT genero FROM tab_genero WHERE genero = '".$gen."' ORDER BY genero ASC LIMIT 5");

[/inline]

 

 

Bem pessoal, eu ainda não consegui usar o trim para retirar espaços e acho que é por isso que o distinct está mostrando aparentemente dados duplicados mas acho que está acontecendo assim:

 

Ação(sem espaço) ele grava;

Ação(com espaço) ele também grava;

(com espaço)Ação(com espaço) ele também grava,

 

Será que deu pra entender? Caramba, estou desde ontem tentando arrumar isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Usando o trim ele não gravará com os espaços.

Eu sei mas não tô conseguindo usar o trim neste meu script, tem como você me mostrar como fazer?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, pra quem quiser usar o resultado, aí está.

 

[inline]

<?php
//selecionando a coluna genero da tabela video
$categorias = mysql_query("SELECT * FROM video ORDER BY id ASC");
while($seleciona_genero = mysql_fetch_array($categorias)){
//criando variável para o resultado do select
$generos = $seleciona_genero['genero'];
//usando o explode para separar os gêneros
$g = explode(',',$generos);
//fazendo um looping dos resultados
foreach($g as $gen){
//usando trim para tirar espaços
$criterio = trim($gen);
echo "<b>".$criterio."</b><br />";
}
//fazendo nova consulta para não inserir duplicata na tb_genero
$select_genero = mysql_query("SELECT * FROM tab_genero WHERE genero = '".$criterio."'");
//verifico se já existe registro na tabela tb_genero
$verifica = mysql_fetch_assoc($select_genero);
$resultado = $verifica['genero'];
$filme_id = $verifica['id_video'];
if($resultado == $criterio){
$cadastrado = "(Gênero já cadastrado - ".$criterio.")<br />";
echo $cadastrado;
} else {
//Se não existe eu gravo
$sql = "INSERT INTO tab_genero(id, genero) VALUES (NULL, '".$criterio."')";
//Executo a minha query
$query = mysql_query($sql);
//Verifico se o registro foi inserido com sucesso
if ($query == true) {
$novo_cadastro = "(Novo gênero cadastrado - ".$criterio.")<br />";
echo $novo_cadastro;
}else {
echo "não gravou";
}
}
}
?>
[/inline]
daí coloquei este código na index.php
[inline]
<?php
//Select usando DISTINCT para ver os gêneros sem duplicação
$consulta_genero = mysql_query("SELECT DISTINCT genero FROM tab_genero ORDER BY genero ASC");
//mostro a quantidade de gêneros existentes na tabela
$numero = mysql_num_rows($consulta_genero);
echo "<span style='color:#990000; font-size:150%;'>Total de categorias: ".$numero."</span><br />";
//looping na query
while($mostra_genero = mysql_fetch_array($consulta_genero)){
$genero = $mostra_genero['genero'];
//mostro resultado
echo '<li><a href="../index.php?genero='.$genero.'" title=""><span style="color:#8B3A3A">'.$genero.'</span></a></li>';
}
?>

[/inline]

 

E na consulta do index.php eu fiz um if $_GET['genero'];
[inline]
<?php
//Se foi clicado um gênero no menu, mostra filmes do gênero
if($_GET['genero']){
$palavra = $_GET['genero'];
$busca = mysql_query("SELECT * FROM video WHERE genero LIKE '".$palavra."' ORDER BY filme ASC");
//Se não foi, mostra todos os filmes
}else
$busca = mysql_query("SELECT * FROM video ORDER BY filme ASC");
?>
[/inline]

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.