Ir ao conteúdo
  • Cadastre-se

Sistema de busca PHP


Posts recomendados

  • Moderador

@thiagosvl

 

Como disse anteriormente é uma maneira pouco usual.. onde você faz várias queries... e para cada query  um laço de while.. por que se não colocar o laço  só irá mostrar apenas 1 registro.

Isso não é uma "solução" é só um jeito  de Muitas que pode ser feito.

 

No seu caso que é bem leigo nesta parte.. eu até recomendaria que você fizesse seu site em uma plataforma mais amigável.. por exemplo o wordpress.

Ele não é só para blogs...   sites podes ser feitos com ele... e ele oferece recursos.. como integrar com rede sociais..  sistema de busca.., obviamente um banco de dados já modelado..  e um painel admin onde podes inserir seus conteúdos...  

Link para o comentário
Compartilhar em outros sites

Mas a minha ideia é de realmente ter contato direto com as linguagens.

Como já disse, tenho total noção de HTML e CSS, ontem iniciei JS, então fica nítida minha falta de experiência em PHP..

Fico feliz com sua ajuda, porque alem de me auxiliar, me fez ter contato e agora entendo basicamente as sintaxes que utilizamos acima, como while, select.

Amanha implantarei o código em minha página e trarei o resultado.

Desde já, obrigado!

Link para o comentário
Compartilhar em outros sites

@dif

 

Utilizei o código descrito por você no localhost e também no servidor remoto, mas nos dois recebi o seguinte erro:

 

Warning: mysqli_fetch_object() expects parameter 1 to be mysqli_result, boolean given in/home/u579407707/public_html/valida.php on line 24

 

 

No código ainda faltou um FROM na variavel $procura_pontos, completei, e mesmo assim surgiu o mesmo erro.

 

Alguma dica?

Desde já, obrigado!

Link para o comentário
Compartilhar em outros sites

  • Moderador

@thiagosvl

 

Não sei o por que do erro..   Em tese funciona... como já tinha dito.

 

Faz assim:

posta aqui seu código do jeito que está fazendo, sem omitir nada..

 

Se quiser podes fazer um backup do seu banco de dados..enviar para algum servidor tipo mega...  e disponibilizar o link..

assim eu poderia testar aqui e dizer com certeza onde está com mal funcionamento.. ou pelo menos tentar descobrir.

 

O que eu posso dizer por agora é  tu tentar fazer por partes... por exemplo use uma tabela só e tente exibir apenas um campo em tela

e aí vai aumentando gradativamente

Link para o comentário
Compartilhar em outros sites

@dif

Olha, dei uma atualizada no código e ficou da seguinte forma:

<?php	   $busca = $_POST["busca"];    $procura_textos = mysqli_query($conecta, "SELECT * FROM textos WHERE titulo LIKE '% $busca %' OR texto LIKE '% $busca %'");      $procura_pontos = mysqli_query($conecta, "SELECT * FROM pontos WHERE titulo LIKE '% $busca %' OR texto LIKE '% $busca %'");    while($textos = mysqli_fetch_object($procura_textos)) {     echo $textos->titulo . "<br/>" . $textos->texto ."<br/><br/>";   };      while($pontos = mysqli_fetch_object($procura_pontos)) {     echo $pontos->titulo . "<br/>" . $pontos->texto ."<br/><br/>";   }; ?> 

O que me deixou surpreso e risonho ao mesmo tempo foi que ao digitar certas palavras que contem no post, simplesmente nao aparece nada!

Eu fiz um post na minha tabela com o seguinte conteudo: 

Os textos deverão ir aqui, junto ao titulo e bla bla bla...

Simplesmente ele só encontra os posts dependendo da palavra que eu digitar, agora porque isso ocorre eu não sei.. haha!

 

A parte boa de tudo isso é que agora eu consigo trazer os posts das duas tabelas graças aos dois while, basta estilizar com o CSS mesmo.

 

A parte ruim (por hora, lógico) fica por conta dos posts que não aparecem, e isso serve para os titulos também. Só é exibido os resultados dependendo da palavra.

Ex: TITULO> Alemanha campea de 2014

 

O resultado só irá aparecer se eu digitar "alemanha" no campo de busca, agora se eu digitar "2014" ou alguma outra, já não aparece..

 

Mais uma vez, quero agradecer por todo este esforço que tem feito, de verdade!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Moderador

