Ir para conteúdo

POWERED BY:

Arquivado

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

Igor Pereira

[Resolvido] Busca Geral..

Recommended Posts

Galera ja estou jogando a toalha.

Sei que esse assunto ja é mais do que discutido no forum, mas ainda assim tenho problemas para o meu objetivo.

Objetivo é fazer uma busca geral, que pegue tanto conteudo de BD, onde existe varias tabelas, como noticias, agenda, leis, etc.. quanto em conteudo em paginas estaticas(html).

 

se digito a palavra = abc, quero q mostra todas as linhas da tabela onde a coluna conteudo tenha a palavra abc.

 

-->1. consigo achar conteudo em paginas estaticas(html).

-->2. consigo achar conteudo em uma tabela especifica do bd, mas não em varias. ( tentei usar select * from tab1,tab2 whehre tab1.coluna = busca OR tab2.coluna = busca) mas o resultado q sai é q para cada linha da tab1.coluna aparece todas tab2.coluna.. e assim por diante

-->3. estudei sobre o full text seach mas nao conseguir inserir ao objetivo

-->4. consigo imprimir os results do intem 1 e 2, mas NAO consigo fazer a paginação,

-->5. tentei usar o API do google busca personalizada, e nao da certo.

-->6. estou jogando a toalha.. POR FAVOR ALGUEM DE UMA IDEIA, CAMINHO OU DIRECAO.....

-->7 caso alguem queira ver o codigo no qual consigo os itens 1 e 2 eu posto aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você já sabe pegar conteúdo de páginas estáticas, restaria somente pegar do bd e exibir, não?

Para fazer busca em várias tabelas não-relacionadas, existem varias formas, mas a mais simples e prática é com UNION.

 

http://forum.imasters.com.br/public/style_emoticons/default/seta.gif Veja aí: http://dev.mysql.com/doc/refman/4.1/pt/union.html

 

Até mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, mas como faria para paginação?? Veja como estou fazendo... Repare q na consulta BD estou fazendo de apenas uma tabela,( o q necessito sao varias tabelas) os results são impressos ok, tenho $i como contador dos results claro primeiro as paginas estaticas depois as paginas dinamicas, mas a ordem pouco importa no momento. mas se procuro por uma palavra comum, saem 60 registros, todos na mesma pagina. sei fazer paginação de consultas sqls simples pois é o q mais há explicações sobre paginação. mas paginação de diferentes consulta tem nem ideia...

// inicio busca em paginas htmls
	//creditos a um usuario q postou a funcaoo pesquisar no forum imasters nao lembro o nome sorry 
  function pesquisar($conteudo, $palavraBusca)
   { 
	   $cont = 0;  #contador de ocorrências  
       $pos = -1;#inicia posição abaixo de 0     
	   $conteudo = " ".$conteudo;	#desvia de bug
	   $palavraBusca = strtoupper($palavraBusca);
	    
   ;
   // $findme = highlightWords($palavraBusca ,$findme);
		while($pos != NULL)
		 { 
		 	 $separa = explode(" ", $palavraBusca);
  			 $findme = $separa[0];
			 $busca = strtoupper($conteudo);
			 $pos = strpos($busca, $findme);      
             if($pos != NULL) {$cont++;}         
		     $tam = strlen($busca);  
			   
			 $ocorrencia[] =substr($conteudo,$pos,310); #registra um pequeno texto da ocorrência    
			 $conteudo = substr($conteudo,$pos+1,$tam-$pos);
			 $conteudo = " ";#desvia de bug           
        }    
		return array('ocorrencias' => $cont, 'texto' => $ocorrencia);
  }
	$palavra = $consulta;  # aqui ficara o POST do formulario.
	$files = scandir("../diretorio/");
	$acumulador = 0;  
	$i = 1;
	foreach($files as $file)
	 {      
	    if(!is_dir($file))
		 {             
		 			
		   $dados = pesquisar(strip_tags(file_get_contents($file)), $palavra); 
		   if($dados['ocorrencias'] > 0)
		    {              
				$acumulador = $acumulador+$dados['ocorrencias'];
				print "<strong>".$i."</strong>. ";
				
				foreach($dados['texto'] as $achado) 
				 {    
				 
				     print $achado."<br />"; 
				 } 
				   
				 print '<a href="'.$file.'">'.$file.'</a><br /><br />';
				 $i= $i +1; 
			} 
			else
			{
				$vazio1 = $vazio;
			}       
		
		  $dados = NULL;   
		  unset($dados); 
	 }   
 }
 //echo $vazio1;
 // fim busca em paginas htmls.
