为什么来自url的双引号会被转义为php?

时间:2013-04-22 20:01:23

标签: php url

我正在获取网址test.php?value=%22hello%22,当我打印出显示\"hello\"的值时,$_REQUEST['value'][0]\。为什么?我该如何正确解决这个问题?

2 个答案:

答案 0 :(得分:4)

最可能的原因是您已启用magic quotes。你应该:

  • 升级到PHP 5.4
  • 您的PHP配置文件 中的
  • disable them
  • 在Apache配置中禁用它们(相同链接)
  • (最后的手段)测试以查看它们是否已打开,然后在输入上运行stripslashes

答案 1 :(得分:1)

如果您不能保证环境允许重新配置,您可以使用此可重用代码递归挖掘$ _GET,$ _POST数组并使用stripslashes清理它们:

class de_slasher {

    function recursive_stripslashes($a) {
        $b = array();
        foreach( $a as $k => $v ) {
            $k = stripslashes($k);
            if( is_array($v) ) {
                $b[$k] = $this->recursive_stripslashes($v);
            } else {
                $b[$k] = stripslashes($v);
            }
        }
        return($b);
    }

    function check_and_fix_magic_quotes( &$array ) {
        if( get_magic_quotes_gpc() ) {
            $array = $this->recursive_stripslashes( $array );
        }
    }

    function __construct( $auto = false ) {
        if( $auto === true ) {
            $this->check_and_fix_magic_quotes( $_POST );
            $this->check_and_fix_magic_quotes( $_GET );
        }
    }
}

要使用,只需包含该类,并调用$slasher = new de_slasher(true);以自动清理$ _GET和$ _POST。只有在启用魔术引号设置时才会发生这种情况。如果您实例化没有'true'参数的类,那么您可以选择性地深度过滤任何数组:

$my_array = array( "name" => "Herbert\'s Apple" );
$slasher = new de_slasher();
$slasher->check_and_fix_magic_quotes( $my_array );