Ir para conteúdo

POWERED BY:

Arquivado

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

carlosmadeiracunha

Exibindo registro através de busca por palavra - PHP / MYSQL

Recommended Posts

E aí pessoal, tudo tranquilo?

 

É o seguinte, tenho um site particular que disponibiliza filmes online e neste site eu tenho uma tabela de nome video com os dados como nome_br, nome_original, genero, entre outros.

na coluna genero eu gravo os mesmos desta forma: ação, espionagem, suspense.

Separando os gêneros por vírgulas, através de um explode eu consegui separar estes gêneros usando a vírgula como parâmetro e gravar em outra tabela de nome generos todos os gêneros separadamente e fiz um select distinct para montar um menu e ficou bacana.

Agora eu quero mostrar na minha index.php através deste menu os filmes por gênero clicados. O problema é que eu gravo na tabela video os gêneros da forma já mostrada acima, (ação, espionagem, suspense) separados por vírgulas.

 

O menu se apresenta assim:

 

ação

espionagem

suspense

etc...

 

e o link eu fiz assim:

<a href="index.php?genero=ação" title="Ver filmes do gênero ação">ação</a>

 

para poder mostrar os filmes eu montei um if

 

if($_GET['genero']){
$palavra = $_GET['genero'];
 
//mostro os filmes do gênero vindo por GET
$busca = mysql_query("SELECT * FROM video WHERE genero LIKE '".$palavra."' ORDER BY nome_br ASC");
 
} else {
//se não existir GET mostro todos os filmes
$busca = mysql_query("SELECT * FROM video ORDER BY nome_br ASC");
 

 

O problema é que como muitos filmes têm vários gêneros, quando eu envio o gênero através do GET, ele só procura e exibe aqueles que tem exatamente o gênero pedido, mas os outros que também fazem parte deste gênero pedido e foram cadastrados com mais gêneros ele não exibe.
Como por exemplo:
O REINO - DRAMA, SUSPENSE;

A CAIXA - SUSPENSE;

 

Se eu procurar por SUSPENSE, o select só me mostrará o filme A CAIXA que foi registrado somente com um gênero mas o filme O REINO não será mostrado por estar acompanhado por mais gêneros.

 

A pergunta é, como posso fazer uma pesquisa que me retorne todos os filmes relacionados ao gênero clicado no menu independente se existe mais gêneros cadastrado para ele?

 

Antecipadamente agradeço pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Minha sugestão é que você melhore a modelagem, buscando atomicidade no campo gênero para facilitar sua vida, fazendo algo assim:

 

6nP1Qma.png

 

Espero que ajude.

Compartilhar este post


Link para o post
Compartilhar em outros sites

usa o

SELECT * FROM video WHERE genero LIKE '%".$palavra."%' ORDER BY nome_br ASC

assim ele busca qualquer palavra relacionada usando o percente

Compartilhar este post


Link para o post
Compartilhar em outros sites

Minha sugestão é que você melhore a modelagem, buscando atomicidade no campo gênero para facilitar sua vida, fazendo algo assim:

 

6nP1Qma.png

 

Espero que ajude.

 

a tabela video está assim:

 

 

id - int(11) auto-increment
capa - varchar 500 - (porque baixo pro blogspot e pego o endereço, daí fica grande pra caramba, o mesmo acontece com outros campos).
usuario - varchar 20
nome_br - varchar 200
lancamento - varchar 20
nome_original - varchar 200
url - varchar 500 (uso somente a final da url do youtube Ex: https://www.youtube.com/watch?v=0TAbooH-2cs e vimeo também é assim com um código de números e letras e tem também o vk que é uma url inteira onde eu insiro num iframe)
status - varchar 3 - padrão ON
data - varchar 30 (faço um tratamento antes de inserir neste formato: 7/05/2014 - 07:00:05.)
texto - text
player - varchar 50 ( eu coloco o nome , youtube, vimeo, vk ) porque cada um tem o seu player e identifico através do nome)
trailer - varchar 20 ( mesmo sistema da URL , só que uso somente o youtube)
direcao - varchar 50
elenco - text (resolvi usar o text porque tem muitos nomes e não tem uma quantidade específica).
genero - varchar 100 ( aqui eu introduzo primeiramente o gênero separando-os por vírgulas, depois transfiro eles pra outra tabela (tb_genero) individualmente separando-os com um explode e inserindo na tb_genero o resultado deste explode)
nacionalidade - varchar 30(é o nome do país que fez o filme)

 

e a tabela tb_genero está assim:

 

 

id - int(11) auto-increment
genero - varchar 20

 

Agora pra fazer o menu eu uso um distinct na tb_genero.

 

E pra montar uma galeria com os filmes eu faço um select na tabela video.

Ainda não entendi como fazer pra que identifique um filme de um determinado gênero mesmo ele tendo outros gêneros cadastrados junto.

 

Como expliquei no post anterior ele só exibe o filme que tenha cadastrado somente um gênero, o que foi determinado.

 

Ainda não entendi como usar o seu exemplo, sendo que está parecido com as minhas tabelas, tem como você me explicar?

_____________________________________________________________________

 

Veja também a síntaxe do LIKE , REGEXP e MATCH() AGAINST , pode ajudar.

 

Estou tentando entender as sintaxes que você me passou, e pesquisando como usá-las.

Ainda estou boiando.

usa o

SELECT * FROM video WHERE genero LIKE '%".$palavra."%' ORDER BY nome_br ASC

assim ele busca qualquer palavra relacionada usando o percente

Amigão vou fazer isso agora e posto o resultado já.

magnata_pvh

 

Deu certo aqui, valeu mesmo, agora tem uma situação que quando clico em ação, ele retorna os filmes de gênero ação e também os de gênero animação, o mesmo acontece no inverso.

 

Porque será? Imagino que seja porque ação está nas duas palavras ação, animação, como faço pra corrigir isso?

Tem como ?

 

Mas desde já agradeço, funcionou legal.

Compartilhar este post


Link para o post
Compartilhar em outros sites

pra concertar essa situação em que ele traz ação e animação, é só tirar o primeiro %, fica assim

SELECT * FROM video WHERE genero LIKE '".$palavra."%' ORDER BY nome_br ASC

dessa forma ele sempre vai pegar só os gêneros que começam pelo gênero que você quer e não vai mais dar esse "problema"

Compartilhar este post


Link para o post
Compartilhar em outros sites

pra concertar essa situação em que ele traz ação e animação, é só tirar o primeiro %, fica assim

SELECT * FROM video WHERE genero LIKE '".$palavra."%' ORDER BY nome_br ASC

dessa forma ele sempre vai pegar só os gêneros que começam pelo gênero que você quer e não vai mais dar esse "problema"

 

Funcionou perfeitamente, agora só mostra mesmo o gênero clicado , estou muito feliz com o resultado.

 

 

Obrigado ao

Cleiton Gomes , magnata_pvh , Motta e ao angelorubin

pela atenção dispensada, paciência e por compartilhar seus conhecimentos com quem sabe menos. Parabéns a vocês, se pudesse daria a pontuação pra todos mas o sistema não deixa. Novamente muito obrigado a todos.

 

Hum, o sistema aceitou. Até a próxima.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu já tinha dado o tópico como resolvido até me deparar agora com um probleminha,

SELECT * FROM video WHERE genero LIKE '".$palavra."%' ORDER BY nome_br ASC

Esta consulta me mostra sim (quase) todos os filmes que tenham o gênero procurado, por exemplo COMÉDIA MUSICAL, mas se o gênero COMÉDIA MUSICAL estiver sido cadastrado assim: ANIMAÇÃO, FAMÍLIA, COMÉDIA MUSICAL ele retorna resultado falso porque o gênero COMÉDIA MUSICAL não está em primeiro, ou seja, ele só mostra o resultado se o dado da consulta estiver em primeiro na listagem.

 

 

Se eu faço o select desta forma:

SELECT * FROM video WHERE genero LIKE '%".$palavra."%' ORDER BY nome_br ASC

Ele me retorna resultado verdadeiro, mas também se eu procurar por AÇÃO ele vai retornar resultado também de ANIMAÇÃO porque AÇÃO está nas duas palavras.

O que pode ser feito para que me retorne resultado exato mesmo que este dado esteja no meio ou no final de uma linha?

 

Será que deu pra entender?

Compartilhar este post


Link para o post
Compartilhar em outros sites

se você sempre usar essa estrutura para colocar os gêneros ex: ação, suspense, drama. da pra você ter o resultado esperado com essa sql

SELECT * FROM video WHERE genero LIKE '$palavra%' OR genero LIKE '% $palavra%' ORDER BY nome_br ASC

por que dessa forma, caso no banco o gênero ação por exemplo, não seja o primeiro, ele o procurara entre os gêneros e só retornara verdadeiro se o ação do meio estiver com um espaço em branco na frente, que é o seu padrão de postagem dos gêneros tipo, suspense,[espaço]ação, entendeu ? pode ser que exista um jeito melhor de fazer isso mais por enquanto pra você não se desesperar acho que essa forma resolverá !

Compartilhar este post


Link para o post
Compartilhar em outros sites

se você sempre usar essa estrutura para colocar os gêneros ex: ação, suspense, drama. da pra você ter o resultado esperado com essa sql

SELECT * FROM video WHERE genero LIKE '$palavra%' OR genero LIKE '% $palavra%' ORDER BY nome_br ASC

por que dessa forma, caso no banco o gênero ação por exemplo, não seja o primeiro, ele o procurara entre os gêneros e só retornara verdadeiro se o ação do meio estiver com um espaço em branco na frente, que é o seu padrão de postagem dos gêneros tipo, suspense,[espaço]ação, entendeu ? pode ser que exista um jeito melhor de fazer isso mais por enquanto pra você não se desesperar acho que essa forma resolverá !

 

Cleiton eu testei do jeito que você colocou e deu no mesmo mostrava os dois gêneros, daí resolvi testar mudando os LIKE´s de lugar daí funcionou perfeitamente para o caso do gênero AÇÃO e ANIMAÇÃO, agora o resultado está diferenciando AÇÃO das palavras como era esperado.

 

Só que, apareceram dois problemas.

 

O primeiro é que existem também o COMÉDIA MUSICAL e o MUSICAL, quando clico em COMÉDIA MUSICAL não mostra resultado algum e nem mesmo mostra a quantidade com o mysql_num_rows, mas quando clico em MUSICAL, aparecem os dois gêneros, percebam que neste caso ele está ignorando o COMÉDIA de COMÉDIA MUSICAL.

 

O segundo caso é que também existem FICÇÃO e FICÇÃO CIENTÍFICA , agora o resultado está trazendo corretamente quando clico em FICÇÃO CIENTÍFICA mas quando clico em FICÇÃO ele mostra resultado dos dois, parecido com oque acontecia com ação e animação, só que agora ele está usando o espaço entre as palavras.

 

Estava pensando em fazer uns if´s genero == ficção e outro genero == ficção científica mas eu estaria fugindo do problema e eu tô afim de ajeitar isso e não fugir fazendo esta gambiarra.

 

Alguém tem uma sugestão?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Percebi que o problema não é no script e sim na forma como se insere no banco,

 

Eu estava inserindo assim:

Ficção Científica,( espaço )Ficção

 

Aí eu fiz um script para padronizar os dados no banco de dados e já monto o meu menu.

 

 

//busco os dados para poder padronizar
$busca = mysql_query("SELECT * FROM video ORDER BY id ASC");
$total_filmes = mysql_num_rows($busca);
//mostro a quantidade de filmes(Não é necessário mas como é uma pasta pra ver os resultados, coloquei)
echo $total_filmes.'<br />'; 
 
while($exibe = mysql_fetch_array($busca)){
 
$id  = $exibe['id'];
$nome  = $exibe['nome_youtube'];
$genero = $exibe['genero']; 
 
//convertendo as palavras em minúsculo
$genero = strtolower($genero);
//retirando espaços que eventualmente possam existir.
$genero = trim($genero);
//inserindo espaços padronizados
$genero = ' '.$genero.' ';
 
//mando printar pra ver o resultado
echo '<strong>('.$id.')</strong> <vermelho>Filme:</vermelho> '.$nome.' - <strong>'.$exibe['genero'].'</strong><br />';
 
//Atualizo os dados
$sql = "UPDATE video SET genero ='$genero' WHERE id='$id'";
//Executo a minha query
$query = mysql_query($sql);
//Verifico se o registro foi atualizado com sucesso
if ($query == true) {
echo '<b style="color:#FF0000;">'.$genero.'</b> mudado para minúscula e colocando espaços antes e depois com sucesso.<hr style="width:100%;" />';
}else {
echo 'Não mudou nada.';
}
}
 
//Começo a montar o meu manu

//selecionando dados da tabela video 
$categorias = mysql_query("SELECT * FROM video ORDER BY id ASC");
while($seleciona_genero = mysql_fetch_array($categorias)){
 
//criando variável com 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){
 
//montando uma vaiável para poder inserir no banco
$criterio = trim($gen);
//convertendo todas as letras em minúsculo caso exista alguma em maiúsculo
$criterio = strtolower($criterio);
//mostrando resultado
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";
}
}
 
}
 
