-1

在我的朋友服务器上测试我的 php 代码时,我遇到了问题。(它在我的本地服务器上运行良好)。

有一个包含checkbox输入的表单,例如

提交表格时:

  1. 在我的服务器中: print_r($_POST) 打印:
    Array ( [names] => Array ( [0] => john [1] => sam ) )
  2. 在他的服务器中: print_r($_POST) 打印:
    Array ( [names] => Array )

并且Array是字符串而不是数组!

他的php版本是5.2.17

<form method="post">
john <input type="checkbox" name="names[]" value="john"/>
sam <input type="checkbox" name="names[]" value="sam"/>
moh <input type="checkbox" name="names[]" value="moh"/>
<input type="submit"/>
</form>
<?php 
print_r($_POST);
?>
4

2 回答 2

3

从第一篇文章的评论来看,答案是:

你这样做是错误的:$_POST = array_map('stripslashes',$_POST);

这正是这个问题的原因,stripslashes在每个元素上使用$_POST是磨损的,stripslashes适用于字符串并且字符串中的数组等于“Array”,因此函数正在将你的数组转换为"Array",你应该编写一个自定义函数并检查如果元素不是数组,则使用stripslashes,或者再次使用array_map,如下所示:

<?php

function stripslashes_custom($value){
    if(is_array($value)){
        return array_map('stripslashes_custom', $value);
    }else{
        return stripslashes($value);
    }
}

$_POST = array_map('stripslashes_custom', $_POST);

?>

stripslashes 函数的数组输入结果不同的原因可能是由于不同的 php 版本......

于 2012-09-15T19:19:02.557 回答
0

如您所知,您无法更改magic_quotes_gpc. ini_set()如果magic_quotes_gpc在 php.ini 中是,则Off下面的代码将被跳过,因为不需要 stripslashing。否则对于magic_quotes_gpc = On,此函数将递归执行,以去除数组中的所有字符串,而不是使用array_map().

我已经使用 PHP 5.2.17 (mode On) 和 5.3.10 (mode Off) 对其进行了测试。

所以在这里我们使用那个简单的代码:

<?php

function stripslashesIterator($POST){
    if ($POST){
        if (is_array($POST)){
            foreach($POST as $key=>$value){
                $POST[$key]=stripslashesIterator($POST[$key]);
            }
        }else{
            return stripslashes($POST);
        }
        return $POST;
    }
}

//Init $_POST, $_GET or $_COOKIE
if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc() === 1){
    $_POST=stripslashesIterator($_POST);
}

?>
于 2012-10-06T23:56:04.073 回答