PHP: A extensão MySQL é obsoleta

Dezembro 2016

PHP é uma excelente linguagem de programação para os servidores da web, mas ela não é muito boa para armazenar dados de maneira estruturada sozinha. Desta maneira, ela precisa de extensões para conectar e usar SGBD (sistemas de gerenciamento de banco de dados), incluindo o famoso MySQL. Este é um Banco de dados que tem uma boa reputação, cujo desenvolvimento é ativo e a utilização popular, particularmente em instalações [W/L/M] AMP.


No entanto, historicamente, o seu uso via PHP é feito através da extensão MySQL (funções
mysql_*
) do PHP, que é obsoleta! Entretanto, o banco de dados em si, não é obsoleto.

Vamos ter que ter muita paciência, pois é um pouco demorado... Se você não quiser ler esta dica, retenha somente isto: abandone as funções
mysql_*
e opte pelo mysql i ou PDO.

Obsoleto desde o PHP 5.5

O PHP 5.5.0 foi lançado oficialmente no dia 20 de junho de 2013 (veja PHP 2013 com os comentários de lançamento). Nesta versão, ficou confirmado que a extensão MySQL seria obsoleta.

Várias razões foram publicadas quanto a esta decisão. Vamos falar delas nesta dica.

Saiba que, em futuras versões de PHP, esta extensão não estará mais disponível no pacote binário PHP para a sua plataforma. Também foi decidido que até o PHP 6, a extensão terá desaparecido e, muito provavelmente, será removida do código-fonte do PHP, e a versão 6 será proposta em breve...aliás, ela já deveria ter sido lançada, mas foi adiada.

Então, quem diz obsoleto, diz que “existe uma boa razão para não usá-lo mais”. Para nunca se esquecer disso, use as funções
 mysql_*
que acionam um aviso (e não um erro)
 E_DEPRECATED
no seu código padrão do software PHP 5.5 ou superior.

Um projeto ruim

Mais de 15 anos de história

A extensão MySQL foi introduzida no PHP 2.0, antes de 1998, ano de lançamento do PHP 3. As técnicas com mais de 15 anos podem não ser eficazes hoje, especialmente na área de TI, pois elas evoluem muito rapidamente. O que explica o por quê dessa extensão ser relativamente lenta se comparada com as outras disponíveis, e também explica a ausência de vários recursos importantes (citados abaixo).

As conexões para os bancos de dados: a mais recente é a padrão

Se as funções
mysql_*
não forem especificadas, elas consideram que o banco de dados no qual devem atuar é aquele cuja conexão é a mais recente. Isto é problemático em dois casos:
Quando gerenciamos vários bancos de dados ao mesmo tempo e esquecemos alguma coisa, e a sua consulta SQL começa mal.
Para rastrear os bugs, ou seja, nenhuma variável descreve explicitamente a conexão, por isso, é impossível saber com precisão de onde vem o problema, a extensão só vai reclamar disso, nada mais. Impossível recuar até a criação da conexão através de um IDE/Debugger PHP. Você deverá encontrar o
mysql_connect
manualmente e adicionar um código de desbloqueio para descobrir o que aconteceu.

Como gerenciar erros

O PHP 5 forneceu um modelo vindo diretamente da programação orientada a objetos, as exceções. A extensão MySQL é muito antiga e nunca foi atualizada para que ela possa usá-las. Assim, a gestão de erros é realizada através de um apelo ao mysql_error(). A grande desvantagem desta técnica é que, na maioria dos casos, se quisermos interceptar um erro é preciso colocar o final do código de gestão de erro depois de cada função
mysql_*
!

As exceções permitem interromper a execução de um bloco de código e ir diretamente para a gestão de erros, o que simplifica o código, não somente para o programador, mas também para o PHP. As exceções constituem um sistema passivo, desencadeado apenas quando as funções utilizadas indicam um erro. Com o outro método, verifica-se sempre se tudo correu bem, e, na maioria das vezes, tudo dá certo, ou seja, muito trabalho para nada.

Projetado para o MySQL 3,23

Os usuários com um pouco mais de conhecimento sobre o MySQL ficarão decepcionados por não poderem se beneficiar de algumas das funções lançadas depois da versão 3.23, pois a extensão não foi atualizada com as novas funcionalidades. Sendo assim, observaremos a ausência de procedimentos SQL que podem ser bem práticos. De acordo com algumas pessoas, a extensão também teria dificuldade em gerar certos códigos de texto.