//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="Ver filmes do gênero '.$genero.'"><span style="color:#8B3A3A">'.$genero.'</span></a></li>';
}
 


Diminuíram os problemas de 3 pra 1 porque ainda mostra quando clico em ficção, os gêneros ficção e ficção científica.

 

Pensei em fazer com que as primeiras letras da linha fiquem em maiúsculo mas não encontrei nada que me sirva e o que eu encontrei coloca as primeiras letras das palavras e ficaria no mesmo..

 

Eu queria fazer assim : Ficção Científica convertendo pra assim: Ficção científica.

 

EX:

 

ucwords($string)
Ex.: ucwords("ficção cinetífica") -> Retorna: Ficção Científica

Compartilhar este post


Link para o post
Compartilhar em outros sites

pra você colocar somente as primeiras letras da linha em letra maiúscula faça assim:

//transforma todas as letras em minúsculas
$minusculas = strtolower('Ficção Científica');
//transforma somente a primeira lera da linha em maiúscula
$primeiramaiuscula = ucfirst($minusculas); 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi, mas como está tudo salvo na coluna genero da tabela video desta forma:

 

Como no exemplo:

Ficção Científica , Comédia Romântica

 

Desta forma vai somente deixar o Ficção em maiúsculo assim:

Ficção científica , comédia romântica

 