@thiagosvl

 

Tem mais umas opções que podes tentar..  por exemplo na consulta usar a cláusula  UNION..

 

por exemplo:

mysqli_query($conecta, "SELECT * FROM textos WHERE texto LIKE '%$busca%' UNION SELECT * FROM pontos WHERE texto LIKE '%$busca%'");

Não sei se resolve(nunca utilizei isso)

 

Mas tem outra coisa que podes fazer que eu acho boa e uso quando preciso.

É a criação de uma tabela espelho(VIEW).

 

onde você usa uma ou mais instruções para criar uma tabela espelhada com todos os registros que quiser...  depois bastando fazer um select nesta tabela espelho.

Por exemplo fazer algo do tipo:

CREATE VIEW site AS (   SELECT * FROM textos UNION   SELECT * FROM pontos);

isso fará que o mysql automaticamente criar uma tabela espelho que vai conter todos os dados da tabela textos e da tabela pontos..

 

então fará a seguinte consulta:

SELECT * FROM site WHERE titulo LIKE '%$busca%' OR texto LIKE '%$busca%'

Nesse caso pode haver alguns problemas como mostrar coisas duplicadas.. e etc...  mas enfim o esquema é tentar

 

PS: o código do create VIEW só precisa ser executado uma vez só  diretamente no phpmyadmin.

 

Outra coisa,  quando for criar a VIEW, podes selecionar só os campos que tu vai fazer a pesquisa por exemplo:

CREATE VIEW site AS (   SELECT titulo, texto FROM textos UNION   SELECT titulo, texto FROM pontos);

Importante que fique tudo com o mesmo nome de campo para poder pesquisar.

Nessa tabela espelho você não insere  nenhum dado e nem exclui... ela é só um espelho retornando tudo em uma única tabela..

caso tu delete algo das tabelas originais... vai refletir mudanças na tabela espelho.

Link para o comentário
Compartilhar em outros sites

Boa noite @dif

e mais uma vez, obrigado.

 

Duas coisas a dizer: Utilizei o primeiro método com UNION, e o resultado que obtive foi aquele famoso erro de "Warning: mysqli_fetch_object() expects parameter 1 to be mysqli_result, boolean given in ".

O código ficou com a seguinte estrutura (me corrija se estiver errado!):

<?php	   $busca = $_POST["busca"];    $procura_textos = mysqli_query($conecta, "SELECT * FROM textos WHERE texto LIKE '%$busca%' UNION SELECT * FROM pontos WHERE texto LIKE '%$busca%'");    while($textos = mysqli_fetch_object($procura_textos)) {     echo '<div id="verifica">'.$textos->titulo . "<br/>" . $textos->texto ."</div>";   };       ?> 

Por fim, testei o código de criação da tabela VIEW, e o resultado (negativo, infelizmente) foi o seguinte:

CREATE VIEW site AS (
SELECT titulo, texto FROM textos
UNION
SELECT titulo, texto FROM pontos
)

Mensagens do MySQL : dot.gif

#1064 - Erreur de syntaxe près de 'UNION
   SELECT titulo, texto FROM pontos
)' à la ligne 3 

 

Alguma luz? 

Desde já, obrigado!

 

obs: Relembrando que com o seguinte código a busca acontece nas duas tabelas. Porém, de forma inusitada, só trás os valores dependendo da palavra que eu digitar.

<?php	   $busca = $_POST["busca"];    $procura_textos = mysqli_query($conecta, "SELECT * FROM textos WHERE titulo LIKE '% $busca %' OR texto LIKE '% $busca %'");      $procura_pontos = mysqli_query($conecta, "SELECT * FROM pontos WHERE titulo LIKE '% $busca %' OR texto LIKE '% $busca %'");    while($textos = mysqli_fetch_object($procura_textos)) {     echo '<div id="verifica">'.$textos->titulo . "<br/>" . $textos->texto ."</div>";   };      while($pontos = mysqli_fetch_object($procura_pontos)) {		echo '<div id="verifica"><div id="titulo-pontos">'.$pontos->titulo.'</div>';		echo '<div id="play-pontos">			<audio controls="controls"><p>Seu nevegador não suporta o elemento audio.</p>				<source src="'.$pontos->play.'" type="audio/mp3" />			</audio>			</div>';		echo '<div id="download-pontos">				<a href="'.$pontos-> download.'" target="_blank">DOWNLOAD</a>			</div>';			echo '<div id="ponto-pontos">				<pre>'.$pontos->texto.'</pre>			</div></div>';		}; ?> 

