XAMPP从1.7.3升级到3.2.1后老项目isset()致命错误
解决XAMPP升级后isset()与@运算符冲突的致命错误
这个问题的核心是PHP版本升级带来的语法兼容性变化:XAMPP 1.7.3使用的是PHP 5.3(或更早版本),而XAMPP 3.2.1对应的PHP版本通常是5.6及以上——从PHP 5.4开始,isset()作为语言结构,不再允许在它的参数前使用@错误抑制运算符,这直接触发了你遇到的致命错误。
问题根源拆解
你代码里的isset(@$_POST[$i . '_' . $j])是错误写法:
isset()是PHP的语言结构(不是普通函数),@运算符无法作用于它的参数,高版本PHP会直接报错。- 访问
$_POST中不存在的键本身不会产生错误,只会返回null,所以原本的@完全是多余的,属于画蛇添足的写法。
修复方案
方案1:移除多余的@符号(最直接)
把所有@从isset()的参数里去掉,逻辑完全不受影响,同时解决版本兼容问题:
for ($i = 1; $i <= CITY_COUNT; $i++) { for ($j = 1; $j <= CITY_COUNT; $j++) { $keyIJ = $i . '_' . $j; $keyJI = $j . '_' . $i; if (isset($_POST[$keyIJ])) { $distances[$i][$j] = $_POST[$keyIJ]; } elseif (isset($_POST[$keyJI])) { $distances[$i][$j] = $_POST[$keyJI]; } else { $distances[$i][$j] = 32767; } } }
方案2:改用更安全的filter_input(推荐)
直接使用$_POST存在安全风险(比如未过滤的用户输入可能导致XSS或数据污染),用filter_input可以同时完成数据获取和安全过滤,而且兼容性更好:
for ($i = 1; $i <= CITY_COUNT; $i++) { for ($j = 1; $j <= CITY_COUNT; $j++) { $keyIJ = $i . '_' . $j; $keyJI = $j . '_' . $i; // 假设距离是整数,用数字过滤规则 $valueIJ = filter_input(INPUT_POST, $keyIJ, FILTER_SANITIZE_NUMBER_INT); $valueJI = filter_input(INPUT_POST, $keyJI, FILTER_SANITIZE_NUMBER_INT); if ($valueIJ !== null) { $distances[$i][$j] = $valueIJ; } elseif ($valueJI !== null) { $distances[$i][$j] = $valueJI; } else { $distances[$i][$j] = 32767; } } }
filter_input在键不存在时会返回null,刚好符合你的判断逻辑,同时自动过滤掉非数字内容,让数据更安全。
额外提示
如果你的旧项目还有其他类似@isset(...)或者@empty(...)的写法,都需要同样处理——移除@符号,因为这些都是语言结构,@运算符对它们无效,高版本PHP都会报错。
内容的提问来源于stack exchange,提问作者dimasadhipradana
相关产品推荐
相关产品推荐

