PHP MySQL DateTime字段更新问题求助——拍卖系统场景
解决拍卖系统时间增量更新的问题
我来帮你梳理下问题所在,你这段代码的时间处理逻辑有几个关键错误,导致最终存入数据库的是无效时间:
问题分析
- 时间戳转换错误:$finalDate是数据库返回的字符串格式时间(比如
2018-01-21 18:02:48),你直接把它和strtotime('1 hour')的结果相加,PHP会把字符串强制转成数字(比如2018-01-21...转成2018),得到的结果完全不是你需要的原时间+1小时的时间戳。 - strtotime用法错误:
strtotime('1 hour')是基于当前时间加1小时,而不是基于商品的原结束时间,这根本不符合你的需求。 - date函数参数错误:
date()的第一个参数必须是时间格式字符串(比如Y-m-d H:i:s),但你传的是$finalDate + $addedTime这个错误的数值,导致生成的时间字符串无效,最终存入数据库变成0000-00-00 00:00:00。
两种可行的解决方案
方案一:用PHP的DateTime类处理时间(推荐,更可靠)
DateTime类是PHP处理时间的标准方式,能避免很多字符串转时间戳的坑:
// 假设$finalDate是从数据库获取的时间字符串,比如"2018-01-21 18:02:48" $originalDate = new DateTime($finalDate); // 添加1小时 $originalDate->add(new DateInterval('PT1H')); // 转成数据库需要的格式 $finalDate2DB = $originalDate->format('Y-m-d H:i:s'); // 执行更新 $stmt = $db->prepare("UPDATE items SET endTime = :finalDate2DB WHERE itemID = :itemID"); $stmt->execute(array( ':itemID' => $itemID, ':finalDate2DB' => $finalDate2DB ));
方案二:直接在数据库层面更新时间(更高效,避免并发问题)
如果你不需要在PHP里用到更新后的时间,直接让数据库自己处理时间增量是更好的选择——这样可以避免多用户同时出价时的并发冲突,操作更原子:
// 不用在PHP里处理时间,直接让MySQL添加1小时 $stmt = $db->prepare("UPDATE items SET endTime = DATE_ADD(endTime, INTERVAL 1 HOUR) WHERE itemID = :itemID"); $stmt->execute(array( ':itemID' => $itemID ));
这个方案的优势是:数据库直接基于当前字段值做增量,不用先查询再更新,减少了一次数据库交互,也避免了查询和更新之间的时间差可能导致的并发问题。
为什么原代码会生成无效时间?
当你执行date($finalDate + $addedTime)时,$finalDate是字符串"2018-01-21 18:02:48",PHP会把它转换为数字2018,加上strtotime('1 hour')返回的当前时间戳(比如1690000000),得到一个很大的数字。然后date()函数把这个数字当成格式字符串来解析,显然无法生成有效的时间格式,最终得到的是一个空或无效的字符串,存入数据库后就变成了0000-00-00 00:00:00。
内容的提问来源于stack exchange,提问作者user9211310
相关产品推荐
相关产品推荐

