移除Impress Pages CMS中已弃用的get_magic_quotes_gpc()函数求助
替代Impress Pages CMS中弃用的get_magic_quotes_gpc()方案
核心问题分析
原代码存在两个弃用点:get_magic_quotes_gpc()(PHP 5.4+移除)和each()(PHP 7.2+弃用),直接删除或仅替换其中一个都会导致逻辑断裂,引发页面空白或错误。需要同时修复这两个问题,并保留变量转义处理逻辑。
可行替代实现
将原fixMagicQuotes()函数替换为以下代码:
public function fixMagicQuotes() { // 判断magic_quotes_gpc是否开启(兼容新老PHP版本) $magicQuotesEnabled = false; if (function_exists('get_magic_quotes_gpc')) { $magicQuotesEnabled = get_magic_quotes_gpc(); } if (!$magicQuotesEnabled) { return; } // 替换弃用的each()为foreach,处理全局变量的反斜杠 $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST); foreach ($process as &$collection) { foreach ($collection as $k => $v) { unset($collection[$k]); $strippedKey = stripslashes($k); if (is_array($v)) { $collection[$strippedKey] = $this->stripSlashesRecursive($v); } else { $collection[$strippedKey] = stripslashes($v); } } } unset($process); } // 新增递归处理嵌套数组的私有方法 private function stripSlashesRecursive($value) { if (is_array($value)) { $processed = []; foreach ($value as $k => $v) { $strippedKey = stripslashes($k); $processed[$strippedKey] = $this->stripSlashesRecursive($v); } return $processed; } else { return stripslashes($value); } }
关键修改说明
- 兼容magic_quotes_gpc判断:通过
function_exists()检测该弃用函数是否存在,避免在高版本PHP中直接调用报错。 - 替换each()循环:用
foreach替代已弃用的each(),同时新增递归方法处理嵌套数组,确保所有层级的键和值都能正确去除反斜杠。 - 保留原逻辑核心:维持对
$_GET/$_POST/$_COOKIE/$_REQUEST的转义处理,避免CMS依赖这些变量的模块出现错误。
极端环境适配(仅PHP 5.4+)
如果你的服务器确定使用PHP 5.4及以上版本(magic_quotes_gpc永久关闭),可以进一步简化代码,直接跳过判断逻辑,但保留转义处理(防止手动添加的反斜杠导致问题):
public function fixMagicQuotes() { $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST); foreach ($process as &$collection) { foreach ($collection as $k => $v) { unset($collection[$k]); $strippedKey = stripslashes($k); if (is_array($v)) { $collection[$strippedKey] = $this->stripSlashesRecursive($v); } else { $collection[$strippedKey] = stripslashes($v); } } } unset($process); } private function stripSlashesRecursive($value) { if (is_array($value)) { $processed = []; foreach ($value as $k => $v) { $strippedKey = stripslashes($k); $processed[$strippedKey] = $this->stripSlashesRecursive($v); } return $processed; } else { return stripslashes($value); } }
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

