Ir para conteúdo

POWERED BY:

Arquivado

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

Naty_Za

Exibir palavras relacionadas

Recommended Posts

Oi gente...

 

to com um probleminha...

 

Tenho um site de receitas... e eu gostaria que qdo a pessoa estivesse visualizando uma receita, ex: 'Bolo de chocolate"

 

em um outro canto do site, gostaria de exibir outras receitas que são relacionadas as essas palavras.. ou seja...

 

apareceria nesse espaço, receitas relacionadas a bolo e a chocolate

 

Bolo de morango

Bolo de Fubá

 

Torta de Chocolate

Milk Shake de Chocolate

 

Como faço isso???

 

Gostaria q aparecesse só o titulo mesmo, mas como vou linkar pra saber de qual receita está sendo exibida???

 

Me ajudem, por favor!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

E como que você exibe as receitas?

está puxando de uma tabela SQL ?

 

Eu faria um campo à mais como: "tipoDaReceita", esse seria um campo ID... onde eu relacionaria as receitas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim... eu puxo de uma tabela...

 

Tem os campos:

 

id_receita

titulo

ingredientes

preparo

enviado_por

email

tempo

rendimento

url_imagem

data_cadastro

 

Eu imaginei q como é no campo titulo que ficam as palavras q tem q estar relacionadas, era só fazer alguma ligação...

 

só que nãos sei como, de sempre exibir no site no as palavras dos titulos das outras receitas, q são iguais as palavras do titulo da receita q está em exibição..

 

=/

 

Mas ñ sei como fazer isso.. e também nem sei se a lógica é essa mesmo!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Naty_Za,

 

Tu podes utilizar uma consulta por palavras no mysql, por exemplo:

 

$consulta = mysql_query("SELECT nome_do_campo FROM nome_da_tabela WHERE nome_do_campo_para_pesquisa LIKE '%$variavel%'");

 

$variavel corresponde à palavra ou às palavras que tu quer utilizar na tua busca, como chocolate e bolo.

 

O melhor mesmo seria usar um OR junto.. pois aí retornariam mais resultados.

 

Os símbolos % representam uma busca que contenha aquela palavra.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então...

 

mas acontece q são muuuuuitas receitas, e muuuitas palavras pra ficar escrevendo todas no código..

 

por isso q eu gostaria q já puxasse direto do título....

 

Por todas as palavras já estão cadastradas na tabela receitas do banco...

 

 

se está mostrando a receita bolo de chocolate, gostaria q as receitas relacionadas q essa receita, aparecessem do lado.. sobre "Bolo e chocolate"

 

qdo estiver exibindo uma receita de Tender com abacaxi, as receitas relacionadas q apareceriam do lado, seriam outras, sobre "Tender e Abacaxi"

 

entende????

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi direito..

 

Se tu está mostrando uma receita com o título Tender com Abacaxi.. esse título está no banco de dados, certo?

 

Se for assim, pra mostrar esse título na página, tu usa algo como <?php echo $Titulo ?>.

 

Então tu vai utilizar essa mesma variável $Titulo para fazer uma consulta no campo Titulo da tua tabela do banco de dados e trazer as receitas que contenham no Titulo "Tender" e "Abacaxi".

 

Se os títulos das receitas são escritos diretamente no HTML, fica difícil de montar uma consulta genérica.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Os titulos são puxados do banco de dados sim, ñ escrevo no HTML...

 

eu postei a estrutra da tabela receita lá em cima...

agora vou postar a página: receita.php

 

<?php

$id_receita = $_GET["id_receita"];

$consulta = mysql_query("SELECT * FROM receitas WHERE id_receita = '$id_receita' ORDER BY id_receita ASC") or die (mysql_error());
while($verifica = mysql_fetch_array($consulta)){ 

$id_receita = $verifica["id_receita"];
$data_cadastro = $verifica["data_cadastro"];
$titulo = $verifica["titulo"];
$ingredientes  = $verifica["ingredientes"];
$preparo = $verifica["preparo"];
$enviado_por = $verifica["enviado_por"];
$email = $verifica["email"];
$url_imagem = $verifica["url_imagem"];
}
?>

