Por que mysql_* em PHP é um mal: análise completa com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

História de um erro: por que mysql_* é coisa do passado

\n\n

Imagine: você está escrevendo um site em PHP, conectando-se a um banco de dados MySQL e usando a função familiar da faculdade mysql_query(). Tudo funciona, o site está no ar, os usuários estão satisfeitos. Mas um dia você percebe um aviso estranho nos logs: «Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future». Isso não é apenas uma reclamação do interpretador — é uma bandeira vermelha que não pode ser ignorada.

\n\n

No Stack Overflow, a pergunta «Why shouldn't I use mysql_* functions in PHP?» acumulou milhares de visualizações e centenas de comentários. E isso não é por acaso. Neste artigo, vamos entender por que as funções mysql_* (mysql_connect, mysql_query, mysql_fetch_array e outras) se tornaram o inimigo número um dos desenvolvedores PHP, mostrar com exemplos reais de código como substituí-las e fornecer um plano de migração passo a passo.

\n\n

O que são mysql_* e por que foram removidas?

\n\n

A extensão mysql_* (MySQL original) surgiu no PHP 2.0 em 1997. Era simples e intuitiva: chamava mysql_connect(), executava a consulta com mysql_query(), obtinha o resultado. Mas essa simplicidade tinha um lado sombrio.

\n\n

A partir do PHP 5.5.0, todas as funções mysql_* foram marcadas como obsoletas (deprecated) e, no PHP 7.0, foram completamente removidas. Se você tentar usar mysql_connect() no PHP 7+, receberá um erro fatal: Call to undefined function mysql_connect(). O motivo não é um capricho dos desenvolvedores do PHP, mas sim problemas fundamentais de segurança e arquitetura.

\n\n

Três principais razões para abandonar mysql_*

\n\n
    \n
  • Injeções SQL sem proteção — as funções não suportam consultas preparadas (prepared statements), tornando a sanitização manual obrigatória, mas frequentemente esquecida.
  • \n
  • Arquitetura obsoleta — não há suporte para estilo orientado a objetos, procedimentos armazenados, múltiplas consultas e transações.
  • \n
  • Falta de evolução — a extensão não foi atualizada por anos, enquanto o MySQL mudava (por exemplo, novos tipos de dados, codificações, mecanismos de autenticação).
  • \n
\n\n

Exemplo prático: como mysql_* destrói seu site

\n\n

Vamos ver um código clássico que ainda aparece em livros antigos e fóruns:

\n\n
<?php\n// CÓDIGO OBSOLETO - NÃO USAR!\n$link = mysql_connect('localhost', 'root', 'password');\nmysql_select_db('users_db', $link);\n\n$user_input = $_GET['username']; // usuário insere: ' OR 1=1 --\n$query = "SELECT * FROM users WHERE username = '$user_input'";\n$result = mysql_query($query, $link);\n\nwhile ($row = mysql_fetch_assoc($result)) {\n    echo "Olá, " . $row['username'] . "<br>";\n}\n?>
\n\n

Qual é o problema? Se um invasor passar no parâmetro username o valor ' OR 1=1 --, a consulta se torna:

\n\n
SELECT * FROM users WHERE username = '' OR 1=1 --
\n\n

O hífen duplo -- comenta o restante da consulta, e a condição 1=1 é sempre verdadeira. Como resultado, você obtém todos os usuários do banco de dados, incluindo senhas, e-mails e outras informações confidenciais. Isso não é teoria — é uma vulnerabilidade real que quebra milhares de sites todos os dias.

\n\n

Claro, você pode usar mysql_real_escape_string(), mas:

\n
    \n
  • Os desenvolvedores frequentemente esquecem de chamá-la.
  • \n
  • Ela não protege contra todos os tipos de ataque (por exemplo, ataques usando codificações).
  • \n
  • O código fica confuso e difícil de ler.
  • \n
\n\n

O que usar no lugar de mysql_*: duas abordagens modernas

\n\n

No PHP moderno, existem duas extensões dignas para trabalhar com MySQL: mysqli (MySQL Improved) e PDO (PHP Data Objects). Ambas suportam

Blogs

Book Recommendations