Erros Comuns em PHP que Você Deve Evitar: Guia Completo

Erros Comuns em PHP que Você Deve Evitar: Guia Completo

“`html





Erros comuns em PHP que você deve evitar


Boas práticas em PHP

Erros comuns em PHP que você deve evitar

Se você quer código mais estável, seguro e fácil de manter, evite os deslizes que aparecem em projetos reais:
produção quebrando, dados inconsistentes e falhas difíceis de rastrear.

1 Validar e tipar: pare de confiar no “vai dar certo”

Um dos maiores geradores de bug em PHP é a suposição de que os dados sempre vêm no formato esperado.
Quando você mistura string, null, números vindos de query string e payloads malformados,
o resultado aparece tarde: comportamento inconsistente, warnings que viram falhas e dados corrompidos.

O que evitar

Comparações frouxas, casting silencioso e ausência de validação em bordas.

O que fazer

Valide entrada cedo, use tipos/assinaturas e rejeite dados inválidos.

  • Não use comparações frouxas quando o tipo importa. Prefira === em vez de ==.
  • Evite operar com null sem intenção. Se for obrigatório, trate antes (retorne erro HTTP/validação).
  • Defina limites: tamanhos de strings, faixas numéricas e formatos (CPF, e-mail, datas).
  • Centralize a validação por regra de negócio, não “no meio” do código.
Regra prática: se a entrada entra no seu sistema, ela precisa ser validada antes de virar regra de negócio.

2 SQL e templates: proteja contra injeção e escape incorreto

Em PHP, os erros mais caros de corrigir geralmente envolvem banco e saída de conteúdo.
SQL injection acontece quando você monta queries manualmente com dados do usuário.
Já o XSS aparece quando você renderiza conteúdo sem escape apropriado.

  • Use prepared statements com parâmetros. Não concatene valores dentro do SQL.
  • Valide e normalize antes de armazenar. Mesmo com prepared statements, formatos inválidos viram dados ruins.
  • Escape na saída (especialmente em HTML). Não confunda “sanitizar” com “escapar”.
  • Controle o contexto: escape para HTML, atributo, URL e JavaScript não são equivalentes.
Se você precisa montar SQL dinâmico, monte estrutura (colunas/ordens permitidas) com whitelist —
e mantenha os valores sempre como parâmetros.

3 Tratamento de erros e exceções: falhar do jeito certo

Erros silenciosos e “catch genérico” criam um sistema que parece funcionar… até a primeira situação real.
Em produção, você quer saber: o que aconteceu, onde aconteceu e como responder.
Também quer evitar vazar detalhes sensíveis em mensagens.

  • Não sufoque exceções sem logar e sem retorno adequado.
  • Evite catch (Exception $e) como solução para tudo. Trate por contexto (validação, banco, rede).
  • Retorne mensagens consistentes para o cliente e detalhes no log interno.
  • Use códigos HTTP ou modelos de erro claros (ex.: “400 validação”, “409 conflito”, “500 inesperado”).
  • Não dependa de die() / var_dump() em runtime.

Além disso, configure erros para desenvolver e para produção de forma diferente: em dev, você precisa enxergar.
Em produção, você precisa proteger e registrar.

4 Performance e concorrência: o “funciona” não é suficiente

PHP pode ser rápido quando o código está bem dimensionado. O problema é quando pequenos deslizes viram gargalos:
queries N+1, cálculos repetidos, conexões abertas sem necessidade e lógica pesada no request.

  • Evite N+1: quando você busca uma lista e depois busca itens um a um, o número de queries explode.
  • Não recalcule o que já existe: cache de curto prazo (quando aplicável) e cálculo único por request.
  • Cuide de índices no banco para filtros e ordenações frequentes.
  • Conexões e transações: mantenha consistência sem abrir e fechar em excesso.
  • Defina limites para paginação e ordenação. Nunca traga tudo de uma vez sem necessidade.
Orientação prática: se uma rota começa a ficar lenta, investigue banco e chamadas externas antes de “otimizar PHP”.

Exemplo SQL seguro + validação básica antes de consultar

Abaixo vai um padrão simples: valide entrada, use prepared statements e trate exceções com mensagens
consistentes. É o tipo de base que evita várias categorias de erro comuns no dia a dia.

<?php
declare(strict_types=1);

function getUserByEmail(PDO $pdo, string $email): array
{
    // Validação simples (exemplo). Ajuste conforme sua regra de negócio.
    $email = trim($email);
    if ($email === '' || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
        throw new InvalidArgumentException('E-mail inválido.');
    }

    try {
        $stmt = $pdo->prepare(
            'SELECT id, name, email FROM users WHERE email = :email LIMIT 1'
        );
        $stmt->execute([':email' => $email]);

        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        return $row ?? [];
    } catch (PDOException $e) {
        // Registre $e em log interno (não mostre detalhes ao usuário)
        throw new RuntimeException('Erro ao consultar usuário.');
    }
}

Quer melhorar ainda mais o seu PHP?

Recomendo que você continue com outros posts no yurideveloper.com:
mais padrões práticos, exemplos e decisões que fazem diferença em produção.


Ver posts relacionados

Dica: quando terminar uma mudança, revise se você tratou validação, segurança (SQL/escape) e erros com mensagens consistentes.



“`