Ir para conteúdo
Fórum Script Brasil
  • 0

Busca Avançada


igor Br22

Pergunta

Pessoal,

estou querendo fazer uma busca com filtro, onde o usuario tera 3 campos: data, assunto e palavra chave, podendo preencher 1,2 ou os 3 campos na busca.

eu fiz um algoritmo com uma seleção da condicao de consulta SQLs dentro IFs, estou tendo resultado, mas não consigo inserir o algoritmo de paginação nesses resultados, portanto, alguém faria as consultas de forma diferente? se esta corredo o algoritmo, como faço para incluir a paginação visto q a consulta SQL depende do parametro passado

<?php
// inicio seleção de IF para consulta SQL 
        // TODOS OS CAMPOS PREENCHIDOS
        if ( ($txt_palavras != "") and ($txt_data != "") and ($txt_chave != "")) {
            $npalavra = explode(" ", $txt_palavras);
            $totalPalavras = count($npalavra);  
            for($i = 0; $i < $totalPalavras; $i++)
            {  
                $complemento .= " AND (pd_conteudo LIKE '% " . $npalavra[$i] . " %' OR pd_nome LIKE '%" . $npalavra[$i] . "%' )";
            }
                $condicao = "WHERE pd_status = 1 $complemento and pd_data LIKE '%$txt_data%' and pd_keywords LIKE '%$txt_chave%' ORDER BY pd_data DESC  "; 
            }
         // ASSUNTO E DATA PREENCHIDO
        if ( ($txt_palavras != "") and ($txt_data != "") and ($txt_chave == "")) {
            $npalavra = explode(" ", $txt_palavras);
            $totalPalavras = count($npalavra);  
            for($i = 0; $i < $totalPalavras; $i++)
            {  
                $complemento .= " AND (pd_conteudo LIKE '% " . $npalavra[$i] . " %' OR pd_nome LIKE '%" . $npalavra[$i] . "%' )";
            }
            $condicao = " WHERE pd_status = 1 $complemento  and pd_data LIKE '%$txt_data%' ORDER BY pd_data DESC ";  }
         //ASSUNTO E CHAVE PREENCHIDOS
         if ( ($txt_palavras != "") and ($txt_chave != "") and ($txt_data == "")   ) {
            $npalavra = explode(" ", $txt_palavras);
            $totalPalavras = count($npalavra);  
            for($i = 0; $i < $totalPalavras; $i++)
            {  
                $complemento1 .= " AND (pd_conteudo LIKE '% " . $npalavra[$i] . "%' )";
            }
            $condicao = " WHERE pd_status = 1 $complemento1 and pd_keywords LIKE '%$txt_chave%' ORDER BY pd_data DESC ";               }
        // SOMENTE CHAVE PREENCHIDA     
         if (( $txt_chave != "") and ($txt_palavras == "") and ($txt_data =="") ) { 
            $npalavra = explode(" ", $txt_palavras);
            $totalPalavras = count($npalavra);  
            for($i = 0; $i < $totalPalavras; $i++)
            {  
                $complemento1 .= " AND  (pd_conteudo LIKE '% " . $npalavra[$i] . "%' )";
            }
            $condicao = " WHERE pd_status =1  $complemento1 and pd_keywords LIKE '%$txt_chave%' ORDER BY pd_data DESC "; }
        // CHAVE E DATA PREENCHIDA
        if (( $txt_chave != "") and ($txt_palavras == "") and ($txt_data != "")) { 
            $condicao = " WHERE pd_keywords LIKE '%$txt_chave%' AND pd_data LIKE '%$txt_data%' ORDER BY pd_data DESC "; }
        // SOMENTE ASSUNTO PREENCHIDO
        if (( $txt_palavras != "") and ($txt_chave == "") and ($txt_data == "") )  {
            $condicao = " WHERE pd_status = 1 $complemento ORDER BY pd_data DESC ";  }
        // SOMENTE DATA PREENCHIDA
        if (($txt_data != "") and ($txt_palavras == "") and ($txt_chave == ""))
        { 
            $condicao = " WHERE pd_data LIKE '%$txt_data%' ORDER BY pd_data DESC "; }
        // FIM SELEÇÃO DE IFS PARA CONSULTA SQL;
        // consulta real da SQL com a condição selecionada e variaveis de paginacao        
        $sql = "SELECT * FROM pg_detalhe $condicao LIMIT $primeiro_registro, $num_por_pagina";
        $qry = mysql_query($sql, $conn) or die(mysql_error());
        $linha = mysql_fetch_assoc($qry);
