Como criar tabelas temporárias no MySQL

O uso de uma tabela temporária no MySQL, permite realizar testes ou serviços em uma entidade transitória, sem se preocupar em limpar a sujeira depois.
Ao desconectar-se do servidor, as tabelas temporárias são automaticamente descartadas.
Captur de tela - mysql create temporary table

Quando é útil usar tabelas temporárias no MySQL

Algumas operações requerem que a existência de algumas informações seja curta — e que elas sejam removidas, quando não mais forem necessárias.
A parte da remoção pode ser feita automaticamente pelo MySQL.
Você não precisa se lembrar de apagar uma tabela, que não tem mais serventia, com o comando DROP TABLE.
Para isto, basta criar uma tabela, com a opção TEMPORARY, assim: CREATE TABLE TEMPORARY Nome_da_tabela.
Este assunto foi abordado en passant no artigo Como criar tabelas no MySQL. Vamos procurar nos aprofundar um pouco mais neste assunto, aqui.

Como criar tabelas temporárias no MySQL

Você pode criar tabelas temporárias, mais ou menos, da mesma forma que cria as normais. Só que vai acrescentar a opção TEMPORARY.
Se eu quiser criar uma tabela temporária com o nome de ClientesCidadesTemp a partir da tabela ClientesCidades, uso o seguinte comando:

CREATE TEMPORARY TABLE ClientesCidadesTemp SELECT * FROM ClientesCidades;
Query OK, 200 rows affected (0.27 sec)
Records: 200  Duplicates: 0  Warnings: 0

Use o comando EXPLAIN para verificar a nova tabela temporária:

EXPLAIN ClientesCidadesTemp;
+---------------+-----------------------+------+-----+---------+-------+
| Field         | Type                  | Null | Key | Default | Extra |
+---------------+-----------------------+------+-----+---------+-------+
| id            | mediumint(8) unsigned | NO   |     | 0       |       |
| NomeCliente   | varchar(255)          | YES  |     | NULL    |       |
| IdadeCliente  | mediumint(9)          | YES  |     | NULL    |       |
| CidadeCliente | varchar(255)          | YES  |     | NULL    |       |
| CredCliente   | mediumint(9)          | YES  |     | NULL    |       |
+---------------+-----------------------+------+-----+---------+-------+
5 rows in set (0.03 sec)

Entenda melhor as tabelas temporárias

Se há vantagens em usar tabelas temporárias, por outro lado, há algumas características às quais você precisa estar atento:

  • Se você quiser reusar uma tabela temporária, dentro da mesma sessão, vai precisar removê-la, antes. Tentar criar uma segunda tabela com o mesmo nome da primeira, temporária, vai resultar em erro, caso ela não tenha sido apagada.
  • Uma das propriedades das tabelas temporárias permite que possam ser criadas com o mesmo nome de uma outra tabela permanente e preexistente.
    Neste caso, a tabela permanente fica “escondida”, durante a sessão ou enquanto a temporária ainda existir.
    Isto pode ser útil para criar e testar queries, usando o nome de uma tabela existente, sem afetá-la.
  • Algumas APIs, suportam conexões persistentes em um ambiente web. O seu uso previne que as tabelas temporárias expirem, como já é de esperar, ao fim do script — e possam continuar a ser usadas por outros scripts.
  • O MySQL é um ambiente de servidor de banco de dados com capacidade para atender a múltiplos clientes, cada qual com sua sessão.
    Desta forma, é possível que cada cliente tenha aberto uma tabela temporária. E nada impede que elas tenham os mesmos nomes — cada qual na sua sessão.
  • Há vários outros cuidados a serem tomados, quando estamos lidando com um ambiente de tabelas temporárias.
    Se o seu script cria e modifica tabelas temporárias que “escondem” tabelas permanentes com o mesmo nome, é necessário criar rotinas que verifiquem e testem se você ainda está trabalhando na tabela temporária, como esperado.
    Se um dos programas cliente fizer uma reconexão, após uma queda, você poderá alterar uma tabela permanente, em vez de uma temporária.

Referências:
Leia mais sobre como fazer conexões (persistentes) a um servidor MySQL a partir de um script PHP.

Qual a importância da linha de comando ou console para web designers?