Como criptografar conexões

As conexões aos bancos de dados distantes podem ser protegidas pelo SSL (Secure Socket Layer), mas não pelo TLS (Transport Layer Security). Como mostraram acontecimentos recentes (na escrita, Heartbleed OpenSSL), o SSL é um protocolo que não deveria mais ser usado e substituído pelo TLS 1.1 ou superior, por diversas razões, que não serão descritas aqui. A extensão MySQL não suporta as conexões protegidas pelo TLS, e, consequentemente, força todo mundo a aceitar um protocolo de segurança que também deveria ser considerado como obsoleto.

Sem consultas preparadas

Este talvez seja o ponto mais importante desta dica, a extensão MySQL não tem consultas preparadas.

Por que isso é tão importante? As consultas SQL são frequentemente variáveis, dependendo da escolha do usuário. A solução mais simples e, infelizmente, a mais popular, se parece com isso:
mysql_query('UPDATE membros SET nome="'.$_GET['nome'].'" WHERE nome="'.$nome.'"');

Tudo bem, você colocou aspas em volta dos dados do usuário. Que pena, isso não é o suficiente: um usuário pode se tornar um administrador, ao acessar
changer-nome.php?nome=%22%20admin%3D1%20nome%3D%22USERNAME
. Um tutorial X ou Y te dirá para utilizar
mysql_real_escape_string
, que é eficaz mas, honestamente, grande e mal feito e, com o hábito de usá-lo, usamos duas vezes seguidas, ou nunca, em uma configuração.

As consultas preparadas oferecem uma solução elegante para tudo isso, isto é, você prepara a estrutura da sua consulta, depois a executa com as configurações desejadas (ex: POD)
$req = $pdo->prepare('UPDATE membros SET nome=:novonome WHERE nome=:nome');
$req->execute(array(
    "novonome" => $_GET['nome'],
    "nome" => $nome
));

Pronto, sem nunca se preocupar com a possibilidade de injetar SQL. O trabalho sujo será feito para você.

Um perigo para o futuro

Quando a extensão estiver terminando, a exclusão do PHP é iminente, e o seu site também, se ele a estiver usando. Atualmente, há toda uma outra "cultura" em torno da extensão, que é fadada a desaparecer, mas sem o saber. Muitos tutoriais e pessoas te dirão para continuar utilizando as funções
mysql_*
, ignorando tudo sobre a sua futura supressão, suas desvantagens e sobre esta dica que você está lendo. Você deve ter percebido que devemos acabar com esta ideia em torno da extensão MySQL. Mais fácil falar do que fazer...

É por isso que é absolutamente necessário converter seus scripts, sites ou CMS, se possível, para outro API com acesso aos bancos de dados. Quanto mais cedo a transcrição for feita, menos problemas você terá. Seu projeto talvez ainda não seja tão grande e a documentação da extensão continue acessível, como os tutoriais de conversão. Aproveite e faça isso antes que seja tarde demais.

Os problemas de design mencionados acima fazem da extensão MySQL algo difícil de converter. Mas, uma vez que o passo for dado, se for necessário migrar de um conector de banco de dados para outro, será muito mais simples. Todas as APIs modernas têm, mais ou menos, a mesma estrutura.

Fim de manutenção em breve

A falta de manutenção do código provoca um risco enorme, ou seja, as falhas de segurança encontradas nunca mais serão corrigidas. Consequentemente, se isso acontecer, milhares de sites estarão correndo perigo. Cuidado para não ser um deles!

O que devemos usar

A resposta é simples, mas faça a sua escolha:

PDO

A interface é orientada a objeto apenas. Funciona em várias SGDB: MySQL, MSSQL, sqlite, etc.

Mysqli

A interface é orientada a objeto e modelo funcional, e são compatíveis entre eles. Grande semelhança com a extensão MySQL.
Foto: © Mysql.

Veja também :
Este documento, intitulado « PHP: A extensão MySQL é obsoleta »a partir de CCM (br.ccm.net) está disponibilizado sob a licença Creative Commons. Você pode copiar, modificar cópias desta página, nas condições estipuladas pela licença, como esta nota aparece claramente.