PS: o arquivo de configuração com o banco de dados é chamado no topo da página, por isso não aparece no código.

Link para o comentário
Compartilhar em outros sites

  • Moderador

@thiagosvl

 

É realmente o buraco do seu problema é bem mais embaixo.

Pesquisando sobre.. até descobri uma coisa que eu não sabia!  rsrs

 

Então,

O mysql não suporta a busca de frases ou fragmentos de texto. Não sem utilizar alguns recursos.

Usando consultas simples  não tem como..  mas descobri um jeito.

 

Para que funcione, precisas definir um índice para o campo do tipo FULLTEXT.

 

e então utilizar duas palavras chaves na consulta depois do WHERE chamado MATCH e  AGAINST

Isso eu realmente não conhecia.. foi novo para eu.

 

Por hora, eu deixo um exemplo da consulta... depois eu mostro como criar os índices.

SELECT textos.titulo,       textos.textoFROM textosWHERE MATCH(texto) AGAINST('"+parte da frase"' IN BOOLEAN MODE);

Veja que a função AGAINST recebe como parâmetro duas coisas.

a frase ou fragmento a ser procurada e a expressão  IN BOOLEAN MODE

 

Note que a frase,  primeiro está entre  aspas simples, depois entre aspas duplas,  um sinal de mais(+)  seguida da frase.

a aspas simples indicam que é uma STRING

a aspas duplas indicam que estas procurando uma  ou mais palavras(frase)

O sinal de mais (+) indica que tem mais coisas na frase ele é um operador lógico.. ou seja quando se procura no google .. uma frase.. ela é mostrada por exemplo no endereço:

 

Estou+procurando+uma+frase

 

isto é um operador lógico serve para concatenar valores.

 

Bem por enquanto é isso. eu fiz alguns testes já... e obtive sucesso.. porém outros até forçaram meu easyPHP se fechar sozinho... lol..

Link para o comentário
Compartilhar em outros sites

Boa tarde, @dif

Irei testar o sistema agora e já já postarei o resultado.

 

Você disse que mostraria como crias as indices.. pode explicar-me como e também para que servem?

 

Outra coisa.. esse linha de código:

  1. WHERE MATCH(texto) AGAINST('"+parte da frase"' IN BOOLEAN MODE);

No "+parte da frase" devo colocar o que? fiquei meio perdido.

Desde já, obrigado!

Link para o comentário
Compartilhar em outros sites

  • Moderador

 

 

No "+parte da frase" devo colocar o que? fiquei meio perdido.

isso já responde: 

 

Note que a frase,  primeiro está entre  aspas simples, depois entre aspas duplas,  um sinal de mais(+)  seguida da frase.

a aspas simples indicam que é uma STRING

a aspas duplas indicam que estas procurando uma  ou mais palavras(frase)

O sinal de mais (+) indica que tem mais coisas na frase ele é um operador lógico.. ou seja quando se procura no google .. uma frase.. ela é mostrada por exemplo no endereço:

 

Estou+procurando+uma+frase

 

isto é um operador lógico serve para concatenar valores.

 

resumindo ali em vermelho tu colca $busca .. exemplo:

$procura  = "+" . $busca; //estou concatenando o +  com a variável de buscaWHERE MATCH(texto) AGAINST('"$procura "' IN BOOLEAN MODE);

 

 

Você disse que mostraria como crias as indices.. pode explicar-me como e também para que servem?

 

Sim, os índices servem para otimizar a busca... também servem para indicar os campos que serão relacionados aquele lance do  1:N (um para muitos)  nas tabelas.

 

Para criar um índice precisas entrar na estrutura da sua tabela, ( é uma aba chamada estrutura no painel do phpmyadmin) e lá.. clicar onde diz "índices"

 

Clicando la, vai pedir para inserir um índice...  aí você dá um nome a esse índice.. escolhe o tipo dele, no caso é FULLTEXT e depois escolhe o campo que vai ser FULLTEXT...

 

Para que a consulta funcione... ela precisa que tenha o indice FULLTEXT nos campos onde terão frases.

Link para o comentário
Compartilhar em outros sites

@dif

