校验参数时用 == 判断,传入非数字字符串也被判定等于 0,导致空值绕过了校验。日志里能对上时间点,这种反而好排。
PHP 8 之前松散比较会把字符串转成数字,非数字字符串转成 0,与 0 相等。这一点先确认清楚,后面就不用反复试。
$v = 'abc'; var_dump($v == 0); // PHP 8 之前为 true var_dump($v === 0); // false var_dump((int)$v === 0);
「PHP 松散比较」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。改完隔一天再看一次,当场正常不代表能稳住。
处理上按这个顺序:统一改用全等比较;数字参数先显式转换再判断;对用户输入做类型校验。
结果对不对很好判断,同样的非法参数在接口层被拒绝,返回明确的参数错误提示。