A linha de comando, ou console, é onde se pode fornecer uma sequência de comandos, para executar um aplicativo ou vários, realizar uma tarefa ou uma sequência de tarefas etc.
Amparados por parâmetros, opções e cláusulas os comandos, dados no console ou no terminal, têm uma enorme (quase infinita) flexibilidade.
Command line tools for web design cover picture

Administradores de sistemas, desenvolvedores, hackers, autores etc. já descobriram o “poder divinal” que um terminal oferece a quem se dispõe a aprender a dominá-lo.

Mas, enfim… qual a utilidade ou a importância desta ferramenta a um web designer?
Se por um lado, a interface gráfica tem um grande apelo visual e facilidade de uso, ela também prejudica a flexibilidade e a agilidade — nenhum designer de interface “enche a tela” de botões para realizar uma determinada tarefa de n maneiras diferentes.
Além disto, a interface gráfica é comumente lenta em computadores mais antigos — o que implica na demora para iniciar a execução de alguma atividade.
O terminal permite determinar exatamente como se deseja que uma tarefa (ou uma sequência de tarefas) seja executada e ela começa a partir do momento em que você dá Enter.

Não abro mão da flexibilidade e da agilidade que só o terminal proporciona. É uma ferramenta que eleva exponencialmente o meu nível de controle sobre o sistema.

Terminal do Linux, do Windows ou do MacOS?

Se você ainda não usa o GNU/Linux, no seu trabalho, insisto: você deveria começar a considerar seriamente esta opção profissional — que te pode possibilitar trabalhar com softwares 100% legalizados a custos muito baixos ou gratuitos.
O terminal do Windows também oferece uma razoável dose de flexibilidade. O sistema, contudo, foi desenhado para que se usassem apenas as opções da interface gráfica. O processo de “castração” do terminal DOS, começou a partir do Windows 3.0 (Maio/1990) e tem se fortalecido até os dias de hoje.
A Microsoft tem se esforçados para esconder o terminal do usuário, como se fosse um parente indesejável.
O MacOS foi construído sobre a plataforma Unix FreeBSD e tem um terminal poderoso. A cultura dos usuários, incentivados pelo departamento de marketing da Apple constitui uma forte barreira para seu uso. Mas ele está lá. 😉
Usuários do MacOS X podem usar o Homebrew para instalar as ferramentas que não são parte do pacote de aplicativos padrão.
O Linux, como estes outros sistemas operacionais, também veio do ambiente em caracteres e evoluiu para o uso predominante da interface gráfica.
O Linux, contudo, convive muito bem com o uso do terminal. Todas as grandes distribuições oferecem facilidades de acesso ao console.
Embora haja ferramentas visuais sofisticadas para instalar softwares, muitos usuários Linux se sentem muito à vontade para instalar seus aplicativos com as ferramentas de linha de comando, como o apt-get — sendo que, na maioria das vezes, lhes basta copiar e colar a instrução de um site no seu terminal, podendo fazer as mudanças que achar pertinentes, se for o caso.
Encontre mais artigos sobre o uso do apt-get, na caixa de busca deste site.

O que há na linha de comando para profissionais do web design?

Há muito que um webdesigner já faz, usando a interface gráfica, que pode ser feito na linha de comando.
Eu sou um evangelista do uso do software livre e do uso de comandos no terminal — mas eu entendo, veja bem, que você deva usar sempre o que lhe oferecer os melhores resultados.
Tudo o que este artigo pede é que você abra os olhos para o terminal do seu sistema e veja (com generosidade e sem preconceitos) se há lá alguma coisa que lhe possa ser útil. Só isso.
Veja alguns pontos que Cadmin’s blog elenca como favoráveis ao uso do terminal:

  • O uso de pacotes de softwares de terceiros se torna invisível — Webdesigners usam vários pacotes de terceiros, tais como o Bootstrap, jQuery, Normalize.css etc.
    A gestão de pacotes, contudo, é muito morosa, quando feita manualmente.
    Com o uso do terminal, é possível inserir os pacotes requeridos pelo seu projeto com alguns comandos: bower install jquery, bower update jquery
  • Para quem não sabe, o Bower é um gestor de pacotes, semelhante ao apt-get ou o PIP.

  • No terminal, compilar é muito mais rápido — HTML, CSS e JavaScript são 3 linguagens sempre presentes em projetos de design web, entre outras. As ferramentas da linha de comando tornam a produção e entrega de código mais eficiente nestas linguagens.
    Eventualmente, compilar pré-processadores, é muito mais rápido na linha de comando.
  • Ferramentas de teste de sites — Há várias ferramentas de teste da rede e da eficiência de seu website ou do provedor em que ele se encontra hospedado, que podem ser invocadas do terminal — não somente as opções de execução, mas também as informações fornecidas, são extremamente flexíveis e maleáveis.

