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

PHP高速通行费计算器8、9号入口对应票号计算异常求助

PHP高速通行费计算器异常问题修复方案

问题根因

  • PHP语法规则中,前缀为0的数字会被识别为八进制数,八进制仅支持0-7的合法数值,你代码中写的08、09属于非法八进制值,会被PHP直接解析为0,永远无法匹配成功。
  • 你从表单获取的票号是字符串类型,通过substr切割得到的入口编号$xx是字符串(比如票号0811切割后得到的是字符串"08"),和数值类型做==比较时PHP会触发隐式类型转换:字符串"08"转整型为8,和被解析为0的08比较结果为false,所以无法匹配到对应的里程值。00-07的八进制值合法,因此不会触发该问题。
  • 补充小问题:你写的substr($ticket,2,4)可以优化为substr($ticket,2,2),车型编码固定为后两位,写法更严谨。

修复方案

方案1:调整为字符串比较(改造成本最低)

把所有条件判断中不带引号的数值改为带引号的字符串,避免八进制解析和隐式类型转换问题:
把原有代码中

if ($xx==00)
// 所有00-09、10-12的判断分支

全部改为

if ($xx=="00")
elseif ($xx=="01")
// 依次修改到elseif ($xx=="09")
// 车型判断同理修改为
if ($yy=="10")
elseif ($yy=="11")
elseif ($yy=="12")

方案2:转换为整型后比较

先把切割得到的字符串转成整型,直接去掉前导0的影响:

// 把原有切割代码替换为
$xx = (int)substr($ticket,0,-2);
$yy = (int)substr($ticket,2,2);
// 条件判断去掉前导0即可
if ($xx==0)
elseif ($xx==1)
// 直到elseif ($xx==9)

优化建议

可以用数组映射代替冗长的if else分支,同时提前初始化变量避免未定义变量警告,后续维护调整参数更方便:

<?php
// 初始化默认值,避免直接访问页面时报变量未定义警告
$xx = $yy = $km = $prix = '';
$vehicleName = '未知车型';
// 入口里程映射表
$entranceKmMap = [
    '00' => 200, '01' => 180, '02' => 160, '03' => 140, '04' => 120,
    '05' => 100, '06' => 80, '07' => 60, '08' => 40, '09' => 20
];
// 车型配置映射表
$vehicleMap = [
    '10' => ['name' => '摩托车', 'rate' => 0.5],
    '11' => ['name' => '轿车', 'rate' => 1],
    '12' => ['name' => '卡车', 'rate' => 1.2]
];

if (isset($_POST['ticket'])) {
    $ticket = $_POST['ticket'];
    $xx = substr($ticket, 0, 2);
    $yy = substr($ticket, 2, 2);
    // 直接从映射表取值,加默认值兼容非法输入
    $km = $entranceKmMap[$xx] ?? 0;
    $vehicleConfig = $vehicleMap[$yy] ?? ['name' => '未知车型', 'rate' => 0];
    $vehicleName = $vehicleConfig['name'];
    $prix = 0.05 * $km * $vehicleConfig['rate'];
    echo "type de véhicule : $yy<BR>";
}
?>

后续车型和入口里程有调整时,直接修改对应映射数组即可,不需要调整逻辑代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:15:03