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
相关产品推荐
相关产品推荐