Uma vez iniciado o uso da linha de comando, você adquire o costume e um mundo novo de possibilidades surge, ao alcance de seus dedos.

Referências

Site oficial do Bower: bower.io
How important is command line for web designers — http://auckland.fortuneinnovations.com/how-important-command-line-web-designers
Command line tools for frontend developers — http://seesparkbox.com/foundry/command_line_tools_for_frontend_developers

Como usar expressões com variáveis para calcular os valores da cláusula LIMIT no MySQL

A possibilidade de paginar ou seccionar os resultados de suas queries ou consultas MySQL, tornam a cláusula LIMIT uma das mais requisitadas por desenvolvedores.
logo PHP mesclado ao logo MySQL
Enquanto outras cláusulas são usadas para filtrar a exibição de resultados, LIMIT é usado para inibir o envio de resultados do servidor — motivo pelo qual ele ajuda a poupar o fluxo de informações inúteis a trafegar pela rede.
Se você quiser entender melhor o uso da cláusula LIMIT e das variáveis no MySQL, sugiro usar o quadro de pesquisa, no topo desta página, para encontrar outros posts sobre estes assuntos — vale a pena!

Como criar expressões usando a cláusula LIMIT do MySQL

O MySQL só vai aceitar inteiros literais em expressões — a menos que você envie suas consultas de dentro de um script. Neste caso, você tem mais flexibilidade para elaborar suas expressões e inserir os valores resultantes nas strings das consultas.
Se vocẽ tentar incluir uma expressão matemática, direto na linha de comando do seu cliente MySQL, vai obter um erro:

SELECT * FROM ClientesCidades LIMIT 2+2;

Isto, simplesmente, não é permitido — e vai provavelmente retornar um erro como o reproduzido abaixo:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '+2' at line 1

O uso de variáveis, também não é permitido, deste jeito:

SELECT * FROM profile LIMIT @pula_contagem, @exibir_contagem;

A expressão precisa ser criada, primeiro. Depois, seu resultado, pode ser inserido em uma query.
Mesmo de dentro do PHP, isto não é aceito:

$str = "SELECT * FROM ClientesCidades LIMIT $a + $b";

Para evitar o problema, tente elaborar a expressão primeiro:

$c = $a + $b;
$str = "SELECT * FROM ClientesCidades LIMIT $c";

Uma outra abordagem possível (também de dentro do PHP), seria esta:

$str = "SELECT * FROM ClientesCidades LIMIT ".($a + $b);

Fique atento para as aspas e para os parênteses.

Como incluir caracteres especiais e valores NULL nas consultas MySQL

Usar aspas simples ou duplas, bem como outros caracteres especiais, em queries MySQL pode trazer alguma dor de cabeça para iniciantes.
Neste texto, vou procurar jogar alguma luz sobre este assunto e ajudar a resolvê-lo de forma definitiva.
Se achar interessante, inclua esta página nos seus favoritos, para futuras consultas — uma vez que o problema não é dos que incomodam com tanta frequência.
Capa do tutorial PHP - a função include e require

O problema dos caracteres especiais nas queries MySQL

Nos vários exemplos, usados nos artigos deste site, tenho evitado, quando possível, as “saias justas” com caracteres especiais.
Veja a seguinte query INSERT:

INSERT INTO perfil (nome,data_nasc,cor,comida,quantidade)
VALUES('Alvarez','1973-10-12','azul','panelada',3);

A query, acima, funciona bem e há pouca possibilidade de alguém ter problemas com as suas aspas.
Contudo, se mudarmos o valor da coluna nome para “Mont’Alverne”, o problema aparece. Veja:

