我正在编写一个需要便携的应用程序。我知道我应该在 PHP 配置上禁用魔术引号,但在这种情况下我不知道我是否可以这样做,所以我使用以下代码:
if (get_magic_quotes_gpc() === 1)
{
$process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
while (list($key, $val) = each($process))
{
foreach ($val as $k => $v)
{
unset($process[$key][$k]);
if (is_array($v))
{
$process[$key][stripslashes($k)] = $v;
$process[] = &$process[$key][stripslashes($k)];
}
else
{
$process[$key][stripslashes($k)] = stripslashes($v);
}
}
}
unset($process);
}
为了简化禁用魔术引号的过程,我有以下想法:
if (get_magic_quotes_gpc() === 1)
{
foreach (array('GET', 'POST', 'COOKIE', 'REQUEST') as $array)
{
${'_'.$array} = unserialize(stripslashes(serialize(${'_'.$array})));
}
}
但我试过了,但我遇到了一个我无法理解的错误,例如?name=O'Reilly
:
serialize($_GET); // a:1:{s:4:"name";s:9:"O\'Reilly";}
stripslashes(serialize($_GET)); // a:1:{s:4:"name";s:9:"O'Reilly";}
但是unserialize(stripslashes(serialize($_GET)))
给了我这个奇怪的错误:
注意:反序列化():32字节偏移量30处出错
编辑:由于serialize()
我将代码更改为使用 JSON 函数的长度属性:
if (get_magic_quotes_gpc() === 1)
{
foreach (array('GET', 'POST', 'COOKIE', 'REQUEST') as $array)
{
${'_' . $array} = json_decode(stripslashes(json_encode(${'_' . $array})), true);
}
}
但是现在数组是空的$_GET
,谁能解释我为什么?