Como Validar Datas com Segurança no PHP usando a Função checkdate()
O Perigo dos Dados Sujos em Sistemas Comerciais
Durante a sua carreira como Desenvolvedor Web Full-Stack, a validação de dados de entrada será uma constante em sua rotina. Quando desenvolvemos e-commerces, sistemas bancários, motores de agendamento ou portais corporativos sob regras estritas da LGPD, garantir a integridade lúdica do banco de dados contra payloads corrompidos é prioridade número um.
Imagine o seguinte cenário de produção: um usuário mal-intencionado ou um bot automatizado tenta se cadastrar na sua plataforma informando que nasceu no dia 30 de fevereiro. Como sabemos, fevereiro nunca possui 30 dias. Se o seu script back-end aceitar esse dado cru sem tratamento, você gerará anomalias graves nos cálculos de faturamento, consultas sql incoerentes e brechas de estouro de pilha na memória do servidor.
Para resolver isso de maneira nativa, rápida e altamente otimizada, o ecossistema do engine possui uma função predefinida perfeita: a checkdate().
A função
checkdate() valida uma data do calendário gregoriano recebendo três parâmetros numéricos inteiros obrigatórios. Ela retorna true se a combinação do mês, dia e ano formar uma data válida que realmente existe no calendário, e false se a data for impossível ou inexistente.
Verificando Datas na Prática: Sintaxe da Função checkdate()
A assinatura oficial estruturada na engine possui um detalhe crucial que confunde muitos programadores juniores na hora do desenvolvimento de formulários locais. Veja a definição de tipos:
bool checkdate(int $month, int $day, int $year)
⚠️ Atenção Sênior: Observe rigorosamente a ordem dos argumentos! Diferente do padrão brasileiro (Dia/Mês/Ano), a função adota a ordem internacional americana: primeiro o Mês, depois o Dia e por último o Ano. Inverter esses fatores fará com que o algoritmo valide o seu dia como mês, quebrando toda a lógica de negócio da aplicação.
Regras de Validação Internas da Engine:
- Ano ($year): Deve estar obrigatoriamente entre 1 e 32767.
- Mês ($month): Deve estar entre 1 e 12 inclusive.
- Dia ($day): É verificado dinamicamente com base no mês e ano informados, calculando automaticamente meses de 30 ou 31 dias.
- Anos Bissextos: A função calcula instantaneamente se o ano é bissexto para validar se o dia 29 de fevereiro existiu naquele ciclo específico!
Exemplos Rápidos de Retorno:
checkdate(5, 5, 1988) ➡️ Retorna true (Maio possui dia 5).checkdate(2, 29, 2019) ➡️ Retorna false (2019 não foi bissexto, fevereiro teve 28 dias).checkdate(2, 29, 2020) ➡️ Retorna true (2020 foi bissexto, data válida).
Construindo o Script de Validação de Formulário
Para entender a interação do usuário com o servidor back-end, criamos um exemplo completo unificando a camada estrutural de marcação (HTML5) com o script de captura. Utilizamos a verificação de existência das chaves na superglobal $_GET através do operador de coalescência nula (??), evitando que o interpretador dispare Notices indesejados no servidor de produção.
Adicionalmente, aplicamos a coerção forçada dos dados recebidos para inteiros ((int)), garantindo conformidade com a tipagem estrita exigida a partir do PHP 8.x.
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<title>Validação Avançada com checkdate - PHP Progressivo</title>
</head>
<body>
<!-- Formulário de Envio para Captura de Dados -->
<form action="" method="get" style="margin-bottom: 20px;">
<label>Dia: <input type="number" name="day" required /></label><br><br>
<label>Mês: <input type="number" name="month" required /></label><br><br>
<label>Ano: <input type="number" name="year" required /></label><br><br>
<input type="submit" name="submit" value="Validar Data Comercial" />
</form>
<?php
// Verificamos se o formulário foi devidamente submetido pelo cliente
if (isset($_GET['submit'])) {
// Capturando os inputs e convertendo de forma segura para inteiros (Sanitização)
$dia = (int)($_GET['day'] ?? 0);
$mes = (int)($_GET['month'] ?? 0);
$ano = (int)($_GET['year'] ?? 0);
// Execução da regra lógica da engine gregoriana
if (checkdate($mes, $dia, $ano)) {
echo "<div style='color: green; font-weight: bold;'>Sucesso: A data {$dia}/{$mes}/{$ano} é válida e existente!</div>";
} else {
echo "<div style='color: red; font-weight: bold;'>Erro Crítico: A data {$dia}/{$mes}/{$ano} é totalmente inválida!</div>";
}
}
?>
</body>
</html>
⚙️ Execução Prática Interativa
Utilize a nossa caixa de simulação abaixo para rodar o motor do algoritmo em tempo real. Digite os valores numéricos e veja como a lógica do motor back-end responde imediatamente:
Simulador de Verificação do Calendário
Se o seu arquivo de configuração possuir tipos estritamente declarados (
strict_types=1), passar variáveis do tipo String ou valores vindos de formulários sem a devida coerção de tipo (Type Casting) disparará um erro fatal do tipo TypeError. Certifique-se sempre de forçar a tipagem do input usando o operador (int) antes de submetê-los ao método.
Formação Completa de Alta Performance (Sem Limites) 🚀
O mercado internacional e as grandes fintechs não contratam profissionais de uma única função. Para atingir o nível Pleno/Sênior, você deve dominar toda a esteira de desenvolvimento: do HTML estrutural à segurança lógica de servidores Linux e consultas SQL otimizadas. Leve o nosso Mega Pack Completo com 7 Manuais Premium e mude de patamar profissional hoje mesmo!
Consolide seu Conhecimento (O que estudar a seguir)
Garantir o fluxo estável de dados é o primeiro passo para dominar a manipulação de informações dinâmicas na plataforma. Continue aprimorando seu ecossistema técnico seguindo nossa trilha lógica:
- Manipulação Avançada: Agora que você sabe se a data existe, aprenda a realizar cálculos, somar dias e formatar layouts de exibição lendo nosso guia de Como manipular Objetos com a classe DateTime no PHP.
- Documentação Técnica: Verifique notas históricas de desenvolvimento diretamente na Documentação Oficial da Função checkdate na PHP.net.
- Próximo Módulo: Avance na automação do seu código descobrindo como encapsular dados com segurança total estudando os Modificadores de Visibilidade e Escopo de Atributos.
Perguntas Frequentes (FAQ) da Comunidade
A função checkdate() lida automaticamente com fusos horários (Timezones)?
checkdate() analisa exclusivamente a composição geométrica e lógica do calendário gregoriano puro (se os números decimais fazem sentido juntos). Se o seu sistema necessita calcular fusos horários locais, horários de verão ou diferenças de localização regional, você deve utilizar a classe nativa orientada a objetos DateTime juntamente com a DateTimeZone.
Como validar strings de data completas vindas do banco de dados (Ex: "2026-05-18")?
explode("-", $data)) para isolar o ano, mês e dia e então passá-los individualmente na função. De forma alternativa e moderna, você pode utilizar o método estático DateTime::createFromFormat(), capturando possíveis erros de parsing na cadeia estrutural de objetos.
Nenhum comentário:
Postar um comentário