Não é?

Daí esta forma não adianta e acho que só piora porque vai dar diferenciação em Ficção científica que estivar no meio desta forma:

 

Aventura , ficção científica.

 

Vou ter que prestar atenção na hora de cadastrar os gêneros para que o banco trabalhe corretamente, apesar de já ter convertido tudo em minúsculo e adicionado o espaço.

 

Eu pensei em fazer um explode na linha gênero da mesma forma que fiz para montar o menu, depois eu pego o resultado e uno novamente agora com espaço antes da palavra e depois eu uso uma vírgula pra diferenciar tipo assim:

linha: [espaço]comédia romântica[espaço],[espaço]policial[espaço],

 

usando o explode

[espaço]comédia romântica[espaço]

[espaço]policial[espaço]

 

daí eu tento unir e atualizar a coluna genero desta forma:

[espaço]comédia romântica,[espaço]policial,

 

Só que não sei como fazer isso, tentei fazer o explode mas ele atualiza somente um gênero para cada filme, ou seja, se o filme tiver dois gêneros ele grava somente o primeiro deixando o filme com um gênero só.

 

Por enquanto vou deixando do jeito que está mesmo até achar uma solução.

 

No meu sistema que montei com a ajuda de vocês, ele diferencia Comédia Musical de Musical mas não diferencia Ficção de Ficção Científica, engraçado né?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvi a questão fazendo um script de tratamento da linha generos na tabela video, e depois fiz um explode com ela usando a vírgula como parâmetro e montei o menu.