e coloco o <? echo "$titulo"; ?> na parte q eu quero q ele apareça... beleza..

 

até aí tá certo..

 

agora eu quero q no outro lado do site, apareçam as receitas relacionadas ao titulo desta q está em exibição...

 

igual nesse site do mais você:

 

http://receitas.maisvoce.globo.com/Receita...LARANJA,00.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo.. tu usa a variável $titulo para mostrar o título da tua receita.

 

Então ao lado, na posição onde tu quer que apareçam as receitas relacionadas, tu precisa de uma consulta relacionada com o título da receita que está sendo vista..

 

Então vai ser algo como:

 

$consulta = mysql_query("SELECT titulo FROM receitas WHERE titulo LIKE '%$titulo%' ORDER BY titulo");

$linhas = mysql_num_rows($consulta);

 

for($i = 0; $i < $linhas; $i++)

{

$receitas_relacionadas = mysql_result($consulta, $i, "titulo");

}

 

Dessa forma, os títulos das receitas que conterem palavras semelhantes as da receita que está sendo vista, aparecerão ao lado, onde tu quiser.

 

Pra otimizar, assim como no site do Mai Você, utilize links interligados para aquelas receitas..

 

Algo como:

 

<a href='visualiza_receita.php?titulo_receita=<? echo $receitas_relacionadas?>'> $receitas relacionadas </a>

 

E na página onde irá abrir essa receita relacionada, faça a consulta pelo seu título em vez de pelo deu id.

Ou, se preferir, quando for consultar o seu título para jogar na tela do lado, consulte tbm o id de cada uma.. assim tu usa um link com id para identificar cada receita.

Compartilhar este post


Link para o post
Compartilhar em outros sites

hummmm... legal....

 

o código ficaria assim??

 

pq ñ está funcionando.. =/

 

<?
$consulta = mysql_query("SELECT titulo FROM receitas WHERE titulo LIKE '%$titulo%' ORDER BY titulo") or die (mysql_error()); 
  
$linhas = mysql_num_rows($consulta);

for($i = 0; $i < $linhas; $i++)
{
$receitas_relacionadas = mysql_result($consulta, $i, "titulo");
}
 
while($verifica = mysql_fetch_array($consulta)){ 
	  $id = $verifica["id"];
	  $titulo = $verifica["titulo"];
	  $palavras = $verifica["palavras"];
	  $receitas_relacionadas = $verifica["receitas_relacionadas"];
	  
	  echo"$receitas_relacionadas";
	  }
	  ?>

vamos fazer aparecer ao lado primeiro, pra depois pensar nos links, senão vou me embananar toda...

rs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se tu quer consultar vários dados, precisa mudar a consulta para:

 

$consulta = mysql_query("SELECT * FROM receitas WHERE ... titulo LIKE '%$titulo%' ORDER BY titulo") or die (mysql_error());

 

Mas tem um pequeno problema..

 

Do jeito como está, a consulta seria feita da seguinte forma (interpretando a query):

 

SELECT * FROM receitas WHERE tiulo LIKE '%Tender com Abacaxi%' ORDER BY titulo..

 

Mas nenhuma outra receita ver ter no seu título a frase "Tender com Abacaxi".

 

Então tu poderia 'quebrar' a variável $tiulo.. algo como:

 

$quebra_titulo = explode(" ", $titulo); // Quebra a variável $título a cada espaço

 

Depois tu pega só as palavras importantes daquela variável.. ou seja, a variável era "Tender com Abacaxi".. mas te interessa o "Tender" e o "Abacaxi" somente..

 

pega dessa forma:

 

$parte1 = $quebra_titulo[0]; // Corresponde à primeira parte da string, nesse caso: Tender

$parte2 = $quebra_titulo[2]; // Corresponde à terceira parte da string, nessa caso: Abacaxi

 

Assim, tu otimiza a tua query para:

 

$consulta = mysql_query(SELECT * FROM receitas WHERE titulo LIKE '%$parte1%' OR titulo LIKE '%$parte2%');

 

Outra coisa... se tu usares o "while($verifica = mysql_fetch_array($consulta))" não precisa usar o for($i = 0; $i < $linhas; $i++)..

 

Aliás, o While é melhor mesmo..

 

Então, fica assim:

 

<?

// Uma variável com o título da receita atual

 

$titulo

 

// Uma quebra desse titulo

 

$quebra_titulo = explode(" ", $titulo); // Quebra a variável $título a cada espaço

 

// Pegando as partes importantes

 

$parte1 = $quebra_titulo[0]; // Corresponde à primeira parte da string, nesse caso: Tender

$parte2 = $quebra_titulo[2]; // Corresponde à terceira parte da string, nessa caso: Abacaxi

 

// Fazendo a consulta

 

$consulta = mysql_query(SELECT * FROM receitas WHERE titulo LIKE '%$parte1%' OR titulo LIKE '%$parte2%');

 

// Pegando os resultados

 

while($verifica = mysql_fetch_array($consulta)){

$id_relacionado = $verifica["id"];

$titulo_relacionado = $verifica["titulo"];

$palavras_relacionado = $verifica["palavras"];

 

echo "$titulo_relacionado"; // Coloquei echo na variável $titulo_relacionado.. é o título das receitas que retornaram na consulta..

}

 

Deu pra entender?

 

Qualquer dúvida, estamos aí..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sugestão, nem sempre a primeira e a terceira palavra vão ser exatamente às importantes! Às vezes pode ter a Torta nãoseidasquantas que vai ter 2 palavras só, e o Pastel nãoseiquem de nãoseioque, que vai ter 4 palavras. Pra evitar problemas com isso, o interessante seria pegar o título da receita já quebrado, e filtrar as palavras que não interessam, vou fazer isso com expressões regulares:

 

$partes = explode(' ', $titulo);
$filtra_palavras = 'de|com|a|o|do|da|ao'; //aqui vão as palavras que não lhe interessam nos títulos, separados por |
$partes_filtradas = array();

foreach($partes as $filtrar)
{
	if(!preg_match("/$filtra_palavras/", $filtrar))
	{
		array_push($partes_filtradas, $filtrar);
	}
}

Na hora de criar a query, você pode fazer um loop para montar ela também:

 

if(count($partes_filtradas) != 0)
{
  //é interessante ver se não vai dar problemas antes de fazer as queries
  $query = "SELECT * FROM receitas WHERE titulo LIKE '%$partes_filtradas[0]%'";
  for($x = 1; $x < count($partes_filtradas); $x++)
  {
	//faço um for normal para poder começar desde o segundo elemento da array e poder adicionar OR direto na query
	$query .= " OR titulo LIKE '%$partes_filtradas[$x]%'";
  }
  $relacionadas = mysql_query($query);
  while(($relacionada = mysql_fetch_array($relacionadas)) !== NULL)
  {
	//...etc...
  }
}

Você pode fazer a filtragem direto nesse segundo loop se quiser otimizar um pouco seu script, mas em nome da simplicidade e entendimento do código farei assim ok?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi gente.... entendi a lógica q fizeram..

 

mas ainda ñ está dando certo...

 

no 1º jeito, está dando erro nessa linha:

 

$quebra_titulo = explode(" ", $titulo);

 

e no 2º. nesse aqui:

 

$partes = explode(' ', $titulo);

 

no mesmo lugar está dando erro..

 

pq será??

 

