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.

Como verificar erros nas queries MySQL dentro de scripts PHP

Veja como adicionar código para verificar e apontar erros nas suas queries, dentro dos seus scripts PHP.
Até conseguir fazer um programa começar a funcionar direito, há um processo — por vezes, longo — de testes e depuração.
computador exibindo erro no mysql
Você pode testar as queries no MySQL e usá-las dentro do script apenas quando estiverem tendo o comportamento esperado, conforme mostrei aqui.
Adicionalmente, você pode antecipar os problemas, fazendo a verificação de erros durante a execução do script — o que facilita o seu trabalho.
É fácil incluir código de verificação de erros no PHP (bem como na maioria das outras linguagens de programação).
Neste post, vou usar parte do código de conexão/desconexão ao servidor MySQL, descrito neste artigo —. Portanto, se você ainda for iniciante e quiser entender melhor o seu funcionamento, dê uma olhadinha lá.
Os códigos de checagem vão ajudar você a descobrir onde estão os erros nos seus scripts e a corrigi-los.

Como lidar com erros nas queries MySQL, no PHP

No PHP, para obter informações mais específicas sobre operações relacionadas ao MySQL que fracassaram, use mysql_error() e mysql_errno():

  • mysql_errno() — retorna o código numérico do erro, de maneira que você possa consultar um manual para entender melhor o que houve.
  • mysql_error() — retorna uma descrição padrão do erro.

Ambas as funções podem receber um identificador (opcional), referente à conexão sobre a qual devem dar informações. Se você não quiser usar o identificador, elas irão retornar informações sobre a última conexão, como procedimento padrão.
Veja, em destaque, abaixo, um exemplo de uso:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Página de conexão ao banco de dados</title>
</head>

<body>
<?php # conecta.php - conecta ao servidor MySQL
echo "tentando uma conexão... <br />";
if (!($con = @mysql_connect ("localhost", "lobinho", "lupus43")))
    die("Não foi possível conectar: ".mysql_errno()." - ".mysql_error());
print ("Conexão bem sucedida <br />");
if (!@mysql_select_db ("tutorial", $con))
    die ("Não foi possível selecionar o banco de dados <br />");
mysql_close ($con);
print ("Conexão terminada <br />");
?>
</body>
</html>

No código, acima, usei um username e senha propositadamente incorretos (para obter um erro de conexão).
O resultado, no navegador é esse:

tentando uma conexão...
Não foi possível conectar: 1045 - Access denied for user 'lobinho'@'localhost' (using password: YES)

Após a minha mensagem “Não foi possível conectar”, a função mysql_errno() fornece o número do erro 1045 e a função mysql_error() fornece a descrição do erro “Acesso negado ao usuário lobinho… ”
Isto já é suficiente para eu saber onde meu erro se encontra e ir lá corrigir meu código.

mensagem de erro do MySQL - funções mysql_errno e mysql_error()
Clique, para ampliar.

O que vimos, neste post, é apenas um esboço do que pode ser feito com as funções de tratamento de erro PHP/MySQL. Use sempre estas funções para, entre outras coisas, informar os usuários com suas próprias mensagens customizadas sobre o que ocorreu ao acessar o banco de dados.

Como conectar ao MySQL de um script em PHP

A tarefa mais básica de scripts que fazem uso do servidor de bancos de dados é a conexão. Em seguida, vem a seleção do banco de dados, da tabela e as consultas (queries).
php and mysql logos
O exemplo de script PHP, usado neste texto, necessita que você tenha tanto o MySQL quanto o PHP instalados no seu sistema.
Se você não tem certeza de que este é o seu caso, pode usar as dicas no final do artigo Como instalar Linux, MySQL, Apache e PHP, para saber se tudo está ok.
Embora o PHP e o MySQL possam ser executados da linha de comando, este texto vai se voltar para a execução a partir de um servidor web.
Sinta-se à vontade para usar a caixa de busca, no canto superior direito deste site, sempre que quiser alguma informação adicional (neste momento, temos quase 500 tutoriais…) 😉

Como se conectar ao MySQL via PHP

Por ser uma atividade tão trivial, programadores mais ocupados criam bibliotecas de scripts que fazem a conexão — e chamam estes scripts de dentro de seus outros scripts.
É comum programadores experientes terem esquecido como realizar tarefas básicas como esta.
Se você é iniciante, não se esqueça de usar um editor de textos adequado a escrever códigos de programas, para evitar problemas na execução dos seus scripts.
Do lado de cá, vou criar um arquivo chamado conecta.php, dentro do qual vou inserir o código em PHP para fazer uma simples conexão ao banco de dados MySQL e, em seguida, desconectar.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Página de conexão ao banco de dados</title>
</head>
<body>
<!-- O script PHP começa abaixo -->

<?php
    conecta.php - script de conexão ao servidor MySQL
    if (!($con = @mysql_connect ("localhost", "justincase", "minhasenha")))
    {
        die ("Não foi possível conectar ao servidor. <br />");
    }
    print ("Conexão bem sucedida. <br />");
    if (!@mysql_select_db ("tutorial", $con))
    {
        die ("Não foi possível selecionar o banco de dados. <br />");
    }
    mysql_close ($con);
    print ("Conexão terminada. <br />");
?>

<!-- Fim do script PHP -->
</body>
</html>

A partir deste código, é possível construir o que você quiser.
A parte em HTML do código, logo no começo, serve apenas para localizar a página e permitir que as mensagens (em português) sejam exibidas com as palavras devidamente acentuadas — não fazem parte, portanto, do programa em si.

Entenda o código em PHP

  • if (!($con = @mysql_connect ("localhost", "justincase", "minhasenha"))) — esta parte tenta fazer uma conexão com a função mysql_connect(), usando os dados de nome do servidor, nome do usuário “justincase” e a senha “minhasenha”.
  • die ("Não foi possível conectar ao servidor.");
    — se nada der certo, o script será interrompido pela função die(), com a exibição da mensagem entre as aspas.
    Se a conexão se efetivar, o programa prossegue a próxima instrução e armazena as informações da conexão na variável $con.
  • print ("Conexão bem sucedida."); — exibe a mensagem entre aspas.
  • if (!@mysql_select_db ("tutorial", $con))
    — tenta selecionar o banco de dados “tutorial”, com as informações armazenadas na variável $con. Se isto não for possível, executa a instrução que segue:
  • die ("Não foi possível selecionar o banco de dados."); — finaliza o script e devolve a mensagem entre aspas.
  • mysql_close ($con); — se tudo correu bem, até aqui, o script irá fechar a conexão, baseado nas informações contidas em $con.
  • print ("Conexão terminada."); — exibe a frase entre aspas.

Captura de tela do komodo editor - código PHP para conectar ao banco de dados MySQL

Funções PHP para conectar ao MySQL

Neste artigo, usei a função mysql_connect(), para fazer a conexão ao banco de dados. Alternativamente, você pode usar a função mysql_pconnect() — para estabelecer uma conexão persistente.
Pode ser útil caso você queira deixar a conexão aberta para ser reutilizada por outros scripts subsequentes — evitando, assim, alguma sobrecarga ao servidor.
Iniciar conexões persistentes e deixá-las abertas (por esquecimento), pode acarretar, como consequência a negação de abertura de novas conexões por parte do servidor MySQL.
Portanto, seja organizado(a) neste ponto.