//// inicio busca no BD
 	$npalavra = explode(" ", $consulta);
	$totalPalavras = count($npalavra);  
	/
	for($j = 0; $j < $totalPalavras; $j++)
	{  
		$complemento = " AND (pd_conteudo LIKE '% " . $npalavra[$j] . " %' OR pd_nome LIKE '%" . $npalavra[$j] . "%' )";
	}
		$condicao = " WHERE pd_status = 1 $complemento ORDER BY pd_data DESC ";
			
	$sql = "SELECT * FROM  pg_detalhe  $condicao  ";
		// echo $sql;
	$qry = mysql_query($sql, $conn) or die(mysql_error());
	
   while ($linha = mysql_fetch_assoc($qry)) {
	 
	$tabela = $linha[pd_conteudo];
	// a funcao imprimirResults é a formatação da saida.
	$resultado = imprimirResults($npalavra, $tabela);
	
	?>
    <a href="conteudo.php?id=<?php echo $linha[pd_id];?> "><?php echo $linha[pd_nome]; ?></a><br /> 
	  <?php
	  	echo "<strong>".$i."</strong>. ";
	  	echo $resultado;
		echo "<br />"; 
		echo "<br />"; 
		$i =$i + 1;
		
	}
	}
	else
	{
	echo $vazio;
	}  ?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com relação a busca em vários bds você tem que trabalhar na sua query.

O resto do código é o mesmo usado para consultar um único bd.

 

$sql = "SELECT * FROM  pg_detalhe  $condicao  ";//só tem um bd aqui, se quer consultar vários coloque-os na query   

Com relação a paginação, é a mesma coisa independente de quantos resultados retornar ou quantos bds você consultar.

Esse código que você postou não está paginando, está apenas imprimindo os resultados.

Para fazer a paginação é mais ou menos assim:

 

$total_result= count($array_resultados_busca);

$numero_de_paginas= $total_result / 10; //esse 10 é o número de resultados por página que você quiser

$comeca_em= ($_GET['pagina']*10) - 10;

$sql = "SELECT * FROM pg_detalhe $condicao LIMIT $comeca_em, 10"; 

$exe_sql= mysql_query($sql, $sua_conexao);

//laço para exibir 10 produtos por página
while($array_reultado_paginado= mysql_fecth_array($exe_sql)){
 echo $array_reultado_paginado;
}

//laço para criar os links das páginas
$total_arredondado = ceil($total_result / 10);
$menu = "";
for ($x=1; $x<=$total_arredondado; ++$x){
if ($x==$pagina){$menu .= " [$x] ";}else{$menu .= "<a href='{$_SERVER['PHP_SELF']}?pagina=$x&busca=$busca'>[$x]</a>";}
}


Fiz o mais simples possível só para mostrar a lógica, caso seja isso que você precise é só melhorar o código.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com relação a busca em vários bds você tem que trabalhar na sua query.

O resto do código é o mesmo usado para consultar um único bd.

 

Com relação a paginação, é a mesma coisa independente de quantos resultados retornar ou quantos bds você consultar.

Esse código que você postou não está paginando, está apenas imprimindo os resultados.

Para fazer a paginação é mais ou menos assim:

 

Fiz o mais simples possível só para mostrar a lógica, caso seja isso que você precise é só melhorar o código.

 

Sim mas e os resultados de paginas estaticas? como posso controlaar a qtnde por pagina e posteriormente pagina-los, de modo que apos o ultimo resultado continue os resultados do BD?

 

enfim, pensei criar mais uma tabela, e colocar o conteudo e link da pagina estatica, assim só farei busca em BD, mas estou tendo dificuldades em fazer consulta em varias tabelas nao relacionadas.. tentando usar o UNION mas n consegui :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exemplo de paginação com as duas buscas:

 

<?php



//pega os termos da busca, não esqueça de filtrar os dados
$busca= $_GET['busca'];
//-------------------------------------------------------



//pega array com resultados da busca no html
include "busca_no_html.php";
$busca_no_html= new busca_no_html($busca);
$array_resultados_busca_no_html=$buscar_html()$this->array_resultado_busca_no_html;
//-------------------------------------------------------



//pega array com resultados da busca no banco de dados
include "busca_no_bd.php";
$busca_no_bd= new busca_no_bd($busca);
$array_resultados_busca_no_bd=$buscar_bd()$this->array_resultado_busca_no_bd;
//-------------------------------------------------------



//Uni os dois arrays em um só
$array_resultados_busca = array_merge($array_resultados_busca_no_html, $array_resultados_busca_no_bd);//uni o array da busca no bd com o da busca no html
//-------------------------------------------------------



//define em qual página começa e em qual página termina a exibição de resultados
if(isset($_GET['pagina'])){
  $comeca_em= ($_GET['pagina']*10) - 10;
}else{
   $comeca_em= 0;
     }
$termina_em= $comeca_em + 10;
//-------------------------------------------------------



//laço para exibir os resultados da busca
for($i=$comeca_em; $i<$termina_em; $i++){
  echo $array_resultados_busca[$i];
}
//-------------------------------------------------------



//laço para criar os links das páginas
$total_result= count($array_resultados_busca);
$total_arredondado = ceil($total_result / 10);
$menu = "";
for ($x=1; $x<=$total_arredondado; ++$x){
  if ($x==$comeca_em){$menu .= " [$x] ";}else{$menu .= "<a href='{$_SERVER['PHP_SELF']}?pagina=$x&busca=$busca'>[$x]</a>";}
}
//-------------------------------------------------------



?>

Cada vez que o user clicar em um link:( páginas [1] [2] [3] [4]...) vai ser rodado esse mesmo script, só que vão ser exibidos os resultados de acordo com a posição do array que é passado via get.

 

Qualquer dúvida posta ai!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exemplo de paginação com as duas buscas:

 

Cada vez que o user clicar em um link:( páginas [1] [2] [3] [4]...) vai ser rodado esse mesmo script, só que vão ser exibidos os resultados de acordo com a posição do array que é passado via get.

 

Qualquer dúvida posta ai!

 

Hummm show de bola. A lógica já entendi...

Estou indo pra facul qndo voltar tentarei implementar, mas de antemao, a primeira vista n entendi as partes que busca os resultados de busca_bd.php e busca_html.php, nas respectivas paginas eu salvo os resultados em um array? e as chamo da forma q você fez...? desculpe a leiguisse rsrs, me explica melhor essas 2 partes aew...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você entendeu, é isso mesmo, mas para retornar os arrays do jeito que eu fiz tem que saber POO,

 

Isso é POO:

include "busca_no_html.php";
$busca_no_html= new busca_no_html($busca);
$array_resultados_busca_no_html=$buscar_html()$this->array_resultado_busca_no_html;
Mas se ainda não souber POO faça mais simples,

 

Só não coloque tudo em uma única página, senão vira um spaguete :D

 

Fazendo mais simples....

 

<?php



//pega os termos da busca, não esqueça de filtrar os dados
$busca= $_GET['busca'];
//-------------------------------------------------------



//todo o código que faz a busca no html vai separado no arquivo "busca_no_html.php" 
//Programe normalmente e jogue o resultado em: $array_resultados_busca_no_html   
include "busca_no_html.php";
//-------------------------------------------------------



//todo o código que faz a busca no banco de dados vai separado no arquivo "busca_no_bd.php" 
//Programe normalmente e jogue o resultado em: $array_resultados_busca_no_bd
include "busca_no_bd.php";
//-------------------------------------------------------



//Depois você junta os dois arrays em um só
$array_resultados_busca = array_merge($array_resultados_busca_no_html, $array_resultados_busca_no_bd);//uni o array da busca no bd com o da busca no html
//-------------------------------------------------------



//define em qual página começa e em qual página termina a exibição de resultados
if(isset($_GET['pagina'])){
  $comeca_em= ($_GET['pagina']*10) - 10;
}else{
   $comeca_em= 0;
     }
$termina_em= $comeca_em + 10;
//-------------------------------------------------------



//laço para exibir os resultados da busca
for($i=$comeca_em; $i<$termina_em; $i++){
  echo $array_resultados_busca[$i];
}
//-------------------------------------------------------



//laço para criar os links das páginas
$total_result= count($array_resultados_busca);
$total_arredondado = ceil($total_result / 10);
$menu = "";
for ($x=1; $x<=$total_arredondado; ++$x){
  if ($x==$comeca_em){$menu .= " [$x] ";}else{$menu .= "<a href='{$_SERVER['PHP_SELF']}?pagina=$x&busca=$busca'>[$x]</a>";}
}
//-------------------------------------------------------



?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gustavo,

 

Desde já agradeço a ajuda, pois ja esta 98% funcionando rsrsrs...

 

só esta acontencendo um probleminha, nao to conseguindo pegar o resultado (texto onde contem a o correncia). todo o restante como results no bd, a escrita dos resultados com paginacao esta ok.

 

//AONDE ESTA COMENTADO ERA O O CODIGO ANTIGO

