Conexão de tabelas temporárias com PHP + MySQL

Publicado por Ariel Galante Dalla Costa em 19/12/2011

[ Hits: 14.111 ]

Blog: http://arielgdc.wordpress.com

 


Conexão de tabelas temporárias com PHP + MySQL



Para os desenvolvedores, tabelas temporárias são uma "mão-na-roda" quando precisa-se manipular os mesmos dados e mesma consulta várias vezes, principalmente em relatórios.

Só que há um problema: quando utiliza-se uma conexão orientada a objeto, por exemplo no PHP, que finalize a conexão ao banco de dados, não há como executar várias consultas e retirar os dados.

Por exemplo: criando a tabela de usuários, vamos extrair os dados contidos nela.

Criando e inserindo dados no banco de dados

CREATE TABLE USUARIOS(    CODIGO INTEGER NOT NULL,    NOME VARCHAR(100) NOT NULL,    USUARIO VARCHAR(30) NOT NULL,    SENHA VARCHAR(128) NOT NULL ); INSERT INTO USUARIOS() VALUES(1,'ARIEL','arieldll','anstds1120'); INSERT INTO USUARIOS() VALUES(2,'ALBERTO','aalt','1103858awp'); INSERT INTO USUARIOS() VALUES(3,'THAIS','thbp','widhxx945j'); ---INÍCIO-DO-SQL-TEMPORARIO-PARA-RODAR-NO-BANCO--- DROP TABLE IF EXISTS TMP_TODOS_USUARIOS; CREATE TEMPORARY TABLE TMP_TODOS_USUARIOS AS(    SELECT       *    FROM       USUARIOS ); DROP TABLE IF EXISTS TMP_USUARIOS_2; CREATE TEMPORARY TABLE TMP_USUARIOS_2 AS(    SELECT       *    FROM       TODOS_USUARIOS    WHERE       USUARIO like '%a%'; ); DROP TABLE IF EXISTS TMP_USUARIOS_3; CREATE TEMPORARY TABLE TMP_USUARIOS_3 AS(    SELECT       *    FROM       TODOS_USUARIOS    WHERE       SENHA like '%1%'; ); SELECT    TMP_USUARIOS_3 UNION    TMP_USUARIOS_2; -----FIM-DO-SQL-TEMPORARIO-PARA-RODAR-NO-BANCO----


Função para enviar/separar/receber dados

Bom, caso tenta-se rodar este 'sql' em uma conexão que depois executa o 'mysql_close()', acabará por não manter a tabela temporária, pois ela será excluída automaticamente pelo banco quando a conexão cair.

Mas, para resolver este pequeno problema, desenvolvi uma função simples que ajudará:

<?php    $Con_local;    function Busca_separa_query($Query){       global $Con_local; //DEFINE A VARIÁVEL $Con_local como do escopo global       $Consultas=explode(";", $Query); //DIVIDE AS CONSULTAS (GERA UM VETOR) APARTIR DE ; (PONTO-E-VÍRGULA)       $Con_local=mysql_connect('Endereco_banco','usuario','senha'); //CONECTA AO BANCO DE DADOS       mysql_select_db('Nome_da_base_de_dados', $Con_local); //SELECIONA A BASE DE DADOS A SER UTILIZADA       for($Conta=1; $Conta<=count($Consultas); $Conta++){ //A FUNÇÃO count() CONTA QUANTAS POSIÇÕES EXISTE NO VETOR, ENTÃO, VOCÊ PODE RESOLVÊ-LA COM VÁRIAS OUTRAS FORMAS               $rs_l=mysql_query($Consul tas[$Conta-1], $Con_local); //EXECUTA A CONSULTA NO BANCO, RETORNANDO A ÚLTIMA CONSULTA EXECUTADA.       }       return $rs_l;    } ?>


Para utilizar a função, basta recebê-la em um variável, como por exemplo:

<?php    $resultado_usuarios=Busca_separa_query("DROP TABLE IF EXISTS TMP_TODOS_USUARIOS;                    CREATE TEMPORARY TABLE TMP_TODOS_USUARIOS AS(                       SELECT                          *                       FROM                          USUARIOS                    );                    DROP TABLE IF EXISTS TMP_USUARIOS_2;                    CREATE TEMPORARY TABLE TMP_USUARIOS_2 AS(                       SELECT                          *                       FROM                          TODOS_USUARIOS                       WHERE                          USUARIO like '%a%';                    );                    DROP TABLE IF EXISTS TMP_USUARIOS_3;                    CREATE TEMPORARY TABLE TMP_USUARIOS_3 AS(                       SELECT                          *                       FROM                          TODOS_USUARIOS                       WHERE                          SENHA like '%1%';                    );                    SELECT                       TMP_USUARIOS_3                    UNION                       TMP_USUARIOS_2;"); if(mysql_num_rows($resultado_usuarios)>0){       while($resultado=mysql_fetch_array($resultado_usuarios))){          echo 'Codigo: '.resultado["CODIGO"].'<br>';          echo 'Usuario: '.resultado["USUARIO"].'<br>';          echo 'Senha: '.resultado["SENHA"].'<br>';       }    }


Fechando a conexão e saindo

Agora, para fechar a conexão, basta simplesmente gerar outra conexão ou fechar manualmente cada vez.

<?php    mysql_close($Con_local); ?>


Ou:

<?php    function Fechar_temps(){       global $Con_local;       mysql_close($Con_local);    }    //E CHAMÁ-LA    Fechar_temps();    ?>


Para outras bases de dados, pode-se também implementar, como por exemplo no PostGRES.

Caso necessite, pode implementá-la de várias maneiras. Ou, se tiver outra sugestão, estarei feliz por compartilhar ela conosco.

Espero que isso ajude vários.

[]'s Ariel

Outras dicas deste autor

Exemplo de conexão ao banco de dados orientada a objeto em PHP+MySQL

Ubuntu e Fedora - Mudando o brilho da tela de notebooks Itautec w7635 e w7655

Leitura recomendada

Rápido contorno para o erro: null: caution: filename not matched

Instalação de servidor LTPS Terminal Server

Bloqueando redes da China/Coréia

Utilização do cron no Linux

Openfire autenticando com AD via browser

  

Comentários
[1] Comentário enviado por chroda em 26/12/2011 - 17:48h

Nunca apliquei tabela temporário, uso mysql e mongodb nos meus projetos, mas achei interessante, e vou estudar mais a fundo o caso, agradeço o compartilhamento.

[2] Comentário enviado por arieldll em 26/12/2011 - 17:53h

Tabelas temporarias sao muito interessantes para o desenvolvimendo de relatorios, por exemplo. Se voce precisa buscar duas vezes os mesmos dados, basta criar uma tabela temporaria e chama-los uma vez somente.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts