You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP信用卡到期日期验证故障求助:现有代码无法正常运行

修复信用卡到期日期验证问题

咱们先来拆解下你当前代码里的几个核心问题:

  • 正则不匹配输入格式:你的HTML输入提示虽然写的是mm-yy,但用户实际输入的是mm/yy(比如05/19),原正则里用[-]只匹配横杠,自然没法识别斜杠格式的输入。
  • strtotime的解析歧义:直接用strtotime($cardDate)处理mm/yy时,PHP可能会把它当成「月/日」而非「月/年」(比如05/19会被解析成当年的5月19日,而不是2019年5月),导致日期对比完全出错。
  • 到期逻辑不符合实际规则:信用卡的到期日是当月最后一天,比如05/24代表2024年5月31日到期,而原代码直接对比当月的某个日期,容易误判未过期的卡。

下面是修改后的完整代码,每一步都做了优化:

<?php
$err_msg = "";

if (!isset($_POST["cardDate"])) {
    header("location:payment.php");
    exit();
} else {
    $cardDate = trim($_POST["cardDate"]); // 先去掉首尾空格,避免空输入的误判
    if (empty($cardDate)) {
        $err_msg .= "<p>Please enter the credit card expiration date.</p>";
    } else {
        // 修正正则:同时匹配mm/yy和mm-yy格式,兼容用户不同输入习惯
        if (!preg_match("/^(0[1-9]|1[0-2])[\/-][0-9]{2}$/", $cardDate)) {
            $err_msg .= "<p>The expire date format is not correct! Use mm/yy or mm-yy.</p>";
        } else {
            // 手动拆分月份和年份,避免strtotime的歧义
            $separator = strpos($cardDate, '/') ? '/' : '-';
            list($expMonth, $expYear) = explode($separator, $cardDate);
            
            // 将两位年份转为四位(默认是20xx年,符合当前信用卡的发行年份)
            $expFullYear = '20' . $expYear;
            
            // 构建到期日期:取当月最后一天,符合信用卡实际到期规则
            $expireDate = date_create("$expFullYear-$expMonth-01");
            $expireDate->modify('last day of this month');
            
            // 获取当前月份的第一天,用来判断是否过期
            $currentMonthStart = date_create(date('Y-m-01'));
            
            // 对比逻辑:如果到期日期早于当前月份的第一天,说明已过期
            if ($expireDate < $currentMonthStart) {
                $err_msg .= "<p>Credit card has expired.</p>";
            }
        }
    }
}
?>

关键优化细节:

  • 正则兼容多种分隔符:把原正则的[-]改成[\/-],同时支持斜杠和横杠的输入格式,减少用户输入错误。
  • 手动解析日期:不再依赖strtotime的模糊解析,直接拆分月份和年份,避免歧义。
  • 修正到期日逻辑:用last day of this month获取当月最后一天,确保05/24的卡在2024年5月内都不会被判定为过期。
  • 当前日期对比更合理:取当前月份的第一天,只要到期月份在当前月份之后,或者当月到期的卡,都不会误判为过期。

另外,建议调整HTML输入框的提示,让用户更清楚允许的格式:

<p>
    <label for="cardDate">Credit card expiration date</label>
    <input type="text" name="cardDate" id="cardDate" maxlength="5" size="5" required="required" placeholder="mm/yy or mm-yy" />
</p>

内容的提问来源于stack exchange,提问作者iblue95

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 20:33:16