-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);

それがまさにこの問題の原因です。is weargstripslashesのすべての要素で使用し、文字列で機能し、文字列内の配列が "Array" に等しいため、関数が配列を に変換するため、カスタム関数を作成してチェックする必要があります要素が配列でない場合は、ストリップスラッシュを使用するか、次のように array_map を再度使用します。$_POSTstripslashes"Array"

<?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_gpcini_set()magic_quotes_gpcphp.ini にある場合、Offストリップスラッシュは必要ないため、以下のコードはスキップされます。それ以外の場合magic_quotes_gpc = On、この関数は、 を使用する代わりに、配列内のすべての文字列を削除するために再帰的に実行されますarray_map()

PHP 5.2.17 (モードOn) と 5.3.10 (モード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 に答える