Arquivo do mês: novembro 2009

SQL Dicas & Truques (parte 1)

Todo programador sempre é obrigado a trabalhar com mais de uma linguagem, precisa entender pelo menos HTML, JavaScript e sua linguagem escolhida, além da sintaxe SQL para acesso à banco de dados.

Nos meus primeiros anos de programação SQL, sempre gastava horas pesquisando sintaxe pelas páginas de resultado do Google e alguns comandos exóticos nunca ficavam fixados em mente, visto que eram utilizados com freqüência muito baixa. Pensando nisso, certo dia criei um arquivo vazio e comecei a anotar as queries menos comuns e não menos úteis e hoje resolvi compartilhar este pedaço do meu diário de programador aqui.

Criação de usuários

GRANT ALL PRIVILEGES ON meuBD.* TO joao@localhost
    IDENTIFIED BY 'ola' WITH GRANT OPTION;
FLUSH PRIVILEGES;

Descrição: atribui todos os privilégios à todas as tabelas do banco de dadosmeuBD ao usuário joao, a partir da máquina localhost, cuja senha é ola. O comando FLUSH PRIVILEGES atualiza as novas alterações no daemon do MySQL. Caso o usuário joao não existe, um novo usuário será criado.

Funções de data e hora

SELECT * FROM table WHERE MONTH(data)='05';

Descrição: seleciona todos os registros da tabela table onde o campo data possui a data no mês de Maio:

Criamos o arquivo index.php

SELECT DISTINCT DAYOFMONTH(data),MONTH(data),YEAR(data);

Descrição: seleciona o dia do mês, mês e ano sem repetir da tabela table.

SELECT DATE_FORMAT(campoData,'%d-%m-%Y') FROM table;

Descrição: formata o campoData no seguinte formato: dd/mm/yyyy. Maiores detalhes sobre a funções DATE_FORMAT podem ser encontradas através da URL: http://www.mysql.com/doc/en/Date_and_time_functions.html.

Importando e exportando arquivos

LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
    FIELDS TERMINATED BY ',' ENCLOSED BY '"'
    LINES TERMINATED BY '\n';

Descrição: carrega os registros em formato txt do arquivo data.txt para a tabela tbl_name, onde os campos estão separados por ‘,’ (vírgula), delimitados por ‘”‘ (aspas) e as linhas delimitadas por ‘\n’ (quebra de linha).

SELECT * INTO OUTFILE 'saida.txt' FROM table;

Descrição: seleciona todos os registros da tabela table e os grava no arquivo saida.txt.

Transferindo registros de uma tabela para outra

INSERT INTO table1 (nome) SELECT nome FROM table2;

Descrição: insere todos os nomes da tabela table2 na tabela table1.

Continue acompanhando este artigo, aos poucos vou adicionando mais dicas e truques SQL.


SQL Dicas & Truques (parte 2)

Introdução

Independente da linguagem de programação que você escolhe para desenvolver seus projetos, uma sintaxe se torna onipresente em qualquer sistema que usa acesso à banco de dados, trata-se da linguagem SQL (Structured Query Language), que é usada para se comunicar com o banco de dados.

A SQL é uma linguagem padrão de acesso à banco de dados, porém dependendo do SGBD (Sistema de Gerenciamento de Banco de Dados) escolhido, podem existir pequenas variações entre seus comandos. Por exemplo, o MySQL é rico em funções de formatação de data, coisa que não é verdadeira quando se fala em PostgreSQL. Alguns SGBDs possuem recursos que outros não tem, como suporte a transações, sub-queries, etc.

Para quem ainda não está acostumado com o jargão técnico adotado pelos administradores de banco de dados, um SGBD é o sistema responsável por gerenciar a forma como os dados/registros são armazenados de forma física no disco rígido de seu computador e a forma como esses dados são recuperados. O Linux é muito rico em diversidade de SGBDs, vou citar somente os que considero os três principais na categoria, perdoem-me por omitir os demais:

O objetivo deste artigo é apresentar alguns truques de SQL baseados no MySQL, que é sem dúvidas o SGBD de maior sucesso quando se trata da combinação de Linux e Internet.

Este artigo é indicado para quem já possui alguma experiência com SQL

Otimizando suas consultas SQL

Um dos recursos mais poderosos na otimização de consultas SQL é a criação de índices em suas tabelas. No MySQL, por padrão a consulta às tabelas é feita de modo seqüencial e isso pode prejudicar e muito o desempenho de seu banco de dados quando o mesmo começa a tomar proporções grotescas e volume muito alto de acessos. Para entendermos a diferença entre uma consulta seqüencial e indexada, vamos a um exemplo prático.

Suponha que temos uma tabela chamada alfabeto e que desejamos encontrar a letra “P”. Podemos então construir a seguinte consulta SQL:

  mysql> SELECT letra FROM alfabeto WHERE letra='P';