=(

Compartilhar este post


Link para o post
Compartilhar em outros sites

existe sim...

 

o erro q dá é assim:

 

Parse error: syntax error, unexpected T_VARIABLE in /home/guiadoturismoelazer/public_html/culinaria/06/banners_receita.php on line 38

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se tu puderes postar algumas linhas do teu código, podemos dar uma olhadinha..

 

Às vezes pode ser erro em uma linha anterior, até um ; faltando..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então.. olha... fiz dos dois jeitos que me passaram:

 

<? 
// Uma variável com o título da receita atual
$titulo

// Uma quebra desse titulo
$quebra_titulo = explode(" ", $titulo); // Quebra a variável $título a cada espaço

// Pegando as partes importantes 
$parte1 = $quebra_titulo[0]; // Corresponde à primeira parte da string, nesse caso: Tender
$parte2 = $quebra_titulo[2]; // Corresponde à terceira parte da string, nessa caso: Abacaxi

// Fazendo a consulta
$consulta = mysql_query(SELECT * FROM receitas WHERE titulo LIKE '%$parte1%' OR titulo LIKE '%$parte2%');

// Pegando os resultados
while($verifica = mysql_fetch_array($consulta)){
$id_relacionado = $verifica["id"];
$titulo_relacionado = $verifica["titulo"];
$palavras_relacionado = $verifica["palavras"];

echo "$titulo_relacionado"; // Coloquei echo na variável $titulo_relacionado.. é o título das receitas que retornaram na consulta..
}
?>

 

<? 
$titulo

$partes = explode(' ', $titulo);
$filtra_palavras = 'de|com|a|o|do|da|ao'; //aqui vão as palavras que não lhe interessam nos títulos, separados por |
$partes_filtradas = array();

foreach($partes as $filtrar)
{
	if(!preg_match("/$filtra_palavras/", $filtrar))
	{
		array_push($partes_filtradas, $filtrar);
	}
}

if(count($partes_filtradas) != 0)
{
  //é interessante ver se não vai dar problemas antes de fazer as queries
  $query = "SELECT * FROM receitas WHERE titulo LIKE '%$partes_filtradas[0]%'";
  for($x = 1; $x < count($partes_filtradas); $x++)
  {
	//faço um for normal para poder começar desde o segundo elemento da array e poder adicionar OR direto na query
	$query .= " OR titulo LIKE '%$partes_filtradas[$x]%'";
  }
  $relacionadas = mysql_query($query);
  
  while(($relacionada = mysql_fetch_array($relacionadas)) !== NULL)
  {

echo "$relacionada"; 
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

A variável $titulo será aquela que tu usa na tua página para dar o título da receita atual que está sendo visualizada, entende?

 

Dessa forma como nós descrevemos o código, a variável $titulo não está recebendo valor algum, por isso tu tens um erro.

 

A nível de exemplo, atribua àquela variável título no código que foi passado qualquer frase ou palavra.

 

Ela será seccionada a cada espaço.

 

Ou seja, se for uma frase como: Bolo de Chocolate, tu terás:

 

$1ªparte = Bolo;

$2ªparte = de;

$3ªparte = Chocolate;

 

Se for apena uma palavra como: Brigadeirão, ficará:

 

$1ªparte = Brigadeirão;

 

----------------------------------------------------------------------------------

 

O código do José Enésio utiliza expressões regulares que são mais indicadas mesmo para esse caso, então eu optaria por aquele código.

 

Adapta para a tua ocasião.

 

Mas não esqueça, $titulo deverá ser o seu título atual da receita, pois só assim a relação entre a receita atual e as outras receitas do banco poderá ser estabelecida.

Compartilhar este post


Link para o post
Compartilhar em outros sites

não consigo fazer....

 

http://forum.imasters.com.br/public/style_emoticons/default/no.gif

 

continua dando erro:

 

<?php

$id_receita = $_GET["id_receita"];

$consulta = mysql_query("SELECT * FROM receitas WHERE id_receita = '$id_receita' ORDER BY id_receita ASC") or die (mysql_error());
while($verifica = mysql_fetch_array($consulta)){ 

$id_receita = $verifica["id_receita"];
$titulo = $verifica["titulo"];

// Uma quebra desse titulo
$partes = explode(' ', $titulo);
$filtra_palavras = 'de|com|a|o|do|da|ao'; //aqui vão as palavras que não lhe interessam nos títulos, separados por |
$partes_filtradas = array();

foreach($partes as $filtrar)
{
	if(!preg_match("/$filtra_palavras/", $filtrar))
	{
		array_push($partes_filtradas, $filtrar);
	}
}

if(count($partes_filtradas) != 0)
{
  //é interessante ver se não vai dar problemas antes de fazer as queries
  $query = "SELECT * FROM receitas WHERE titulo LIKE '%$partes_filtradas[0]%'";
  for($x = 1; $x < count($partes_filtradas); $x++)
  {
	//faço um for normal para poder começar desde o segundo elemento da array e poder adicionar OR direto na query
	$query .= " OR titulo LIKE '%$partes_filtradas[$x]%'";
  }
  $relacionadas = mysql_query($query);
  
  while(($relacionada = mysql_fetch_array($relacionadas)) !== NULL)
  {

echo "$relacionadas"; 
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

não consigo fazer....

 

http://forum.imasters.com.br/public/style_emoticons/default/no.gif

 

continua dando erro:

 

<?php

$id_receita = $_GET["id_receita"];

$consulta = mysql_query("SELECT * FROM receitas WHERE id_receita = '$id_receita' ORDER BY id_receita ASC") or die (mysql_error());
while($verifica = mysql_fetch_array($consulta)){ 

$id_receita = $verifica["id_receita"];
$titulo = $verifica["titulo"];

// Uma quebra desse titulo
$partes = explode(' ', $titulo);
$filtra_palavras = 'de|com|a|o|do|da|ao'; //aqui vão as palavras que não lhe interessam nos títulos, separados por |
$partes_filtradas = array();

foreach($partes as $filtrar)
{
	if(!preg_match("/$filtra_palavras/", $filtrar))
	{
		array_push($partes_filtradas, $filtrar);
	}
}

if(count($partes_filtradas) != 0)
{
  //é interessante ver se não vai dar problemas antes de fazer as queries
  $query = "SELECT * FROM receitas WHERE titulo LIKE '%$partes_filtradas[0]%'";
  for($x = 1; $x < count($partes_filtradas); $x++)
  {
	//faço um for normal para poder começar desde o segundo elemento da array e poder adicionar OR direto na query
	$query .= " OR titulo LIKE '%$partes_filtradas[$x]%'";
  }
  $relacionadas = mysql_query($query);
  
  while(($relacionada = mysql_fetch_array($relacionadas)) !== NULL)
  {

echo "$relacionadas"; 
}
?>

 

Manda qual o erro que está acontecendo..

 

Mas antes, modifique isto:

 

if(!preg_match("/$filtra_palavras/", $filtrar)) para if(!preg_match(/"$filtra_palavras/", $filtrar))

 

e isto:

 

while(($relacionada = mysql_fetch_array($relacionadas)) !== NULL) para while(($relacionadas = mysql_fetch_array($relacionadas)) !== NULL)

Compartilhar este post


Link para o post
Compartilhar em outros sites

if(!preg_match("/$filtra_palavras/", $filtrar)) para if(!preg_match(/"$filtra_palavras/", $filtrar))

Não achei diferença no que você pediu senão a parte que eu sublinhei. Vai dar erro, a barra deve estar dentro da string. Ao meu ver, continua como está

 

 

 

 

while(($relacionada = mysql_fetch_array($relacionadas)) !== NULL) para while(($relacionadas = mysql_fetch_array($relacionadas)) !== NULL)

Só pegou o lugar errado para renomear. Dentro do while há um echo "$relacionadas"; que deve ser trocado por echo $relacionada["titulo"];

$relacionadas já é o nome do resource retornado pelo SELECT da query. Se mudar ali no loop vai embolar tudo.

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.