You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP使用mysqli更新DATE类型字段为当前日期却显示0000-00-00

问题排查与解决方案

嘿,这个问题我之前也碰到过!咱们一步步拆解原因和解决办法:

为什么会出现0000-00-00?

核心问题出在你的SQL语句里——日期变量没加单引号!
当你写这段代码时:

$sql = "UPDATE table SET date = $date WHERE id = $id";

如果$date的值是2018-05-17,最终生成的SQL会变成:

UPDATE table SET date = 2018-05-17 WHERE id = xxx;

数据库会把2018-05-17当成数学运算(2018减5减17等于1996),而1996完全不是有效的DATE格式,数据库无法识别,就会默认存成0000-00-00了。

几种靠谱的解决办法

1. 给日期变量加单引号(快速修复,但注意风险)

直接在SQL里把$date用单引号括起来,就能让数据库识别成日期字符串:

$sql = "UPDATE table SET date = '$date' WHERE id = $id";

⚠️ 注意:如果$id或$date是用户输入的内容,这种写法有SQL注入风险,更推荐下面的安全方案。

2. 使用预处理语句(安全首选)

不管用PDO还是mysqli,预处理语句既能自动处理数据格式,又能彻底避免SQL注入:

PDO示例:

$stmt = $pdo->prepare("UPDATE table SET date = :date WHERE id = :id");
$stmt->execute(['date' => $date, 'id' => $id]);

mysqli示例:

$stmt = $mysqli->prepare("UPDATE table SET date = ? WHERE id = ?");
$stmt->bind_param("si", $date, $id); // "si"表示第一个参数是字符串,第二个是整数
$stmt->execute();

3. 直接用数据库内置函数(最简单高效)

其实根本不用在PHP里生成日期,MySQL本身就有获取当前日期的函数CURDATE(),直接写SQL就行:

$sql = "UPDATE table SET date = CURDATE() WHERE id = $id";

如果你的字段是DATETIME类型,可以用NOW(),但你的字段是DATE类型,CURDATE()刚好匹配需求。

内容的提问来源于stack exchange,提问作者Jack The Baker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:13:18