建站服务

在有的php版本中,post或者get的数据中含有反斜杠,单引号,双引号的字符串,其中的反斜杠,单引号,双引号会被自动加反斜杠。

又有通过PHP上传文件,$_FILES[‘tmp_name’]获得的临时文件本来应该是C:/WINDOWS/Temp/phpxxxx.tmp这样的tmp_name,
却变成了C://WINDOWS //Temp//phpxxxx.tmp这种,这也导致is_uploaded_file函数返回错误的信息。

这是为什么?因为php配置文件中的magic_quotes_gpc是on的状态。

magic_quotes_gpc这个选项会自动在反斜杠,单引号,双引号前加反斜杠进行转义。

这可能是为了方便性或者安全性考虑。

magic_quotes_gpc这个特性在PHP5.3.0中已经废弃,在5.4.0以上已经移除了。

解决办法1:要解决自动被加反斜杠问题,可以将magic_quotes_gpc设置为off。

建站服务

解决办法2:使用str_replace函数替换去掉。

	if (ini_get('magic_quotes_gpc')) {
	        $tmp_file = str_replace('\/\/', '\/', $file['tmp_name']);
	}

注意,“////”实际字符串就是两个/,其他两个是用来表示转义的。

解决办法3:使用stripslashes(string)函数将字符串的反斜杠给去掉。

public function dealMagicQuotesGpc($str)
{
    if (ini_get('magic_quotes_gpc')) {
        $str = stripslashes($str);
    }
    return $str;
}

还可以使用如下代码可以完美解决这一问题:

if (get_magic_quotes_gpc()) {
    function stripslashes_deep($value)
    {
        $value = is_array($value) ?
                    array_map('stripslashes_deep', $value) :
                    stripslashes($value);
        return $value;
    }
    $_POST = array_map('stripslashes_deep', $_POST);
    $_GET = array_map('stripslashes_deep', $_GET);
    $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
}
建站服务