INSERT INTO perfil (nome,data_nasc,cor,comida,quantidade)
VALUES('Mont'Alverne','1973-10-12','azul','panelada',3);

Note que o plugin de reconhecimento de sintaxe tem dificuldade para interpretar o valor entre as aspas simples.


O interpretador “pensa” que a segunda aspa está lá para fechar a primeira. Mas trata-se apenas de um apóstrofo — o suficiente para invalidar toda esta query.
Para evitar a confusão, há duas abordagens básicas possíveis.
Na primeira, você precede a aspa adicional com outra:

INSERT INTO perfil (nome,data_nasc,cor,comida,quantidade)
VALUES('Mont''Alverne','1973-10-12','azul','panelada',3);

Na segunda, use uma barra invertida ou backslash:

INSERT INTO perfil (nome,data_nasc,cor,comida,quantidade)
VALUES('Mont\'Alverne','1973-10-12','azul','panelada',3);

Note a diferença entre estes 2 resultados e o primeiro.


Uma outra alternativa, é usar as tradicionais aspas duplas em torno do valor Mont'Alverne. Isto também funciona:

INSERT INTO perfil (nome,data_nasc,cor,comida,quantidade)
VALUES("Mont'Alverne",'1973-10-12','azul','panelada',3);

Como lidar com valores NULL no MySQL

Se você tiver intenção de armazenar dados binários, tais como imagens ou audio, tem que ter em mente que estes valores contém todo tipo de caracteres especiais (e problemáticos), além de nulls (bytes de valor zero).
Embora o valor SQL null não seja um caractere especial, requer tratamento diferenciado.
No SQL, NULL indica “sem valor” ou “valor nulo”.
Em outros artigos, neste site, os valores NULL também têm sido evitados. Hoje, vamos encarar o problema e mostrar algumas formas de lidar com ele.
Por exemplo, se você não souber a cor preferida do Senhor Mont’Alverne, não pode preencher o valor com NULL, assim:

INSERT INTO perfil (nome,data_nasc,cor,comida,quantidade)
VALUES('Mont\'Alverne','1973-10-12','NULL','panelada',3);

O valor NULL dispensa as aspas. O correto é como se vê abaixo:

INSERT INTO perfil (nome,data_nasc,cor,comida,quantidade)
VALUES('Mont\'Alverne','1973-10-12',NULL,'panelada',3);

Como tratar os caracteres especiais dentro dentro de um script PHP

Cartoon - how sql injection work
Clique para ampliar.

Os problemas, acima, podem ser resolvidos com muita naturalidade, diretamente, por que as queries foram digitadas dentro do cliente MySQL — onde você mesmo está fornecendo os dados e pode corrigir e controlar as entradas.

A necessidade de lidar apropriadamente com os caracteres especiais é especialmente importante no ambiente da web, para o qual as queries são feitas com formulários input (form input).
Você precisa estar pronto para lidar com qualquer tipo de entrada de dados feita pelo usuário, de maneira geral.
Não é incomum, usuários maliciosos digitarem informações contendo caracteres problemáticos, com o objetivo deliberado de tentar burlar o seu
sistema
.

Se você estiver usando uma variável nome para receber aquele valor, em um script, não pode ter qualquer controle sobre o que o usuário do sistema vai te fornecer.
Neste caso, é preciso criar mecanismos para prever as diversas possibilidades de entradas e manipulá-las adequadamente.
No PHP, a função addslashes(), pode ser usada para tratar as entradas e torná-las seguras para ser inseridas em suas consultas MySQL.
Adicionalmente, a função unset() pode ser usada para forçar uma variável a não ter valor algum.

A função addslashes() retorna uma string com barras invertidas antes de caracteres que precisam ser escapados. Estes caracteres são aspas simples (‘), aspas duplas (“), barra invertida (\) e o byte NULL. manual do PHP.

Desta forma, o resultado de addslashes ("Mont'Alverne"), será Mont\'Alverne — que será recebido e gravado no banco de dados;
Se você precisar exibir este valor, sem o slash (a barra invertida), pode usar a função contrária: stripslashes() — com a mesma sintaxe.

Referências:

Manual do PHP: A função addslashes().

Como criar sua própria biblioteca PHP

No PHP é possível construir e usar as próprias bibliotecas de funções e arquivos mais comumente usados. Esta prática ajuda significativamente na produtividade de um desenvolvedor.
Não demora muito para um programador iniciante perceber que, à medida em que avança em um projeto de software, muito do que está fazendo é repetitivo — conectar ao banco de dados, fornecer feedback do sistema aos usuários etc.
Capa do tutorial PHP - a função include e require
Neste texto, vou mostrar como tirar código referente a tarefas repetitivas em arquivos de bibliotecas, para ser compartilhado entre os vários módulos de um ou vários sistemas.
O encapsulamento ou modularização não é uma dica. Trata-se mais de uma técnica de programação que vale a pena incorporar ao seu dia a dia, o quanto antes.
A principal vantagem desta técnica é não precisar repetir código a cada novo programa que você criar.
Escreva uma vez, use várias.
Uma das funções mais usadas é a da conexão. Se um sistema precisa, em diversos momentos, se conectar a um banco de dados, basta escrever a rotina de conexão (com todas as informações de que ela precisa) uma vez só, dentro de uma função. A partir daí, toda vez que alguma parte do seu sistema precisar fazer uma conexão, usa o código que já está pronto.
É preciso pensar nisto o tempo todo, enquanto se está projetando um sistema ou, mesmo, digitando o código — como escrever o mínimo possível de código e reaproveitar o máximo.
Há outras vantagens em se adotar esta metodologia:

  • Portabilidade facilitada — Você pode iniciar novos projetos, com as bibliotecas de funções que você sabe que foram exaustivamente testadas e que funcionam. Elas podem ser levadas a outro computador, pode ser disponibilizadas a outros desenvolvedores na rede etc.
    Se você tem uma função que conecta a algum banco de dados, ela pode ser usada em outro sistema, com outro banco de dados. Para isto, basta alterar os parâmetros com que a função é chamada. A função, em si, permanece sempre a mesma.
  • Manutenção facilitada — Se, nesta mesma função, houver algum erro, basta corrigi-lo uma vez. Não há necessidade de corrigir o erro em cada módulo de programa que faz alguma conexão.

Se você tem interesse em aprender mais sobre metodologia de programação, sugiro ler sobre o MVC. Ao usar a caixa de busca, no topo do site, é possível também encontrar vários outros artigos sobre programação.

Como chamar funções e arquivos externos no PHP

Neste texto, vou me concentrar em mostrar como aplicar a metodologia de modularizar seus scripts em PHP. É simples e os exemplos podem ser adaptados a outras linguagens.
A linguagem PHP, provê a declaração include que permite incluir código de um arquivo externo, em seu script, incorporando-o.
Este mecanismo torna a inclusão de bibliotecas mais natural.
Assim, você pode pôr várias pequenas funções importantes em um arquivo arquivo.php (ele pode ter qualquer outro nome ou extensão) e chamá-lo de qualquer script que possa vir a precisar das informações que lá estiverem contidas.
Basta incluir, em seu código PHP, o seguinte:

include "arquivo.php";

Todas as funções e variáveis que estiverem definidas e declaradas dentro do arquivo arquivo.php, passam a poder ser usadas no script que o incluiu.
O conteúdo dos arquivos include PHP deve seguir as mesmas normas que qualquer outro arquivo PHP.

Alternativas a declaração include no PHP

Alternativamente e de acordo com suas necessidades, é possível usar outras formas de trazer informações externas.
Veja quais são:
A declaração require, que quer dizer requeira ou requisite, em uma tradução livre, faz a leitura do arquivo externo mesmo que o contexto da execução não passe por onde ele se encontra dentro do código. Em outras palavras, ele carrega obrigatoriamente o código externo.
Exemplo:

require "functions.php";

Outra possibilidade é que o código externo já tenha sido lido e carregado, por alguma rotina no seu sistema e ele encontrar outro require ou include para carregar novamente o mesmo arquivo.
Para evitar que isto ocorra, use as variações include_once e require_once.
Estas duas verificam se o código externo já foi incluído ou requerido anteriormente — evitando, assim, redundâncias.

Referências: Wikipedia: encapsulamento ou modularização.