No caso meus campos FULLTEXT serão "titulo" e "texto" das tabelas "textos" e "pontos", correto?

 

Como já havia me pedido, irei deixar o link do meu humilde banco de dados! rs

Segue o link: https://mega.nz/#!JBQSDJSR!nwnNAPA_KuSrJy9M8-BONhy1rUrLTEbo650zYBgYu04

 

Acessei meu PHPMYADMIN, fui no banco de dados, acessei as duas tabelas que deveriam ser alteradas e me deparei com a seguinte situação:

 

TABELA textos

 

p5xLjb.png

TABELA pontos

nWWMvF.png

 

Aonde devo alterar? Porque percebi que na lateral direita tem alguns com o icone de ÍNDICE  ativos, outros não, e fiquei sem entender..

 

Outra dúvida: a estrutura do código deverá ficar assim?:

<?php   $busca = $_POST["busca"];      $procura  = "+" . $busca;   $procura = mysqli_query($conecta, "SELECT textos.titulo,       textos.texto FROM textos WHERE MATCH(texto) AGAINST('"+$busca"' IN BOOLEAN MODE)");      while($textos = mysqli_fetch_object($procura)) {     echo '<div id="verifica">'.$textos->titulo . "<br/>" . $textos->texto ."</div>";   };?> 
  

Desculpe por criar tanto transtorno, realmente não era minha intenção.

Se houver um jeito de comunicação mais direto, tudo poderia ser mais objetivo..

 

OBS: tentei rodar o código acima e recebi o seguinte erro:

Parse error: syntax error, unexpected '"' IN BOOLEAN MODE)"' (T_CONSTANT_ENCAPSED_STRING) in C:\wamp\www\terreiro\valida.php on line 20

 

Linha 19:

$procura = mysqli_query($conecta, "SELECT textos.titulo, textos.texto FROM textos WHERE MATCH(texto) AGAINST('"+$busca"' IN BOOLEAN MODE)");
Link para o comentário
Compartilhar em outros sites

  • Moderador

@thiagosvl

 

para criar o índice corretamente siga os passos da imagem:

 

indice-criar.PNG

 

Já o erro que dá no php é por que está errado.

 

esta linha:   $procura  = "+" . $busca;

 

Já foi concatenada... 

 

então nesta linha:

$procura = mysqli_query($conecta, "SELECT textos.titulo, textos.texto FROM textos WHERE MATCH(texto) AGAINST('"+$busca"' IN BOOLEAN MODE)");

altere para: 

$procura = mysqli_query($conecta, "SELECT textos.titulo, textos.texto FROM textos WHERE MATCH(texto) AGAINST('"$busca"' IN BOOLEAN MODE)");

Ou seja.   como o sinal de operador lógico já foi concatenado a variável da pesquisa... então não precisa colocar dentro do sql.  eu achei que tinhas percebido isso no meu exemplo  mais acima.. onde eu mostro claramente.

Link para o comentário
Compartilhar em outros sites

@dif

Desculpe-me pelo transtorno e a falta de atenção, sinceramente..

 

Enfim.. 


 $busca = $_POST["busca"];   
   $procura  = "+" . $busca;
 
$procura = mysqli_query($conecta, "SELECT * FROM textos WHERE MATCH(texto) AGAINST('" . $busca . "' IN BOOLEAN MODE)");

