• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

pfilipao

Sistema que destaca palavras e mostra definição ao passar o rato -- Com BD

36 mensagens neste tópico

Boas.

Estou a tentar desenvolver um painel de controlo de um website que precisa das seguintes funções:

-O gestor insere várias noticias na base de dados.

-Noutra tabela sao guardadas palavras com repectiva definição.

-Depois já no site em si essas noticias são mostradas ao utilizador. Ao ser mostrada uma noticia, as palavras que se encontram na tabelas da palavras têm que ficar destacadas naquele no texto da noticia e ao passar o rato por cima dessas palavras aparece uma caixa de texto com a respectiva definição de cada uma (também guardada na BD).

A parte de inserir as noticias e as palavras na BD já está completa  mas a parte que mostra a noticia ao utilizador eu não sei como fazer para destacar todas as palavras encontradas na bd e mostrar a tal definição.

A parte de mostrar a definição das palavras tem de ser feita em java mas penso que este seria o melhor local para fazer este post pois a maior parte do sistema e feito em  PHP.  :D

Alguem tem como me ajudar? Penso que a minha descrição está explicita mas caso não tenham entendido digam que tento explicar melhor.

Cumps obrigado  :fartnew2:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Fazes algo tipo isto.

//aqui tens de fazer os selects com as palavras e as definições.
$passar = 0;

