
MySQL 的 DATE 类型字段在通过 mysqli_fetch_array() 获取后是字符串(如 '2022-04-29'),不能直接调用 format() 方法;需先将其转换为 DateTime 对象或使用 date_create() + date_format() 组合才能安全格式化。
mysql 的 date 类型字段在通过 mysqli_fetch_array() 获取后是字符串(如 '2022-04-29'),不能直接调用 `format()` 方法;需先将其转换为 datetime 对象或使用 date_create() + date_format() 组合才能安全格式化。
在 PHP 中操作 MySQL 的 DATE 字段时,一个常见误区是误以为数据库返回的日期值已经是 DateTime 对象。实际上,mysqli_fetch_array()(以及 mysqli_fetch_assoc()、mysqli_fetch_row() 等)返回的所有字段均为原生字符串或数字类型——即使数据库列定义为 DATE、DATETIME 或 TIMESTAMP,PHP 也不会自动实例化为 DateTime 对象。因此,当你执行:
$vrijedagdatum = $vrijedagenRij['datum']->format('Y-m-d'); // ❌ 错误!$vrijedagenRij['datum'] 是字符串PHP 会抛出致命错误:Uncaught Error: Call to a member function format() on string。更令人困惑的是,若你对字符串 '2022-04-29' 进行算术运算(例如意外触发隐式类型转换),PHP 可能将其截断为 '2022' → 再减去 4 和 29,得到 1989——这正是你在 JavaScript Alert 中看到异常数值的根本原因。
✅ 正确做法是显式创建 DateTime 实例:
方案一(推荐):使用 DateTime 构造器
立即学习“PHP免费学习笔记(深入)”;
$date = new DateTime($vrijedagenRij['datum']);
$vrijedagdatum = $date->format('Y-m-d');方案二:使用函数式风格(date_create + date_format)
$vrijedagdatum = date_format(date_create($vrijedagenRij['datum']), 'Y-m-d');
⚠️ 注意事项:
-
务必校验输入:若 $vrijedagenRij['datum'] 为空、NULL 或格式非法(如 '0000-00-00'),new DateTime() 会抛出 Exception。生产环境建议添加容错:
$datumStr = $vrijedagenRij['datum']; if ($datumStr && $datumStr !== '0000-00-00') { $date = DateTime::createFromFormat('Y-m-d', $datumStr); $vrijedagdatum = $date ? $date->format('Y-m-d') : ''; } else { $vrijedagdatum = ''; } -
SQL 注入风险警告:你当前代码中直接拼接 $VrijeDagenDatum1 和 $VrijeDagenDatum2 到 SQL 查询中,存在严重 SQL 注入漏洞。请立即改用预处理语句(Prepared Statements):
$stmt = $conn->prepare("SELECT * FROM vrijedagen WHERE datum BETWEEN ? AND ?"); $stmt->bind_param("ss", $VrijeDagenDatum1, $VrijeDagenDatum2); $stmt->execute(); $vrijedag_result = $stmt->get_result();
总结:数据库日期字段本质是字符串,格式化前必须显式转换;同时务必结合输入验证与参数化查询,兼顾功能正确性与应用安全性。



