script de tratamento

//selecionando o id e 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'];
$id_genero = $seleciona_genero['id'];
 
//Aqui está o segredo, vou implodir o resultado do explode com ,[espaço] e no explode eu explodo usando [espaço],[espaço]
$padronizado = implode(', ',array_reverse(explode(' , ',$generos)));
//convertendo para minúsculo
$padronizado = strtolower($padronizado);
 
//atualizo a coluna genero com os dados já padronizados.
$sql = "UPDATE video SET genero ='$padronizado' WHERE id='$id_genero'";
//Executo a minha query
$query = mysql_query($sql);
//Verifico se o registro foi atualizado com sucesso
if ($query == true) {
//não dou echo aqui porque se foi atualizado retorna um vazio mas se não foi,  
}else {
echo "Não foi possível padronizar o gênero deste filme.";
}
}
///////////////////////////////////////////
//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'];
$id_filme = $seleciona_genero['id'];
 
//usando o explode para separar os gêneros
$g = explode(',',$generos);
 
//fazendo um looping dos resultados
foreach($g as $gen){
 
//montando uma vaiável para poder inserir no banco
$criterio = trim($gen);
//convertendo todas as letras em minúsculo
$criterio = strtolower($criterio);
//mostrando resultado
echo "<strong>(".$id_filme.") ".$criterio."</strong><br />";
 
 
//verifica\ndo se já existe o gênero com o id na tab_genero
$verifica = ("SELECT * FROM tab_genero WHERE id_video = '".$id_filme."' AND genero = '".$criterio."'");
$sql_verifica = mysql_query($verifica);
 
$exibe = mysql_fetch_array($sql_verifica);
 
$id  = $exibe['id_video'];
$genero  = $exibe['genero'];
 
//aqui verifico se já existe o gênero para o id
if (($id == $id_filme) AND ($genero == $criterio)) {
//echo "<vermelho> O id(".$id_filme.") já tem o ítem (".$criterio.") cadastrado</vermelho><br />";
 
//deleto qualquer duplicata que por ventura estejam na tab_genero( só foi feito isto porque a tab_genero já existia antes do tratamento
$deleta = "DELETE DUPLICAT KEY genero FROM tab_genero WHERE genero = '".$genero."' AND id_video = '".$id_filme."'";
//Executo a minha query
$queryDeleta = mysql_query($deleta);
//Verifico se o registro foi excluído com sucesso
if ($queryDeleta == true) {
echo "Gênero duplicado excluído."; 
}else {
echo "Não foi possível excluir os registros duplicados ou não existe duplicação.<br />";
} 
} else {
 
//Se não existe eu gravo 
$sql_insere = "INSERT INTO tab_genero(id, genero, id_video) VALUES (NULL, '".$criterio."', '".$id_filme."')";
//Executo a minha query
$query_insere = mysql_query($sql_insere);
//Verifico se o registro foi inserido com sucesso
if ($query_insere == true) {
echo "inserido com sucesso";
}else {
echo "Não foi gravado o ítem <strong>".$criterio."</strong> no menu de gêneros.<br />";
} 
}
}
}
 
 
echo '<h1> Deletando registros vazios da tabela tb_generos</h1>';
//deletando registros vazio porque existirão devido ao modo de padronização que tem espaço antes da vírgula.
$deleta = "DELETE FROM tab_genero WHERE genero = ' '";
//Executo a minha query
$query = mysql_query($deleta);
//Verifico se o registro foi excluído com sucesso
if ($query == true) {
echo "registros vazios excluídos com sucesso!!!";
echo $sucesso;
 
}else {
echo "Não foi possível excluir os registros vazios.<br />";
}

Monto o menu e acrescento vírgula no link para que o mesmo funcione.

//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 "<hr style='width:100%;' /><h1>Total de gêneros: ".$numero."</h1>";
 
//looping na query
while($mostra_genero = mysql_fetch_array($consulta_genero)){
 
$genero = $mostra_genero['genero'];
 
//mostro resultado
if($genero == ''){
//Não do echo aqui porque quero que não apareça nada
}
//mostro o menu montado
echo '<li><a href="../index.php?genero='.$genero.'," title=""><span style="color:#8B3A3A">'.$genero.'</span></a></li>';
}

Acredito que este código pode ser enxugado mas do jeito que está , me ajudou muito e as respostas aqui no tópico que me fizeram chegar ao script. Obrigado.

Coloquei o resultado porque se alguém quiser usar ele está aí disponível.

 

Se alguém conseguir enxugar, se puder, posta aqui também.

Obrigado a todos e até a próxima.

Carlos Madeira Cunha

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.