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.