Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Criando sistema de busca interna e paginação (PHP/MySQL)

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    Tutorial Criando sistema de busca interna e paginação (PHP/MySQL)

    Uma coisa praticamente necessária a todos os websites dinâmicos é um sistema de busca.
    Muitos programadore preferem utilizar o Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar..., mas aqui vamos desenvolver nosso próprio campo de busca.
    Digamos que tenhamos uma tabela de nome "noticias" na base de dados. Nesta tabela, há as seguintes colunas:
    id - titulo - conteudo
    O nosso sistema irá procurar as notícias que "batem" com a consulta do usuário nas colunas "titulo" e "conteudo".
    Vamos começar pelo formulário de busca (busca.html):
    Código HTML:
    <html>
    <head>
    <title>Busca</title>
    </head>
    <body>
    <!-- Agora, vamos começar a criar nosso formulário.
     Ele terá ação sobre o arquivo busca.php e seu método será GET
     Isso significa que os valores dos campos serão enviados pela URL. -->
    <form action="busca.php" method="get">
    <!-- Aqui temos o campo de texto -->
    <input type="text" name="q">
    <!-- E o botão de envio -->
    <input type="submit" value="Buscar">
    </form>
    </body>
    </html>
    Tudo bem, nosso formulário está pronto. Agora, vamos desenvolver o sistema da busca em si. Você verá que é extremamnte fácil. Vamos iniciar a criar o arquivo busca.php:
    Código PHP:
    <?php
    // vamos pegar o valor campo do formulário chamado 'q', se houver sido preenchido
    // caso contrário, o script voltará à página anterior
    $busca = !is_null($_GET['q']) ? $_GET['q'] : die('<script> history.go(-1); </script>');
    // agora, vamos nos proteger de SQLi
    $busca mysql_real_escape_string($busca);
    // e também de XSS Reflected
    $busca htmlspecialchars($busca);
    // e pegar a página
    $page is_numeric($_GET['p']) ? $_GET['p']-0;

    // quantos resultados por página nós exibiremos?
    $qnt 10;

    // agora vamos fazer a conexão ao banco de dados
    mysql_connect('localhost''usuario''senha'); // configure corretamente
    // e selecionar a base de dados em que há a tabela 'noticias'
    mysql_select_db('gh_busca'); // configure com sua base de dados
    // tudo ok?
    Duas variáveis serão normalmente enviadas para esta página: 'q', contendo o conteúdo da pesquisa, e 'p', contendo a página. Caso 'p' não esteja declarado, este vai automaticamente equivaler à 0.
    Isto porque a contagem do PHP e do MySQL é como o C, e não como o Pascal. Em outras palavras, o primeiro ítem é sempre o 0 (zero).
    Com certeza você conhece o uso do asterisco ("*") nos terminais de linha de comando (como Bash ou MS-DOS). Vou refrescar sua memória:
    Digamos que você queira buscar um arquivo que você não sabe seu nome correto, mas sabe que ele possui "arta" no meio do nome. Você abre seu terminal e digita:
    Código:
    dir *arta*
    E ele retorna todos os arquivos que possuem "arta" no meio do nome, tais como "carta", "cartaz", "farta" etc.
    Com o SQL ocorre o mesmo, mas no lugar de usar asteriscos, você utiliza o sinal de porcentagem ("%"). Vamos continuar então?
    Código PHP:
    // vamos rodar nossa query, usando as variáveis $busca e $page anteriormente declaradas
    $qry mysql_query("SELECT id,titulo FROM noticias WHERE titulo LIKE '%$busca%' OR conteudo LIKE '%$busca%' LIMIT $page,$qnt"); 
    Agora, vamos ver um problema: nós não sabemos quantos resultados a busca terá. Como repetiremos o código de um resultado determinadas vezes, sem saber quantas vezes serão necessárias?
    Simples: criaremos um loop (parte de código que se repete determinadas vezes) que gravará os resultados da busca em uma variável, podendo utilizá-la posteriormente.
    Primeiramente, vamos ver se houveram resultados
    Código PHP:
    $quantidade mysql_num_rows($qry);
    if(
    $quantidade==0) { // se a quantidade for 0
      
    $content 'Não foram encontrados resultados!';
    } else { 
    // caso contrário,
      
    $content 'Resultados:<br>'
    Agora, trabalharemos em cima deste "else". Veja que interessante: se usarmos '=' para declarar uma variável, caso ela já possua um valor, este será apagado por completo. Para que possamos apenas adicionar o valor e agregá-lo ao antigo, sem substituí-lo, usamos um ponto final antes do sinal de igual, desta forma: '.='.
    Código PHP:
    while($row mysql_fetch_array($qry)) { // aqui iniciamos o loop
    $content .= '<a href="ler_noticia.php?id='.$row['id'].'">'.$row['titulo'].'</a><br>'."\n"// mostramos o link para a notícia

    A parte principal já passou. Agora vamos terminar a paginação, exibindo links para outras páginas:
    Código PHP:
    $p is_numeric($_GET["p"]) ? $_GET['p'] : null
    // caso a variável não esteja declarada, daremos a ela o valor "1"
     
    if(isset($p)) { $p $p; } else { $p 1; } 
     
    // Vamos calcular o início da seleção da seguinte maneira:
     // (página atual X quantidade por página) - quantidade por página
     
    $inicio = ($p*$qnt) - $qnt
     
    // Faz uma nova seleção no banco de dados, desta vez sem LIMIT, 
     // para pegarmos o núєmero total de resultados
    $sql_query_all mysql_query("SELECT * FROM noticias WHERE titulo LIKE '%$busca%' OR conteudo LIKE '%$busca%'"); 
    // Gera uma variável com o núєmero total de resultados
    $total_registros mysql_num_rows($sql_query_all); 
    // Gera outra variável, desta vez com o núєmero de páginas que temos.  
    // O comando ceil() arredonda 'para cima' o valor 
    $pags ceil($total_registros/$qnt);
     
    // Número máximos de links de paginação 
    $max_links 3
    // Exibe o primeiro link 'primeira pá', que não entra na contagem acima
     
    $content .= "<a href='busca.php?&q=".urlencode($busca)."&p=1'>&lt;</a> "
    // Cria um loop para exibir os 3 links antes da página atual
     
    for($i $p-$max_links$i <= $p-1$i++) {
     
    // Se o número da página for menor ou igual a zero, não as exibiremos 
    // (meio complicado ter a pagina zero ou páginas negativas)
    if(!($i <=0)) {
     
    $content .= "<a href='busca.php?q=".urlencode($busca)."p=$i'>".$i."</a> "


    // Exibe a página atual, sem link, e em negrito (para marcar)
    $content .= '<b>'.$p.'</b> '
    // Cria outro loop, desta vez para exibir 3 links após a página atual 
    for($i $p+1$i <= $p+$max_links$i++) { 
    // Verifica se a página atual é maior do que a última página. Se for, não faz nada. 
    if(!($i $pags)) { 
     
    $content .= "<a href='busca.php?q=".urlencode($busca)."p=".$i."'>".$i."</a> ";
     } 

    // Exibe o link para última página. Ele será mostrado assim: >> (&gt;&gt; em ASCII)
     
    $content .= "<a href='busca.php?q=".urlencode($busca)."p=".$pags."'>&gt;&gt;</a> ";
    }
    ?> 
    Para finalizar, vamos criar nossa página HTML (neste mesmo arquivo, logo abaixo da última linha do código anterior) e mostrar os resultados:
    Código HTML:
    <html>
    <head>
    <title>Busca</title>
    </head>
    <body>
    <h1>Buscando por <b><?=$busca?></h1>
    <p><?=$content?></p>
    </body>
    </html>
    Não é simples? O segredo é utilizar o LIKE.
    Até mais!
    Este material pode ser compartilhado, desde que os devidos créditos sejam dados.



    Notify-list · Twitter · Blog

    Nova lei: Invadir computadores protegidos é crime.
    Lógica: Se eu invadi, não é protegido. Logo, não é crime :-)
    Similar Threads

  • Font Size
    #2
    mto bom trabalho 0kal
    sigpicToda verdade passa por três estágios. Primeiramente, é ridicularizada. Em segundo lugar, é violentamente confrontada. Por último, torna-se aceita como evidência

    Comment


    • Font Size
      #3
      Muito bom, vou aplicar ao meu TCC. Obrigado!

      Comment


      • Font Size
        #4
        Cara estava procurando uma explicação para fazer esse script, obrigada pela ajuda.
        ----------------------------------------------------------------------------------------
        sigpic

        Comment

        X
        Working...
        X