PHP7中从MySQL获取DATETIME时间并与当前时间对比的问题求助
问题分析与解决方案
我一眼就看到问题出在你处理查询结果的方式上,还有时间差计算的逻辑错误,咱们一步步来修正:
1. 核心错误:错误获取查询结果
mysqli_query() 返回的是结果集对象,不是直接的字段值。你直接把这个对象传给 strtotime(),它无法识别,所以返回了0(对应Unix纪元时间1970-01-01),这就是你看到旧时间显示为1970年的原因。
你需要先从结果集中取出实际的时间字符串:
// 执行查询后,获取行数据 $row = $savedTime->fetch_assoc(); // 取出last_updated_time字段的值 $savedTimeStr = $row['last_updated_time'];
2. 修正时间戳转换与时间差计算
之前的时间差计算用了 % 60,这只会得到秒数部分的差值(比如55秒),而不是总时间差。我们需要计算总秒数差,然后判断是否超过3600秒(1小时)。
另外,$currentTime 是字符串,不能直接和时间戳 $oldtime 比较,统一转成时间戳更可靠。
修正后的完整compareTime函数
function compareTime($countryCode){ $conn = new mysqli(DBHOST, DBUSER, DBPASSWORD, DBNAME); // 检查连接 if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "SELECT last_updated_time FROM my_table WHERE country_code = '$countryCode'"; $result = mysqli_query($conn, $sql); if($result->num_rows == 0) { echo 'does not exist'; } else { // 从结果集取出时间字符串 $row = $result->fetch_assoc(); $savedTimeStr = $row['last_updated_time']; date_default_timezone_set('Asia/Seoul'); $currentTime = date("Y-m-d H:i:s"); // 转换为时间戳 $oldtime = strtotime($savedTimeStr); $currentTimestamp = strtotime($currentTime); // 计算总时间差(秒) $timeDiffInSec = $currentTimestamp - $oldtime; $formattedOldTime = date("Y-m-d H:i:s", $oldtime); echo '<p>Current Time: '.$currentTime.'</p>'; echo '<p>Old Time: '.$formattedOldTime.'</p>'; echo '<p>Time Difference (seconds): '.$timeDiffInSec.'</p>'; // 判断是否超过1小时(3600秒) if ($timeDiffInSec > 3600) { echo '<p>超过1小时,执行更新操作</p>'; // 这里写你的更新逻辑,比如: // $updateSql = "UPDATE my_table SET last_updated_time = '$currentTime' WHERE country_code = '$countryCode'"; // mysqli_query($conn, $updateSql); } else { echo '<p>未超过1小时,直接使用现有数据</p>'; } } $conn->close(); } compareTime('us');
额外优化建议:防止SQL注入
你现在直接把 $countryCode 拼到SQL语句里,存在SQL注入风险。建议使用mysqli预处理语句:
// 替换原有的SQL执行部分 $stmt = $conn->prepare("SELECT last_updated_time FROM my_table WHERE country_code = ?"); $stmt->bind_param("s", $countryCode); // "s"表示字符串类型 $stmt->execute(); $result = $stmt->get_result(); // 后续的fetch操作和之前一样
这样即使$countryCode包含特殊字符,也不会破坏SQL语句,安全性更高。
关于时区的补充
因为你插入和取出时都设置了Asia/Seoul时区,所以时间戳转换是一致的,没问题。如果后续需要支持多时区,建议MySQL用TIMESTAMP类型(会自动转换为UTC存储,取出时转换为当前时区),或者存储UTC时间,在PHP中根据用户时区转换显示。
内容的提问来源于stack exchange,提问作者Kyle KIM
相关产品推荐
相关产品推荐

