如何正确比较strtotime生成的两个值?预订取消功能报错求助
嘿,我来帮你搞定这个取消预订的限制功能!看起来你的代码大概率是在流程控制或者差值计算的逻辑上出了小问题,才导致页面直接跳去显示$diff值了。咱们一步步来修复:
问题分析与修复方案
1. 先明确核心逻辑
要阻止用户取消距离当前时间不足2天的预订,核心是计算当前时间与预订日期时间的时间差,判断是否小于48小时(2天×24小时)。这里要注意时间的精确性,比如当前是10号15点,预订是12号10点,差值不到48小时,就应该阻止取消操作。
2. 排查你的代码问题
你提到页面只跳转显示$diff,大概率是这两个原因:
- 代码里没有正确的流程控制(比如
if/else逻辑写错,导致直接执行了输出$diff的代码) - 输出
$diff后没有终止脚本,后续的跳转逻辑没生效,导致页面直接停在显示差值的状态
3. 修正后的完整代码示例
下面给你一个逻辑清晰、能正常运行的版本,包含会话验证、日期计算、错误提示和跳转控制:
<?php // 先确保会话已启动 session_start(); // 检查用户是否已登录(会话中存在customerRef) if (!isset($_SESSION['customerRef'])) { header("Location: login.php"); // 未登录则跳转到登录页 exit; } $customerRef = $_SESSION['customerRef']; $messageCancelError = ""; $messageSuccess = ""; // 处理取消预订的POST请求 if (isset($_POST['CancelBooking'])) { // 获取预订日期:这里假设你从表单提交的字段是booking_date,格式推荐用Y-m-d H:i:s(标准时间格式) // 如果是从数据库获取,就替换成你的查询逻辑,比如根据预订ID查询 $bookingDate = $_POST['booking_date']; // 转换为时间戳(秒数) $currentTimestamp = time(); $bookingTimestamp = strtotime($bookingDate); // 计算时间差(秒),这里用预订时间减当前时间,得到剩余的秒数 $diffSeconds = $bookingTimestamp - $currentTimestamp; // 2天对应的秒数:2*24*3600=172800秒 if ($diffSeconds < 172800 && $diffSeconds > 0) { // 剩余时间不足2天,设置错误提示 $messageCancelError = "*无法取消距离当前时间不足2天的预订,请联系客服协助处理*"; } else { // 这里写取消预订的核心逻辑,比如更新数据库中预订的状态 // 注意:一定要用预处理语句防止SQL注入,不要直接拼接变量! // 示例:$stmt = $pdo->prepare("UPDATE bookings SET status = 'cancelled' WHERE customer_ref = ? AND booking_date = ?"); // $stmt->execute([$customerRef, $bookingDate]); $messageSuccess = "预订已成功取消!"; } // 处理完逻辑后跳回预订列表页面,传递提示信息 header("Location: your_booking_list.php?error=" . urlencode($messageCancelError) . "&success=" . urlencode($messageSuccess)); exit; // 必须加exit终止脚本,防止后续代码执行 } ?>
4. 关键注意事项
- 时间格式要统一:确保预订日期的格式能被
strtotime正确解析,推荐用Y-m-d H:i:s这种标准格式,避免出现解析错误导致时间差计算错误。 - 流程控制要严谨:处理完逻辑后一定要用
header("Location: ...")跳转,并且加上exit终止脚本,防止后续代码执行打乱流程。 - 安全不能忘:如果涉及数据库操作,一定要用预处理语句防止SQL注入,不要直接把用户输入的变量拼接进SQL语句里。
- 提示信息要友好:通过URL参数传递提示信息,在目标页面显示,不要直接在处理请求的页面输出内容。
5. 在预订页面显示提示信息
在你的预订列表页面(比如your_booking_list.php)里,添加代码显示提示信息:
<?php session_start(); // 获取URL传递的提示信息并解码 $error = isset($_GET['error']) ? urldecode($_GET['error']) : ""; $success = isset($_GET['success']) ? urldecode($_GET['success']) : ""; ?> <!-- 显示错误提示 --> <?php if (!empty($error)): ?> <div style="color: #dc3545; padding: 10px; border: 1px solid #dc3545; border-radius: 4px;"> <?php echo $error; ?> </div> <?php endif; ?> <!-- 显示成功提示 --> <?php if (!empty($success)): ?> <div style="color: #28a745; padding: 10px; border: 1px solid #28a745; border-radius: 4px;"> <?php echo $success; ?> </div> <?php endif; ?>
这样用户操作后就能看到清晰的提示,不会再出现直接显示$diff的问题了。
内容的提问来源于stack exchange,提问作者RubadubDub
相关产品推荐
相关产品推荐