Insisto, se mais uma vez fiz algo que não deveria, peço minhas mais sinceras desculpas! :(

 

No WHERE MATCH só busca o campo texto.. como faço para buscar o campo texto e titulo?

Link para o comentário
Compartilhar em outros sites

Boa noite, @dif

Desculpe-me por não comentar mais nada sobre o assunto, acontece que não estive em casa por esses dias..

 

o Sistema tem funcionado perfeitamente, até o momento em que eu fiz com que ele buscasse uma nova tabela, com mais um WHILE.

 

Segue o código funcionando sem a terceira tabela:

<?php   $busca = $_POST["busca"];      $procura  = "+" . $busca;$procura_textos = mysqli_query($conecta, "SELECT * FROM textos WHERE MATCH(texto) AGAINST('" . $busca . "' IN BOOLEAN MODE)");   $procura_pontos = mysqli_query($conecta, "SELECT * FROM pontos WHERE MATCH(texto) AGAINST('" . $busca . "' IN BOOLEAN MODE)");      while($textos = mysqli_fetch_object($procura_textos)) {echo '<div id="verifica"><div id="titulo-pontos">'.$textos->titulo.'</div>';echo '<div id="ponto-pontos">'.$textos->texto.'</div>' . "</div>";echo '<div id="clear">'.'</div>';}   while($pontos = mysqli_fetch_object($procura_pontos)) {echo '<div id="verifica"><div id="titulo-pontos">'.$pontos->titulo.'</div>';echo '<div id="play-pontos"><audio controls="controls"><p>Seu nevegador não suporta o elemento audio.</p><source src="'.$pontos->play.'" type="audio/mp3" /></audio></div>';echo '<div id="download-pontos"><a href="'.$pontos-> download.'" target="_blank">DOWNLOAD</a></div>';echo '<div id="ponto-pontos"><pre>'.$pontos->texto.'</pre></div></div>';};?>   
 

O código funciona perfeitamente, o unico problema nele é que na linha a seguir eu só consigo buscar o conteudo pelo texto, e nao pelo titulo e texto.. alguma dica?

$procura_pontos = mysqli_query($conecta, "SELECT * FROM pontos WHERE MATCH(texto) AGAINST('" . $busca . "' IN BOOLEAN MODE)");   

Outra situação:

No codigo acima acontecem dois SELECTS em duas tabelas e duas repetições WHILE. Ao tentar adicionar um TERCEIRO SELECT e consequentemente um terceiro WHILE, o código apresenta o seguinte erro:

 

Warning: mysqli_fetch_object() expects parameter 1 to be mysqli_result, boolean given in C:\wamp\www\terreiro\valida.php on line 48

 

Linha 48: 

while($orix = mysqli_fetch_object($procura_orix)) {

 

O código ficou da seguinte forma com as tres repetições:

<?php   $busca = $_POST["busca"];      $procura  = "+" . $busca;$procura_textos = mysqli_query($conecta, "SELECT * FROM textos WHERE MATCH(texto) AGAINST('" . $busca . "' IN BOOLEAN MODE)");   $procura_pontos = mysqli_query($conecta, "SELECT * FROM pontos WHERE MATCH(texto) AGAINST('" . $busca . "' IN BOOLEAN MODE)");$procura_orix = mysqli_query($conecta, "SELECT * FROM orixas WHERE MATCH(texto) AGAINST('" . $busca . "' IN BOOLEAN MODE)");      while($textos = mysqli_fetch_object($procura_textos)) {echo '<div id="verifica"><div id="titulo-pontos">'.$textos->titulo.'</div>';echo '<div id="ponto-pontos">'.$textos->texto.'</div>' . "</div>";echo '<div id="clear">'.'</div>';}   while($pontos = mysqli_fetch_object($procura_pontos)) {echo '<div id="verifica"><div id="titulo-pontos">'.$pontos->titulo.'</div>';echo '<div id="play-pontos"><audio controls="controls"><p>Seu nevegador não suporta o elemento audio.</p><source src="'.$pontos->play.'" type="audio/mp3" /></audio></div>';echo '<div id="download-pontos"><a href="'.$pontos-> download.'" target="_blank">DOWNLOAD</a></div>';echo '<div id="ponto-pontos"><pre>'.$pontos->texto.'</pre></div></div>';};while($orix = mysqli_fetch_object($procura_orix)) {echo '<div id="verifica"><div id="titulo-pontos">'.$orix->titulo.'</div>';echo '<div id="ponto-pontos">'.$textos->orix.'</div>' . "</div>";echo '<div id="clear">'.'</div>';}?>   

Conto com sua ajuda,

Desde já, obrigado, mais uma vez!

Link para o comentário
Compartilhar em outros sites

  • Moderador

@thiagosvl

 

Sinceramente, não é por aí que deveria ter ido a coisa.  eu só sugeri os dois whiles  para entenderes o processo de consulta e exibição em tela.

Então, tipo  eu não sei como resolver isso... não ainda pelo menos rsrsrsrs

 

Eu nunca passei por isso.. por não precisar..  pois isso que estas tentando fazer na unha é o mesmo que CMS faz.... sistema de gerenciamento de conteúdo.,.. por exemplo  worpress, joomla, drupal  dentre outros... 

 

Eu sei que é só para fins de estudo.. mas seria a mesma coisa que você pegar uma pedra gigante, escupir uma roda.  estaria reinventando.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!