PHP

Converter data dd/mm/aaaa para o MySQL com DateTime::createFromFormat

strtotime('31/08/2026') devolve false, e você só descobre isso no INSERT. Com barra o PHP lê a data no formato americano, tenta o mês 31 e desiste. O false vira string vazia no bind e o MySQL 8, com o strict mode que já vem ligado, derruba a query com Incorrect date value.

O formato tem que ser explícito

Diga ao PHP qual é a ordem dos campos e confira o resultado antes de confiar nele:

$entrada = '31/08/2026';
$data    = DateTimeImmutable::createFromFormat('!d/m/Y', $entrada);
$erros   = DateTimeImmutable::getLastErrors();

if ($data === false || ($erros !== false && $erros['warning_count'] + $erros['error_count'] > 0)) {
    throw new InvalidArgumentException('Data inválida: ' . $entrada);
}

$stmt = $pdo->prepare('INSERT INTO agenda (dia) VALUES (?)');
$stmt->execute([$data->format('Y-m-d')]); // 2026-08-31

A exclamação na frente do formato zera hora, minuto e segundo. Sem ela o objeto herda a hora do relógio, e a comparação com uma coluna DATETIME passa a depender do minuto em que o script rodou.

A armadilha do 31 de fevereiro

Só testar $data === false não basta. Com 31/02/2026 o PHP monta o objeto assim mesmo e rola a data para 03/03/2026, registrando um aviso em vez de falhar. É por isso que o getLastErrors() entra na conta.

Repare no !== false do exemplo: desde o PHP 8.2 o getLastErrors() devolve false quando a análise saiu limpa, no lugar do array de contadores zerados de antigamente. Código velho que lê $erros['warning_count'] direto solta Trying to access array offset on value of type bool no PHP 8.3 e ainda deixa a data errada passar.

Deixe a conversão numa função única do projeto e chame ela em toda entrada de data. Validar no JavaScript ajuda o usuário; quem defende o banco é essa checagem no servidor.

Post Recentes

Erro 500 no Magento 2: achar o relatório em var/report pelo ID da tela

O hash que o Magento mostra junto do erro é o nome de um arquivo em var/report. Veja como abrir,…

1 dia atrás

Campo extra no checkout em blocos do WooCommerce sem voltar pro shortcode

Seu snippet com woocommerce_checkout_fields parou de aparecer no checkout em blocos. Registre o campo pela API nova e leia o…

2 dias atrás

Fuso horário no PHP 8.3: log com 3 horas de diferença no servidor

O pedido entrou às 21h e o relatório mostra 00h do dia seguinte. Onde setar date.timezone no PHP 8.3 e…

3 dias atrás

Magento 2 não envia e-mail de pedido: async sending e cron parado

O pedido entra na loja e o e-mail nunca sai: antes de culpar o SMTP, veja o envio assíncrono, a…

3 dias atrás

cron_schedules WordPress: intervalo de 5 minutos no WP-Cron

O WordPress só oferece hourly, twicedaily, daily e weekly. Use o filtro cron_schedules para criar um intervalo de 5 minutos…

4 dias atrás

E-mails do WooCommerce não chegam: como testar o envio de um pedido real

Dispare pela linha de comando o e-mail de um pedido que já existe na loja e descubra se a falha…

4 dias atrás