?>

Editado por igor Br22
Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

A consulta retorna os resultados corretos? O problema é somente na hora de imprimir o resultado na página ou na consulta?

Antes de executar a query, dê um echo($qry) e cole aqui no fórum para vermos como ela está...

Editado por Stoma
Link para o comentário
Compartilhar em outros sites

  • 0

SIM, os resultados sai ok na primeira pagina, o problema esta se eu for para 2° pagina onde não entro nos IFs

na busca usei condicoes SQL dentro de IFs(depedendo de qual parametro o usuario preencher), e gravei na variavel $condicao, daí a consulta geral seria SELECT * FROM tabela WHERE $condicao. até aí tudo bem funcionou direitinho, só que fiz a paginacao e quando vou para a 2° pagina, eu perco essa variavel $condicao, porque até então, não passou nenhum parametro do form para entrar no IF, tem ideia de como posso enviar essa MESMA $condicao como parametro para a consulta na segunda pagina??

RESUMINDO O CODIGO PARA OS LEITORES QUE AINDA não LERAM:

EXEMPLO DE CONSULTA DE UM PARAMETRO:

if (($txt_data != "") and ($txt_palavras == "") and ($txt_chave == ""))
        { 
            $condicao = " WHERE pd_data LIKE '%$txt_data%' ORDER BY pd_data DESC "; }
CONSULTA SQL:
$sql = "SELECT * FROM pg_detalhe $condicao LIMIT $primeiro_registro, $num_por_pagina ";
                $qry = mysql_query($sql, $conn) or die(mysql_error());
CONSULTA SQL AO PASSAR A SEGUNDA PAGINA:
SELECT * FROM pg_detalhe

Logo não é pego a variavel "$condicao" porque o script não entra no IF... preciso passar essa variavel, claro, que não seja pelo metodo GET.

Link para o comentário
Compartilhar em outros sites

  • 0

Ah, entendi!

Você pode passar valores através do link mesmo, como get. Ex:

<a href="teste.php?numero=2">Teste</a>

Assim, a página teste.php terá a variável $_GET['numero'] com valor 2. É só fazer o mesmo com a variável que você quer passar...

Mas o melhor nesse caso, seria você utilizar as cláusulas LIMIT e OFFSET do mysql, assim você pegaria somente as linhas que você quer listar para a próxima página. Um exemplo disto está neste tópico: http://scriptbrasil.com.br/forum/index.php...1&hl=offset

Abraços

Editado por Stoma
Link para o comentário
Compartilhar em outros sites

  • 0

ótimo post, mas ainda não é o que preciso. O problema todo é na complexidade da consulta SQL. repare que para exibir o resultado é necessario dados da variavel $condicao:

$sql = "SELECT * FROM pg_detalhe[b] $condicao [/b]LIMIT $primeiro_registro, $num_por_pagina ";
                $qry = mysql_query($sql, $conn) or die(mysql_error());
