Introdução: Por que o PHP é tão traiçoeiro para iniciantes?
O PHP continua sendo uma das linguagens mais populares para desenvolvimento web, mas seu baixo nível de entrada frequentemente leva à formação de maus hábitos. Desenvolvedores iniciantes, inspirados pela simplicidade da sintaxe, muitas vezes esquecem da segurança, desempenho e padrões modernos. Neste artigo, vamos analisar os principais erros de desenvolvedores PHP iniciantes, que podem transformar seu código em um pesadelo de manutenção e uma vulnerabilidade para ataques.
Não vamos apenas listar os problemas — você verá exemplos de código em PHP com erros e suas versões corrigidas. Isso ajudará você a aplicar imediatamente as práticas corretas.
1. Ignorar a segurança: SQL injection e XSS
O erro mais crítico é confiar em dados do usuário. Iniciantes frequentemente inserem variáveis diretamente em consultas SQL ou as exibem na página sem filtragem.
Erro: Concatenação em consultas SQL
Exemplo clássico de vulnerabilidade:
// INCORRETO: vulnerável a SQL injection
$id = $_GET['id'];
$query = "SELECT * FROM users WHERE id = $id";
$result = mysqli_query($link, $query);
Um atacante pode passar ?id=1 OR 1=1 e obter todos os dados da tabela.
Solução: Consultas preparadas (PDO)
Use PDO ou mysqli com expressões preparadas:
// CORRETO: PDO com consulta preparada
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute(['id' => $_GET['id']]);
$result = $stmt->fetchAll();
Erro: Exibir dados sem escapamento (XSS)
Se você exibir dados do banco ou de $_GET diretamente, corre o risco de sofrer um ataque XSS:
// INCORRETO: vulnerável a XSS
echo "Olá, " . $_GET['name'];
Solução: htmlspecialchars
Sempre escape a saída:
// CORRETO: escapamento HTML
echo "Olá, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');
2. Uso de construções e funções obsoletas
Muitos tutoriais de 10 anos atrás ensinam a usar funções mysql_* ou tags curtas. Isso não é apenas inseguro, mas pode não funcionar em hospedagens modernas.
Erro: Funções mysql_*
// INCORRETO: extensão obsoleta
$link = mysql_connect('localhost', 'user', 'pass');
mysql_select_db('test', $link);
Esta extensão foi removida do PHP 7, e o código simplesmente falhará com um erro.
Solução: Migrar para PDO ou MySQLi
// CORRETO: PDO - abordagem moderna e segura
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
Erro: Tags curtas
// INCORRETO: pode estar desabilitado no php.ini
<? echo "Hello"; ?>
Solução: Apenas tags completas
// CORRETO: sempre use <?php
<?php echo "Hello"; ?>
3. Trabalho ruim com formulários e dados
Desenvolvedores iniciantes frequentemente esquecem de verificar se o formulário foi enviado e usam $_REQUEST em vez de arrays superglobais específicos.
Erro: Falta de verificação do método de envio
// INCORRETO: o código é executado mesmo em requisição GET
$name = $_POST['name'];
// ... processamento
Solução: Verificar REQUEST_METHOD
// CORRETO: verificar se o formulário foi enviado
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = $_POST['name'] ?? '';
// ... validação e processamento
}
Erro: Uso de $_REQUEST
O array superglobal $_REQUEST combina GET, PO