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
相关产品推荐
相关产品推荐

