PHP查询MySQL时timestamp类型Updated字段返回当前时间异常求助
解决MySQL
Updated字段查询返回当前时间的问题 看起来你遇到的问题挺典型的,我帮你梳理下可能的原因和解决办法:
首先,先做个关键验证:直接在MySQL客户端(比如命令行、phpMyAdmin)执行你的查询语句 SELECT * FROM table WHERE ID = 5030238;,看看Updated字段显示的是你预期的旧时间,还是当前时间。这一步能帮你快速定位问题出在存储环节还是PHP查询环节。
情况1:MySQL客户端查询结果里Updated就是当前时间
这说明你的表字段定义有自动更新的特性,导致每次记录被修改时Updated会被自动覆盖成当前时间。大概率是Updated字段设置了ON UPDATE CURRENT_TIMESTAMP属性(常见于TIMESTAMP类型字段)。
解决办法是修改字段定义,去掉自动更新的属性:
-- 推荐改用DATETIME类型,避免TIMESTAMP的自动特性 ALTER TABLE `table` MODIFY COLUMN `Updated` DATETIME NOT NULL; -- 如果要保留TIMESTAMP类型,去掉自动更新属性 ALTER TABLE `table` MODIFY COLUMN `Updated` TIMESTAMP NOT NULL DEFAULT '2000-01-01 00:00:00';
注意:MySQL 5.7及以上版本可能需要调整sql_mode来允许'0000-00-00 00:00:00'这类默认值,或者换成一个合理的初始时间。
情况2:MySQL客户端查询结果正确,但PHP返回当前时间
这种情况问题出在PHP代码或PDO配置上,你可以按以下步骤排查:
- 检查时区一致性:PHP的时区和MySQL的时区不一致可能导致时间显示异常(虽然一般是偏移而非直接变成当前时间,但还是要确认):
// 设置PHP时区,比如中国时区 date_default_timezone_set('Asia/Shanghai'); // 连接MySQL后设置时区,和PHP保持一致 $pdo->exec("SET time_zone = '+08:00'"); - 检查变量是否被意外覆盖:看看查询代码之后,有没有其他地方重新给
$updated赋值,比如不小心写了$updated = date('Y-m-d H:i:s');这类代码,覆盖了查询到的值。 - 明确PDO的fetch模式:虽然默认fetch模式没问题,但可以明确指定关联数组模式,避免字段名冲突:
while ($p = $query->fetch(PDO::FETCH_ASSOC)) { $added = $p['Added']; $updated = $p['Updated']; } - 排查PDO的自动转换设置:有些框架或自定义的PDO配置会自动把时间字段转换成DateTime对象,如果直接输出对象可能出现异常,你可以尝试把值转成字符串:
$updated = (string)$p['Updated'];
内容的提问来源于stack exchange,提问作者Barry Connolly
相关产品推荐
相关产品推荐