que por consequenca a variavel $condicao só é criada se entrar no comando IF, como tem no codigo do post acima. e para entrar no if é necessario os parametros enviados do formulario.... eu tentei colocar dentro do if a consulta completa sem cria variavel $condicao,assim:
if (($txt_data != "") and ( $txt_palavras == "") and ($txt_chave == "") )
        { 
           $sql = "SELECT * FROM pg_detalhe WHERE pd_data LIKE '%$txt_data%' ORDER BY pd_data DESC LIMIT $primeiro_registro, $num_por_pagina ";
        $qry = mysql_query($sql, $conn) or die(mysql_error());           "; }

Mas ainda sim, quando se passa para proxima pagina o script não entra no if para fazer a continuacao da consulta porque não tem parametro para entrar no if... ou seja, acho que preciso q alguma alma iluminada me ajude a arrumar uma melhor solucao para fazer o algoritmo dessa busca... rsrsrsr

Link para o comentário
Compartilhar em outros sites

  • 0

hehe

E se você verificar se os campos $txt_palavra, $txt_data e $txt_chave estão preenchidos e caso sim, você os passa por get no link? Geralmente é feito assim, pois são valores que não comprometem a segurança. Um exemplo disto é o google ^_^

Depois, quando for verificar se eles estão vazios, procure tanto no GET quanto no POST...

Editado por Stoma
Link para o comentário
Compartilhar em outros sites

  • 0

ahhhhhhhhhhh ta vendo!!! como duas cabeças pensa melhor que uma, bom achei uma solução. se é a melhor? não sei, em termos de segurança, ou em quando obter uma grande qtde de dados, mas ta funcionando rsrsrs fiz assim:

peguei as variaveis recebidas pelo post e coloque no link eheheheh como você disse valeu!!!

if (($_GET['d'] != "") or ($_GET['a'] != "") or ($_GET['c'] != ""))
{
    $txt_palavras = $_GET["a"];
    
    if ($_GET['d'] != "" )
    {
        $txt_data     = databr($_GET['a'],1);
    }
        $txt_chave     = $_GET["c"];

}else
{
    $txt_palavras = $_POST["txt_assunto"];
    
    if ($_POST['txt_data'] != "" )
    {
        $txt_data     = databr($_POST['txt_data'],1);
    }
        $txt_chave     = $_POST["txt_chave"];
    
}

Link para o comentário
Compartilhar em outros sites

  • 0

Hehe com certeza!

Quanto à segurança, creio que não há problema algum pois não são dados confidenciais, mas lembre-se de sempre filtrar todos os campos antes de inserir em uma consulta SQL. O único problema que poderia aparecer, é que se a quantidade de caracteres da url (endereço da página+variaveis do get) do link for muito grande (lê-se + que 1000 caracteres), alguns browser podem dar erros. Mas creio que não seja este o caso, já que você iria passar somente data, e algumas palavras, certo?

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

aproveitando o tópico, como incluo essa função no codigo para diferenciar acentos na busca?

function listaimagemRemoveAcentos($str, $enc = "UTF-8"){

$acentos = array(
'A' => '/&Agrave;|&Aacute;|&Acirc;|&Atilde;|&Auml;|&Aring;/',
'a' => '/&agrave;|&aacute;|&acirc;|&atilde;|&auml;|&aring;/',
'C' => '/&Ccedil;/',
'c' => '/&ccedil;/',
'E' => '/&Egrave;|&Eacute;|&Ecirc;|&Euml;/',
'e' => '/&egrave;|&eacute;|&ecirc;|&euml;/',
'I' => '/&Igrave;|&Iacute;|&Icirc;|&Iuml;/',
'i' => '/&igrave;|&iacute;|&icirc;|&iuml;/',
'N' => '/&Ntilde;/',
'n' => '/&ntilde;/',
'O' => '/&Ograve;|&Oacute;|&Ocirc;|&Otilde;|&Ouml;/',
'o' => '/&ograve;|&oacute;|&ocirc;|&otilde;|&ouml;/',
'U' => '/&Ugrave;|&Uacute;|&Ucirc;|&Uuml;/',
'u' => '/&ugrave;|&uacute;|&ucirc;|&uuml;/',
'Y' => '/&Yacute;/',
'y' => '/&yacute;|&yuml;/',
'a.' => '/&ordf;/',
'o.' => '/&ordm;/');

   return preg_replace($acentos,
                       array_keys($acentos),
                       htmlentities($str,ENT_NOQUOTES, $enc));
}

Editado por igor Br22
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...