while ($passar < mysql_num_rows($select_id)){

$noticia str_replace($noticia, mysql_result($select_palavra, $passar), "<b><a onMouseOver="funcao_mostrar_textbox(\"".mysql_result($select_descricao, $passar)."\")">".mysql_result($select_palavra, $passar)."</a></b>");

$passar++;
}

Não testei, mas é algo como isso. :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Assim não funciona, pois assim ele ira destacar apenas a primeira palavra que encomtra na BD. para resolver isso o que fiz foi dividir os texto num array e aplicar o str a uma palavra de cada vez e escrever uma de cada vez seguida de um espaço tal como no exmplo abaixo:

split(' ', $texto) // aqui dividia o texto num array com todas as palavras
For($i corre todas as noticias){
     for($o corre todas as palavras){
          if(verifica se a palavra na BD e igual a do $texto[$o];
               aplica o str_replace no fragmento de texto i e quarda altera o na variavel para o valor do str_replace.
      } // for das palavras
     for($p=0; $p <= count($texto))
         echo $texto[$p]." "; 
}//for das noticias

Percebes?

Isto assim funcionava mas apenas a na primeira noticia, pois a segunda ficava sem destaques. Não tentei aplicar o script das definições mas penso que isso não sera o maior problema.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estás muito enganado. :nono: Não vez que eu fiz um while que vai percorrer todos os registos da BD.

Depois de fazeres as querys MySQL, ele fazia-te isso direito.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ok vou entao testar com o teu while, mas tem que ficar para amanha pois isto e um trabalho de estagio...

obrigado depois digo algo.  :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Usa Ajax.

Isso não é necessário porque faz o mesmo sem AJAX e não precisa de fazer reload da página nem usa frames, por isso, AJAX é tempo perdido para isto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso não é necessário porque faz o mesmo sem AJAX e não precisa de fazer reload da página nem usa frames, por isso, AJAX é tempo perdido para isto.

Primeiro, o teu método gasta muito mais bandwidth do que se usares Ajax para fazeres um request à base de dados.

Segundo, AJAX não faz reload da página nenhum.

Terceira, quem é que falou em frames? What the hell?

(Estarás a confundir o Asynchronous JavaScript and XML com o produto de limpeza Ajax? Frames? Janelas? Hmm..)

Continuo a dizer, usa Ajax.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o problema e k eu de ajax percebo exactamente nada  :eek:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o problema e k eu de ajax percebo exactamente nada  :eek:

Ajax não é uma linguagem, mas sim uma maneira de usar standards já existentes.

Não tens muito que aprender já que já sabes básicos de PHP, só tens de saber algum JavaScript também (para fazeres o que queres).

É sempre bom aprender: http://w3schools.com/ajax/default.asp :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Usa Ajax.

AJAX aqui não faz muito sentido, visto que ele quer que as palavras sejam destacadas do resto da noticia, sempre. Logo mesmo se usasses AJAX logo no 1º momento que fizesses load à pagina lá terias que efectuar os pedidos. O que em performance seria bastante pior se fizesse logo tudo de uma só vez no servidor.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

AJAX aqui não faz muito sentido, visto que ele quer que as palavras sejam destacadas do resto da noticia, sempre. Logo mesmo se usasses AJAX logo no 1º momento que fizesses load à pagina lá terias que efectuar os pedidos. O que em performance seria bastante pior se fizesse logo tudo de uma só vez no servidor.

O Ajax seria usado para o on-over com as "definições", e não para destacar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O Ajax seria usado para o on-over com as "definições", e não para destacar.

Na mesma completamente desnecessário, a não ser que estejamos a falar de textos enormes. Mas pelo post inicial não me pareceu, até que se tal fosse, a dita caixa de texto não seria lá muito apelativa esteticamente.

Aumentas o tempo de resposta, para além de ires martelar mais vezes a BD.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Na mesma completamente desnecessário, a não ser que estejamos a falar de textos enormes. Mas pelo post inicial não me pareceu, até que se tal fosse, a dita caixa de texto não seria lá muito apelativa esteticamente.

Aumentas o tempo de resposta, para além de ires martelar mais vezes a BD.

Opiniões, o teu completamente para mim é isento de "completamentes". :)

Nunca fui adepto de imprimir tudo à força na página, até porque na minha opinião isso vai contra as (minhas) leis da automatização e optimização.

É um gasto de bandwidth completamente dispensável quando Ajax faria o trabalho in no time.

"martelar mais vezes a BD" é um termo um bocado exagerado.

Vamos supor que precisas de 500 definições para uma página só, vais estar a imprimir todas as definições?

Isso não me parece muito lógico.. But hey, that's me. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É um gasto de bandwidth completamente dispensável quando Ajax faria o trabalho in no time.

"martelar mais vezes a BD" é um termo um bocado exagerado.

Tens a noção que por AJAX ias gastar mais largura de banda certo? A principal vantagem é que é mais distribuída em vez de ser toda logo ao inicio. Em relação a martelar mais vezes a BD como é exagerado? Basta passares 1 vez com o rato que irás aceder mais 1 vez do que se não usasses AJAX. Para não falar que se não implementasses qualquer método de guardar os valores para eventos futuros se uma pessoa passasse o rato 10x seria 10 pedidos à BD.

Vamos supor que precisas de 500 definições para uma página só, vais estar a imprimir todas as definições?

Oky vamos supor esse número, bastante alto se tomarmos em consideração outros sites que tem a mesma funcionalidade em que normalmente só tem cerca de 3 a 5 por página e nunca vi com mais de 10.

Vamos presumir que em média cada definição contêm 10 palavras. 500 * 10 = 5000

Vamos presumir que a média de comprimento de cada palavra é 6 letras. 5000 * 6 = 30000

Vamos presumir que cada letra ocupa 2 bytes. 30000 * 2 = 60000

Ora 60000 / 1024 ~= 58,6 KB

Ou seja daria ao todo uns 60 KB, isso é o tamanho da imagem de assinatura do scorch. Hoje em dia praticamente irrelevante...

E como disse 500 palavras é um exagero, se percebi o que ele pretende os valores devem ser muito mais baixos que isso...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hmmk, já lá vai o tempo que tinha paciência para discutir isto com grandes textos e não sei quê (não nesta comunidade, mas noutras).

Eu dei a minha recomendação, o poster decide qual seguir.

E com Ajax, a largura de banda gasta seria relativa, e provavelmente muitas vezes inferior que a gasta se obtivesses os valores todos de uma vez. Se não vês isso, então nem vale a pena discutirmos isto.

Para não falar que se não implementasses qualquer método de guardar os valores para eventos futuros se uma pessoa passasse o rato 10x seria 10 pedidos à BD.

Acho que se torna óbvia a implementação de tal método. Com um bocadinho de JavaScript e Ajax, nada mais simples.

A sugestão do scorch (e aparentemente a tua também), parece-me a solução para o lixo em muitos lugares do mundo.. "Let's just dump it somewhere, people won't notice!".

Enfim, opiniões. Já se faz tarde e preciso do meu sono, g'night.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E com Ajax, a largura de banda gasta seria relativa, e provavelmente muitas vezes inferior que a gasta se obtivesses os valores todos de uma vez. Se não vês isso, então nem vale a pena discutirmos isto.

Claro, basta o utilizador não ver nenhuma das palavras que nada irá ser transferido. Mas o que eu quero passar é que a quantidade é tão pequena que torna-se irrelevante. E sinceramente não vale a pena complicar, para um ganho tão irrisório.

Acho que se torna óbvia a implementação de tal método. Com um bocadinho de JavaScript e Ajax, nada mais simples.

Yep bastante simples. Apenas referi porque muitas pessoas não implementariam tal método. Principalmente quando penso que o autor da thread seria uma dessas pessoas.

A sugestão do scorch (e aparentemente a tua também), parece-me a solução para o lixo em muitos lugares do mundo.. "Let's just dump it somewhere, people won't notice!".

Não percebi o comentário.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se for possível arranjar uma forma de fazer as coisas que ocupe menos espaço, menos tempo e, consequentemente, no longo prazo, custe menos, então essa é a forma ideal de se fazerem as coisas.

Isto é regra geral e não e só na programação.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se fossem 500 palavras, no texto dele, todas as palavras teriam definições, já para não falar que seria um testamento. :)

Ou seja daria ao todo uns 60 KB, isso é o tamanho da imagem de assinatura do scorch.

Vais dar matemático. :)

Na minha opinião, AJAX serve para enviar dados e receber a resposta. Se o que se recebe é sempre o mesmo, como neste caso, AJAX seria um desperdício.

Se fosse para fazer login, AJAX ficaria bem, assim ele verificava e tudo mais sem fazer o reload da página.

Mas o pfilipao é que decide como quer fazer.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se for possível arranjar uma forma de fazer as coisas que ocupe menos espaço, menos tempo e, consequentemente, no longo prazo, custe menos, então essa é a forma ideal de se fazerem as coisas.

Isto é regra geral e não e só na programação.

Premature optimization is the root of all evil ~ Knuth

Se estivermos a arranjar forma de fazer as coisas a ocupar menos espaço e menos tempo, então nunca acabamos nada. Irá haver sempre uma forma de tornar um pouco mais rápido ou mais leve. A questão é onde traçar a fronteira, pesar o investimento vs ganho.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se fossem 500 palavras, no texto dele, todas as palavras teriam definições, já para não falar que seria um testamento. :)

Isso é irrelevante.

Na minha opinião, AJAX serve para enviar dados e receber a resposta. Se o que se recebe é sempre o mesmo, como neste caso, AJAX seria um desperdício.

Não vejo porque é que seria sempre o mesmo.

Premature optimization is the root of all evil ~ Knuth

Se estivermos a arranjar forma de fazer as coisas a ocupar menos espaço e menos tempo, então nunca acabamos nada. Irá haver sempre uma forma de tornar um pouco mais rápido ou mais leve. A questão é onde traçar a fronteira, pesar o investimento vs ganho.

"Investimento vs ganho". Sim porque percorrer 5000 registos com definições diferentes para 5 palavras talvez num texto é que é o método optimizado, "em que há mais ganho".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vou primeiro tentar com a ideia do Scorch pois prcebo ja alguma coisa de php e como este sistema n terá muitos dados penso que n haverá grande problema, pois isto irá ter no maximo 5 ou 6 noticias e as palavras tambem n devem ser mais que 50 ou 100.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ja estou farto de dar voltas com isto e não sai nada bem feito.
pelo meu raciocinio este sistema tera que ter 1 ciclo que vai correr todas as noticias, dentro desse outro ciclo para correr as palavras e dentro deste ultimo é que é aplicada a alteração à noticia caso a palavra que do ciclo se encontre no texto. Eu fiz isto usando o str_replace para aplicar o efeito mas o problema é que ao destacar uma palavra a palavra anterior ja n fica destacda.

