Ir para conteúdo

POWERED BY:

Arquivado

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

arnaldo.dc

[Resolvido] Filtrar resultado de pesquisa MYSQL sem ir ao banco n

Recommended Posts

Pessoal gostaria de saber se tem como filtrar o resultado de uma pesquisa em em banco de dados MYSQL, sem pesquisar no banco novamente.`

É mais ou menos assim:

Tenho uma tabela Clientes, nela tenho os campos id,cliente,fone,...

o que eu pretendo fazer é montar uma pagina de pesquisa (pesquisa.php, aonde assim que eu entro ela me dá no topo um campo para refinar a pesquisa que assim que eu for teclando ela vai enchugando o resultado ai eu usaria LIKE '%".$pesquisa."%'.

 

na parte de baixo eu teria uma Div com os resultados em uma tabela.

esta tabela seria carregada assim que a pagina fosse carregada com todos os dados da tabela do banco de dados.

 

O que eu não queria era que a cada clique fosse feita uma consulta no banco para refinar o resultado eu queria pegar os dados da primeira pesquisa e ai sim refinar ( no lado do cliente e não do servidor ).

 

Tem como fazer isso....

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi ao certo... Mas você quer que a página não carregue quando filtrar a pesquisa ? seu caso não seria resolvido com AJAX ?

 

Isso a pagina não é recarregada a cada clique no campo da pesquisa, ela será atualizada apenas na div através do AJAX, mas a duvida é saber se dá para (refazer) a pesquisa com o novo caracter no resultado da pesquisa inicial, sem ter que ir buscar os dados do Banco de Dados, ou seja sem fazer query no MYSQL.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nâo... se eu entendi bem, você quer fazer uma pesquina inicial... isso vai retornar o resultado X , você quer filtrar já desse resultado X que pode ser armazenado, e mostrar o resultado disso. Entendi certo ?

 

Mas qual o problema de consultar mais uma vez?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mesmo com Ajax, teria que realizar novamente a consulta no banco de dados.

 

Será que não existe uma forma de fazer isso sem ter que voltar a pesquisar no Banco? A minha inteção é agilizar a pesquisa pois a tabela tem muitos dados (cadastros).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nâo... se eu entendi bem, você quer fazer uma pesquina inicial... isso vai retornar o resultado X , você quer filtrar já desse resultado X que pode ser armazenado, e mostrar o resultado disso. Entendi certo ?

 

Mas qual o problema de consultar mais uma vez?

 

Pense em uma tabela com estado e cidade, cada vez que você seleciona um estado diferente ela recarrega a lista das cidades daquele estado, existe uma demora nesse processo dependendo da velocidade de conecção, então se eu carregar a busca inicial junto com a pagina de inicio o carregamento da pagina vai demorar mas apartir dai as consultas subsequentes acredito que serão bem mais rápidas se eu pesquisar no resultado que eu já tenho e não no BD novamenete.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, na minha opnião acho que você consegue fazer isso com POG... Mas acho que não vai adiantar de muita coisa, acho que o melhor a fazer é otimizar a query antes de fazer a pesquisa no BD... ;]

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que você pode fazer é, como o Tomb Raider disse, otimizar a query. Como fazer isto? Definindo os índices de acordo com a necessidade e trabalhando com o cachê do banco de dados. Creio que esta é a melhor solução para você. Se tiver dúvidas em como realizar estas tarefas, posso mover seu tópico para o fórum de MySQL e lá você poderá ser melhor ajudado.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Matias não vejo a necessidade de mover o tópico, pois já fiz a otimização da pesquisa e do banco de dados.

Ela ajuda bastante, mas como disse em conecções mais lentas demora para recarregar a div. Mas pela discução percebi que não tem mesmo como fazer o que eu queria.

 

Obrigado a todos pela colaboração

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sempre tem, mas não sei se vai ser mais rápido. Você pode criar um XML com o resultado da primeira consulta ao banco de dados e fazer as outras pesquisas nele.

 

Veja, não sei se vai resolver (acho que não), mas em todo caso, é uma solução.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

De qualquer forma, se for ler do XML, você fará outra requisição ao servidor.. e não sei se vai ser 'muito mais rápido', doque ir no banco...

 

Para funcionar do jeito que você pensou, teria que fazer a busca no lado cliente como você mesmo citou, e com php isso não é possível.

Então você teria que ler o documento com Javascript e recriar com base no que foi procurado.

 

Vai dar um bom trabalho, talvez com ER você consiga..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Grava o resultado em arrays, e na próxima vez, é só buscar dentro das arrays e recriá-la com o novo resultado, ou criar outra array para não perder a anterior.

 

Abs

Anderson

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pense em uma tabela com estado e cidade, cada vez que você seleciona um estado diferente ela recarrega a lista das cidades daquele estado, existe uma demora nesse processo dependendo da velocidade de conecção, então se eu carregar a busca inicial junto com a pagina de inicio o carregamento da pagina vai demorar mas apartir dai as consultas subsequentes acredito que serão bem mais rápidas se eu pesquisar no resultado que eu já tenho e não no BD novamenete.

 

Arnaldo,

 

Imagina o seguinte:

 

1. Seu usuário seleciona em um combo um estado

----1. É enviado uma requisição ao servidor com aquele estado

----2. É retornado uma lista de cidades para a requisição

2. Seu usuário seleciona outro estado

----1. É enviado uma nova requisição ao servidor com o novo estado

----2. É retornado uma lista de cidades para a requisição

3. Seu usuário seleciona novamente o primeiro estado

----1. O sistema percebe que a requisição é exatamente a mesma

----2. O navegador usa o cachê da primeira requisição

 

Esse processo é rápido porque seu usuário recebe apenas o que solicitou.

 

Outra situação:

 

1. Seu usuário seleciona em um combo um estado

----1. Você verifica em uma variável no seu Javascript se já recebeu a lista de cidades e estados.

--------1. Se não recebeu, envia a solicitação ao servidor com o estado.

--------2. É retornado uma lista gigante com todas as cidades de todos os estados (se a conexão for lenta, coitado do usuário)

--------3. Se você já tiver a lista com todas as cidades e estados, você faz a consulta diretamente na variável.

 

Na primeira situação você tem uma requisição para cada estado, porém, o retorno é relativamente pequeno e mesmo em uma conexão lenta o resultado virá. Você pode ainda no primeiro caso ajudar o navegador a decidir quando deve ou não fazer uma nova requisição.

 

Para aumentar a performance na primeira situação você pode fazer um controle de cachê:

 

Cachê por tempo:

date_default_timezone_set( 'America/Sao_Paulo' );

$sid = session_id();
$time = time();
$expires = 10; //Tempo em segundos que o resultado expirará

if ( empty( $sid ) ) session_start();

header( 'Date: ' . date( 'D, d M Y H:i:s P T' , $time ) );

if ( !isset( $_SESSION[ 'cache-control' ] ) || ( ( $_SESSION[ 'cache-control' ] + $expires ) < $time ) ){
$_SESSION[ 'cache-control' ] = $time;

header( 'Last-Modified: ' . date( 'D, d M Y H:i:s P T' , $time ) );
header( 'Expires: ' . date( 'D, d M Y H:i:s P T' , $time + $expires ) );

echo $time; //Esse resultado irá mudar apenas no intervalo em segundos definido em $expires
} else{
header( sprintf( '%s 304 Not Modified' , $_SERVER[ 'SERVER_PROTOCOL' ] ) );
}

 

O problema do cachê por tempo é que, mesmo que o usuário envie uma requisição diferente (um outro estado por exemplo) o resultado será exatamente o mesmo. Para resolver isso, você pode fazer um cachê por tempo e pela requisição:

 

Cachê de requisição com tempo:

date_default_timezone_set( 'America/Sao_Paulo' );

$sid = session_id();
$time = time();
$expires = 10;
$request = md5( $_SERVER[ 'REQUEST_URI' ] );

if ( empty( $sid ) ) session_start();
if ( !isset( $_SESSION[ 'cache-control' ] ) ) $_SESSION[ 'cache-control' ] = array();

$cacheControl = & $_SESSION[ 'cache-control' ];

header( 'Date: ' . date( 'D, d M Y H:i:s P T' , $time ) );

if ( !isset( $cacheControl[ $request ] ) || ( ( $cacheControl[ $request ] + $expires ) < $time ) ){
$_SESSION[ 'cache-control' ][ $request ] = $time;

header( 'Last-Modified: ' . date( 'D, d M Y H:i:s P T' , $time ) );
header( 'Expires: ' . date( 'D, d M Y H:i:s P T' , $time + $expires ) );

/**
 * Esse resultado irá mudar apenas no intervalo em segundos definido em $expires ou
 * se a requisição for diferente
 */
echo $time;
} else{
header( sprintf( '%s 304 Not Modified' , $_SERVER[ 'SERVER_PROTOCOL' ] ) );
}

 

Veja também:

memcached.org

book.memcached

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.