Para encontrar a letra “P” de forma seqüencial, o MySQL percorrerá a seguinte lógica:.

  Posicione o cursor no primeiro registro da tabela:
  1> A  (A é igual a P? Não, próximo)
  2> B  (B é igual a P? Não, próximo)
  3> C  (C é igual a P? Não, próximo)
  ...
  16> P  (P é igual a P? Sim, retorne o resultado;

Levamos um total de 16 acessos aos registros da tabela para encontrarmos o valor desejado.

Agora vamos criar um índice para essa tabela sabendo que a coluna letra, do tipo CHAR(1), é a que nos servirá para encontrar dados:

mysql> CREATE INDEX ind_letra ON alfabeto (letra(1));

No comando acima criamos um índice chamado ind_letra na tabela alfabeto. Este índice está baseado na coluna letra e tem o tamanho de 1 caractere. Agora que temos o índice, vamos usá-lo em nossa consulta ao banco de dados.

mysql> SELECT letra FROM alfabeto USE INDEX (ind_letra) WHERE letra='P';

Note que apenas adicionamos a sintaxe USE INDEX (nome_do_índice) à consulta. Dessa forma, eis o caminho lógico que o MySQL percorrerá para encontrar a letra desejada:

  Posicione o cursor no primeiro índice da tabela (que é a letra do meio   do alfabeto):

  1> M (M é igual a P? Não, é menor. Então vamos ao próximo índice)
  Agora sobraram as letras maiores que M. Qual é o ponto médio entre M e Z?
  2> S (S é igual a P? Não, é maior. Então vamos ao próximo índice)
  Agora sobraram as letras menores que S e maiores que M. Qual é o ponto médio entre M e S?
  3> P (P é igual a P? Sim, retorne o resultado)

Pasmem, usando a lógica de índices o MySQL levou 3 acessos para encontrar a letra P. Gostaram da idéia? Que tal implementar índices em suas tabelas?

Para saber mais sobre índices, leia o capítulo do Manual do MySQL que fala sobre isso:

Formatando resultados

Quanto maior o domínio que você adquire da sintaxe SQL, menor serão os seus problemas na criação de seu programa, seja ele na linguagem que for. Por exemplo, vamos supor tenho uma tabela chamada dicas com uma coluna texto que possui 250 caracteres, mas desejo que seja retornado apenas os primeiros 50 dígitos. Para isso temos a função SUBSTRING(str, pos, len):

  mysql> SELECT SUBSTRING(texto, 1, 50) FROM dicas;

Acho que com isso você não precisa mais descobrir qual é a função para extração de substrings em sua linguagem de programação né? E além disso, seu código-fonte fica mais curto e legível.

Outras funções interessantes são a de transformar todo o texto em letras maiúsculas ou minúsculas. São elas: UPPER(str) e LOWER(str) respectivamente:

  mysql> SELECT UPPER(texto) FROM dicas;
  mysql> SELECT LOWER(texto) FROM dicas;

Conclusão

A linguagem SQL é muito rica em recursos e seu amplo domínio resulta em melhoria de performance nas consultas ao banco de dados, além de uma melhoria considerável na qualidade do código-fonte de seus projetos.

A leitura de um bom manual SQL é fundamental para quem tem pretensões de se dar bem nesta área e o que recomendo é o próprio manual do MySQL, que na maioria do tempo mostra uma sintaxe SQL que irá funcionar em todos os outros SGBDs:

http://www.mysql.com/doc/en/index.html


Compreender $_POST e $_GET no PHP

Provavelmente se pensa fazer um website em php irá certamente precisar de utilizar $_POST e $_GET, pois necessitará de transportar variáveis de pagina em pagina.

Então vou dar uma breve explicação de como funcionam estes dois métodos de transporte de variáveis.
Começaremos com o $_POST:

Num website muitas vezes temos formulários, seja para registo de membros, sistema de login, contactos, etc. Para guardar os campos preenchidos pelos HTML. Neste exemplo prático veremos como funciona:

Criação de formulário de registo de utilizador:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>Tutorial $_POST BOTTURN.COM</title>
  6. </head>
  7. <body>
  8. <table cellpadding="0" cellspacing="0" border="0">
  9. <tr>
  10. <td>
  11. <form action="teste.php" method="post" enctype="multipart/form-data">
  12. <table cellpadding="0" cellspacing="0" border="0">
  13. <tr>
  14. <td>Nome:</td>
  15. <td><input type="text" name="nome" id="nome" /></td>
  16. </tr>
  17. <tr>
  18. <td>Email:</td>
  19. <td><input type="text" name="email" id="email" /></td>
  20. </tr>
  21. <tr>
  22. <td>Descrição:</td>
  23. <td><textarea name="descricao" id="descricao" cols="45" rows="5"></textarea></td>
  24. </tr>
  25. <tr>
  26. <td><input type="submit" value="Enviar" /></td>
  27. </tr>
  28. </table>
  29. </form>
  30. </td>
  31. </tr>
  32. </table>
  33. <br />
  34. <?PHP
  35. if ($_POST) {
  36. echo ("Nome: ".$_POST['nome']."<br>");
  37. echo ("Email: ".$_POST['email']."<br>");
  38. echo ("Descrição: ".$_POST['descricao']."<br>");
  39. }
  40. ?>
  41. </body>
  42. </html>

O método $_GET é usado para receber variáveis através do URL (Link que insere no browser), certamente já viu em alguns sites um link desta forma www.exemplo.com/index.php?x=1 .
Então começaremos por explicar a sintaxe:

exemplo.php?
O ponto de ? é a forma de declarar que a seguir são variáveis.

exemplo.php?x=1
Após o ? podemos começar a declarar as variáveis. neste exemplo estamos a definir a variável x com o valor 1.

exemplo.php?x=1&y=2
Podemos declarar mais que uma variável, para isso basta colocar & ente as variáveis.

Agora veremos um exemplo, que irá escrever na pagina a variável recebida através de $_GET.

  1. <?PHP
  2. $variavel = $_GET["x"];
  3. if ($variavel) {
  4. echo "A variavel X contem ".$variavel;
  5. }else {
  6. echo "Não passou nenhuma variável através de $_GET"
  7. }
  8. ?>
  9. // Faça download do ficheiro e teste com a seguinte for exemploGet.php?x=Valor

E pronto este tutorial está terminado, aprendemos que o $_POST serve para transportar variaveis através de formulários e o $_GET através do URL.

www.revistaphp.com.br


Exportar dados do mysql dinamicamente com PHP

Olá pessoal,

Comentei no próprio artigo para facilitar o entendimento.

PHP
  1. <?php
  2. $host = “”;#CONFIGURE SEU HOST AQUI
  3. $user = “”;#USUARIO DO BANCO DE DADOS
  4. $pass = “”;#SENHA DO BANCO DE DADOS
  5. $db = “”;#BASE QUE OS DADOS SERAO EXPORTADOS
  6. $arquivoSQL = “BasedeDados.txt”;#ARQUIVO TXT NO QUAL VOCE QUER GUARDAR OS INSERTS, PODE SER .SQL TAMBÉM
  7. #SE O ARQUIVO NAO EXISTIR ELE SERÁ CRIADO.
  8. $clausulaSQL = DumpSQL($host, $user, $pass, $db);#AQUI EU CHAMO A FUNÇAO DumpSQL, QUE GUARDA NA VARIAVEL
  9. #$clausulaSQL OS DADOS NA FORMA DE INSERT INTO.
  10. escreveNoTXT($clausulaSQL, $arquivoSQL);#ESCREVE NO ARQUIVO BasedeDados.txt O VALOR DA VARIAVEL $clausulaSQL.
  11. function escreveNoTXT($consultasSQL, $arquivoSQL){
  12. //ARQUIVO TXT
  13. $arquivo = $arquivoSQL;
  14. //TENTA ABRIR O ARQUIVO TXT
  15. if (!$abrir = fopen($arquivo,”w”)){
  16. $retorno = “ERRO AO ABRIR”;
  17. }else{
  18. $retorno = true;
  19. }
  20. //ESCREVE NO ARQUIVO TXT
  21. if (!fwrite($abrir,$consultasSQL)){
  22. $retorno = “ERRO AO ESCREVER”;
  23. }else{
  24. $retorno = true;
  25. }
  26. //FECHA O ARQUIVO
  27. fclose($abrir);
  28. return $retorno;
  29. }
  30. function DumpSQL($host, $user, $pass, $db){
  31. mysql_connect( $host,$user, $pass) or die(mysql_error( ));
  32. #mysql_list_tables PEGA TODAS AS TABELAS DA BASE DE DADOS
  33. $res = mysql_list_tables($db) or die(mysql_error());
  34. while($row = mysql_fetch_row($res)){
  35. $table = $row[0]; #CADA TABELA DA BASE DE DADOS
  36. $res3 = mysql_query(“SELECT * FROM $table”);
  37. while($r=mysql_fetch_row( $res3)){ #AQUI OCORRE A EXTRAÇAO DOS DADOS DA TABELA
  38. $sql=”INSERT INTO $table VALUES (‘”;
  39. $sql .= implode(“‘,’”,$r);
  40. $sql .= “‘);\n”;
  41. $back.=$sql;
  42. }
  43. }
  44. $data = date(“d/m/Y”);
  45. $back .= “\n\n–Backup feito em $data”;
  46. return $back;
  47. }
  48. ?>
www.revistaphp.com.br

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.