o codigo que fiz é este:

[code<?php require_once('verifica.php'); ?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Untitled Document</title>
</head>

<body alink="#000000" vlink="#000000" link="#000000"><br>
<br><div align="center">
<?php
   	   include ("ligar.php");
	//vai buscar os dados das noticias (titulo, noticia data, etc
   $consulta=mysql_query("select * from registos order by codigo;");
   //vai buscar as palavras
   $conpalavra=mysql_query("select * from palavras;");
   //numero de noticias
	$nregistos=mysql_num_rows($consulta);
	//numero de palavras
	$npalavras=mysql_num_rows($conpalavra);	  
	//se não existem noticias 
   if($nregistos==0){
   echo '<fieldset style="width: 800;"><b>Não existe nenhuma noticia guardada na base de dados. Clique no botão abaixo para inserir!</b></fieldset>';}
   else{
   //se existem cria um ciclo que corre todas as noticias
       for($i=0; $i<$nregistos; $i++)
       {
   //cria um array com os dados da noticia na posição $i
   $registo=mysql_fetch_assoc($consulta);
   //variavel com o codigo da noticia que serve para enviar para a pagina de eliminar e de editar
   $reg=$registo['codigo'];
   			//abre o fieldset
                echo '<fieldset style="width: 600;">';
			//escreve o titulo
                echo '<label><b><font size=3 face=Verdana>'.$registo['titulo'].'</font></b></label>';
			//abre uma tabela dentro do fieldset
			echo '<table width="100%" border=0><tr><td><br><label>';
			//ciclo que vai correr todas as palavras
			for($o=0; $o<$npalavras; $o++)
       			{
			//cria um array com os dados da palavra encontrada na posição $o
			$palavra=mysql_fetch_assoc($conpalavra);
			//aplica o efeito a noticia $i caso a palvra $o la exista
			$texto = str_replace($palavra['palavra'], "<b>". $palavra['palavra'] ."</b>", $registo['noticia']);
			}
			//escreve o a noticia final
			echo $texto."<br>";
			echo '</label><br><br>';
                echo $registo['data'].'</td>';?><br>
			<td width="125" align="center"><a href="vergrande.php?accao=<? echo $reg;?>" target="_blank"><img src="<? echo mysql_result($consulta,$i,"imagem");?>" border="0" width="100"><br>
			Tamanho Original</a></td></tr>
                <?
			echo "<tr><td colspan=2 align=right><br><a href=\"remove.php?accao=$reg\"><img border=0 width=30 src=\"imagens/drop.png\" alt=\"Eliminar\"></a>
			<a href=\"alterar.php?altera=$reg\"><img border=\"0\" width=30 src=\"imagens/edit.png\" alt=\"Alterar\"></a>              </tr></td></table>";
			echo '</fieldset><br><br>';
       }
   }
       ?>
   
</table>
</div><br>

<div align="center"><a href="inserir.php"><img src="imagens/inserir.png" width="100" alt="Inserir" border="0"></a>
</div>
</body>
</html>

as palavras que tenho na BD sao "ola" e "portugal" e o resultado é este:

efeitop.jpg

ou seja apenas a ultima palavra encontrada na BD fica destacada. Mas se eu puser o echo que escreve o texto dentro do ciclo, acontece isto:

width=750 height=562http://img167.imageshack.us/img167/6089/efeitoo.jpg[/img]

como podem ver além de ele escreve 2 vexes a frase com um palavra destacada em cada uma, também só o faz na primeira noticia. :wallbash:

Alguem tem como resolver isto?  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tenta isto.

<?php require_once('verifica.php'); ?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Untitled Document</title>
</head>

<body alink="#000000" vlink="#000000" link="#000000"><br>
<br><div align="center">
<?php
            include ("ligar.php");
      //vai buscar os dados das noticias (titulo, noticia data, etc
      $consulta = mysql_query("select * from registos order by codigo;");
      //vai buscar as palavras
      $conpalavra = mysql_query("select * from palavras;");
      //numero de noticias
      $nregistos = mysql_num_rows($consulta);
      //numero de palavras
      $npalavras = mysql_num_rows($conpalavra);     
      //se não existem noticias 
      if($nregistos == 0){
      echo '<fieldset style="width: 800;"><b>Não existe nenhuma noticia guardada na base de dados. Clique no botão abaixo para inserir!</b></fieldset>';}
      else{
      //se existem cria um ciclo que corre todas as noticias
       for($i = 0; $i < $nregistos; $i++)
       {
      //cria um array com os dados da noticia na posição $i
      $registo = mysql_fetch_assoc($consulta);
      //variavel com o codigo da noticia que serve para enviar para a pagina de eliminar e de editar
      $reg = $registo['codigo'];
               //abre o fieldset
                echo '<fieldset style="width: 600;">';
            //escreve o titulo
                echo '<label><b><font size=3 face=Verdana>'.$registo['titulo'].'</font></b></label>';
            //abre uma tabela dentro do fieldset
            echo '<table width="100%" border=0><tr><td><br><label>';
            //ciclo que vai correr todas as palavras
		//Scorch: Isto é importante para o código funcionar.
		$texto = $registo['noticia']
            for($o = 0; $o < $npalavras; $o++)
                {
            //cria um array com os dados da palavra encontrada na posição $o
            $palavra = mysql_fetch_assoc($conpalavra);
            //aplica o efeito a noticia $i caso a palvra $o la exista

		//#######################LER#######################
		//Scorch: Aqui estava o problema. Estavas a substituir a $registo['noticia'] em vez do texto.
            $texto = str_replace($palavra['palavra'], "<b>". $palavra['palavra'] ."</b>", $texto);
            }
            //escreve o a noticia final
            echo $texto."<br>";
            echo '</label><br><br>';
                echo $registo['data'].'</td>';?><br>
            <td width="125" align="center"><a href="vergrande.php?accao=<? echo $reg;?>" target="_blank"><img src="<? echo mysql_result($consulta,$i,"imagem");?>" border="0" width="100"><br>
            Tamanho Original</a></td></tr>
                <?
            echo "<tr><td colspan=2 align=right><br><a href=\"remove.php?accao=$reg\"><img border=0 width=30 src=\"imagens/drop.png\" alt=\"Eliminar\"></a>
            <a href=\"alterar.php?altera=$reg\"><img border=\"0\" width=30 src=\"imagens/edit.png\" alt=\"Alterar\"></a>              </tr></td></table>";
            echo '</fieldset><br><br>';
       }
      }
       ?>
      
</table>
</div><br>

<div align="center"><a href="inserir.php"><img src="imagens/inserir.png" width="100" alt="Inserir" border="0"></a>
</div>
</body>
</html>

PS: Deixei dois comentários para perceberes o que eu fiz. Tem lá o meu nome para saberes que fui eu. ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Premature optimization is the root of all evil ~ Knuth

Aye, I'll drink for that!

Em relação ao usar AJAX ou não, não li a vossa discussão toda, mas sendo em a implementar, ia buscar a info on-the-fly (i.e., ia buscar as definições quando punha o rato por cima) e limitava-me a usar a cache do browser ou então uma variável temporal para guardar os dados enquanto tinha a página aberta. Quando a quantidade de definições é enorme, acaba por ser melhor ir martelar a BD cada vez que é preciso uma definição (porque duvido que um utilizador precise de ver 400 das 500 definições) (ou então não ser otário e usar caching na interface RPC do lado do servidor quando tenho bastante movimento) do que mandar logo tudo ao início e aumentar o tempo de carregamento. :P Mas também, esta é só a minha opinião, e apenas a segue quem quer.

PS: Pelo que li, fiquei com a impressão que isto era algo do género "tenho aqui uma palavra, mete o rato por cima para veres o significado", se entendi mal, mil desculpas ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora