在有的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); }
评论