if($dados['ocorrencias'] > 0)
 { 
   $acumulador = $acumulador+$dados['ocorrencias'];
  // print '<table><tr><td valign="top"><img src="tec7.jpg" width="21" height="21" /></td>';
   foreach($dados['texto'] as $achado) 
   {    
    //  print $achado."<br />";
    // salvando o texto no array, se eu jogar direto para o busca.php, ele mostra o resultado normal mas sem os links
     $result[] = $achado;

   }   
   // print '<a href="'.$file.'"><img src="tec55.jpg" width="68" height="22"   border="0" /> </a>';
   // salvando os links na variavel para concatenar com o texto da ocorrencia
   $link = '<a href="'.$file.'"><img src="tec55.jpg" width="68" height="22" border="0" /></a><br /><br /><br />';
   $acumulador++; 
   //concatenando o texto da ocorrencia junto com o link dentro do array q vai para pagina busca.php
   $arr1[] = $result."<br />".$link; 
 } 
  $dados = NULL;   
  unset($dados); 
	

o resultado sai:

array

link

.

.

array

link

 

ou seja, ta tudo ok, so o result[], nao esta pegando nada da variavel $achado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você usou array_merge() para juntar os dois arrays?

//Depois você junta os dois arrays em um só
$array_resultados_busca = array_merge($array_resultados_busca_no_html, $array_resultados_busca_no_bd);//uni o array da busca no bd com o da busca no html
//-------------------------------------------------------
Caso sim, então você tem um array com o resultado de ambas as buscas, agora para a paginação depende de como está esse array, para saber use print_r($seuArray); para imprimir o conteúdo desse array na tela, poste o resultado e aí então a gente planeja como fazer a paginação.

 

A estrutura do array que vai ser usado na paginação tem que ser mais ou menos assim:

//esse array você constrói na página que faz a busca no banco de dados
	$array_resultados_busca_no_bd[0][0] = "link 0";
	$array_resultados_busca_no_bd[0][1] = "link 1";
	$array_resultados_busca_no_bd[0][2] = "link 2";
	$array_resultados_busca_no_bd[0][3] = "link 3";
        $array_resultados_busca_no_bd[1][0] = "texto link 0";
	$array_resultados_busca_no_bd[1][1] = "texto link 1";
	$array_resultados_busca_no_bd[1][2] = "texto link 2";
	$array_resultados_busca_no_bd[1][3] = "texto link 3";
//-----------------------------------------------------------------------



//esse array você constrói na página que faz a busca no HTML
	$array_resultados_busca_no_html[0][0] = "link 0";
	$array_resultados_busca_no_html[0][1] = "link 1";
	$array_resultados_busca_no_html[0][2] = "link 2";
	$array_resultados_busca_no_html[0][3] = "link 3";
        $array_resultados_busca_no_html[1][0] = "texto link 0";
	$array_resultados_busca_no_html[1][1] = "texto link 1";
	$array_resultados_busca_no_html[1][2] = "texto link 2";
	$array_resultados_busca_no_html[1][3] = "texto link 3";
//-----------------------------------------------------------------------

	

//na página que faz a paginação você junta os dois arrays
$array_resultados_busca = array_merge($array_resultados_busca_no_html, $array_resultados_busca_no_bd);
//-----------------------------------------------------------------------



//use print_r() para ver ser o arrray foi gerado corretamente antes de prosseguir para a paginação
print_r($array_resultados_busca);

Compartilhar este post


Link para o post
Compartilhar em outros sites

no print_r($array_resultados_busca_no_bd);

aparece ok conteudo e abaixo o link do conteudo:

 

array ( [0] => $conteudo "<br />" $link

[1] => $conteudo "<br />" $link

...

e assim por diante

no print_r($array_resultados_busca_no_html);

e a mesma estrutura, mas nao aparece o conteudo da variavel $conteudo:

 

array ( [0] => $conteudo "<br />" $link

[1] => (a palavra array) "<br />" $link

...

e assim por diante

no print_r($array_resultados_busca);

continua a mesma estrutura, mas unindo os dois arrays conforme você mostrou:

 

array ( [0] => (a palavra array)"<br />" $link

[1] => (a palavra array) "<br />" $link

...

[4] => (results do bd) $conteudo "<br />" $link

e assim por diante

acho q a dificuldade é pegar essa variavel $conteudo, no script busca_no_html.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Trabalhe então nessa página busca_no_html.php até conseguir ter o array com uma mesma estrutura do outro.

 

Aí então você pode juntá-los e prosseguir para a paginação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvido!!! até que fim!!!

 

Só acertei mais o codigo busca_no_html, e esta funfandoo, referente a paginação ja consegui tambem.. Vou da uma melhorada no codigo e irei postar, para a galera que tiverem dificuldade num problema similar. vlww :D

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.