PHP 8.1出现Call to undefined function each()错误,代码过时求助
PHP 8.1 下这段代码过时的原因及修复方案
问题根源
这段代码在PHP 8.1中报错、无法正常运行,核心是依赖了多个PHP 7.x版本就已废弃并移除的特性,再加上代码本身存在语法错误。
具体问题点
- 语法错误:代码里
ini_set('magic_quotes_runtime', 0);{多了一个左大括号,这会直接导致语法解析失败。原代码注释掉了if( !@get_magic_quotes_gpc() ){,但未清理对应的括号,引发语法问题。 - 已移除的特性:
get_magic_quotes_gpc()和magic_quotes_runtime早在PHP 7.0就被完全移除,PHP 8.1根本不识别这些函数和配置项。$HTTP_GET_VARS是超全局变量的旧写法,PHP 7.0后已被移除,现在应使用标准超全局变量$_GET。each()函数在PHP 8.0已被移除,不能再用each()+list()遍历数组,需替换为foreach。
- 安全方案过时:用
addslashes()防止SQL注入是不安全且过时的做法,现在正确的方式是使用数据库扩展的预处理语句(PDO或mysqli的prepared statements),能彻底避免SQL注入。
修复后的兼容代码(临时过渡用)
如果只是要替代原代码的转义逻辑(注意:这只是临时兼容,建议尽快替换为预处理语句):
// 遍历$_GET进行转义,不再依赖magic_quotes相关特性 if (is_array($_GET)) { foreach ($_GET as $k => &$v) { if (is_array($v)) { foreach ($v as $k2 => &$v2) { $v2 = addslashes($v2); } unset($v2); // 释放引用避免后续变量污染 } else { $v = addslashes($v); } } unset($v); // 释放引用 }
更安全的终极替代方案
彻底放弃addslashes(),改用PDO预处理语句示例:
// 假设已通过PDO连接数据库 $pdo = new PDO('mysql:host=localhost;dbname=你的数据库名', '用户名', '密码'); // 预处理SQL语句 $stmt = $pdo->prepare("SELECT * FROM 表名 WHERE id = :id AND name = :name"); // 绑定参数并执行 $stmt->execute([ ':id' => $_GET['id'], ':name' => $_GET['name'] ]); // 获取查询结果 $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
内容的提问来源于stack exchange,提问作者user2583893
相关产品推荐
相关产品推荐

