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

