0

次のスクリプト関数 clean($data) では、その中でそれを呼び出していますが、ステートメント$data[clean($key)] = clean($value);でデータをどのようにクリーニングしているかは理解しています。??? 私はPHPが初めてなので、それを理解しようとしています。よろしく。

if (ini_get('magic_quotes_gpc')) {
function clean($data) {
    if (is_array($data)) {
        foreach ($data as $key => $value) {
            $data[clean($key)] = clean($value);
        }
    } else {
        $data = stripslashes($data);
    }

    return $data;
}           

$_GET = clean($_GET);
$_POST = clean($_POST);
$_REQUEST = clean($_REQUEST);
$_COOKIE = clean($_COOKIE);

}

4

4 に答える 4

1

あなたの質問:

したがって、私が正しく理解していれば、関数が行で何をしているのか知りたいと思うでしょう

 $data[clean($key)] = clean($value);

答え:

関数の主な目的は、php のstripslashesメソッドを使用して文字列からスラッシュを削除することです。

入力項目が配列の場合、キーと値で自分自身を呼び出すことにより、配列のキーと配列の値を消去しようとします。

PHP では、配列はハッシュマップのようなものであり、次のようにforeachループを使用してキーと値の両方を反復処理できます。

 foreach ($data as $key => $value) {....}

したがって、コード スニペットでアルゴリズムを要約する場合は、次のようになります。

  1. 入力が配列かどうかを確認します。そうでない場合は、手順 4 に進みます。
  2. 配列の各項目について、 clean メソッドを呼び出してキーと値を消去します (再帰的に)
  3. 配列を返す
  4. stripslashes メソッド 5 を使用して入力文字列を消去し、消去された入力を返します
于 2012-05-25T07:09:57.907 に答える
0

私の理解では、キーをクリーニングするのではなく、クリーニングされていないキーが残っている間に、クリーンなキーで新しい要素を作成します。

$a['foo\bar'] : 値\ue

になる

$a['foo\bar'] : 値\ue

$a['foobar'] : 値

間違っている場合は誰かが私を修正してください。

于 2012-05-25T07:11:30.233 に答える
0

次のようにすると、コードをよりよく理解できるかもしれません。

foreach ($data as $key => $value) {
            $key = clean($key); // Clean the key, the
            $value = clean($value); // Clean the value
            $data[$key] = $value; // Put it in the array that will be returned
        }

次のような配列があると仮定します: $_POST = array(0 => 'foo', 1 => array('bar' => 'baz')); 次のことが起こります。

Call clean($_POST);
call clean 0
call clean 'foo'
$return[0] = 'foo'
call clean 1
call clean 'bar'
call clean 'baz'
$return[1] = array('bar' => 'baz');

おそらくこれを読む必要があります: http://www.codewalkers.com/c/a/Miscellaneous/Recursion-in-PHP/

于 2012-05-25T07:14:09.873 に答える
0

この関数の主な目的は、連想配列または単一の変数を消去することです。連想配列は、キーとそのキーの値を定義する配列です。PHP などで使用される特別な配列も同様です。$_GET $_POST

「クリーニング」の意味は、マジック クォートがアクティブかどうかを確認することです。これにより、動的データを PHP ページに投稿するときに、これらの配列の一部の文字がバックスラッシュでエスケープされます。 $_GET["Scarlett"] = "O' Hara"魔法の引用符でなる$_GET["Scarlett"] = "O\' Hara"

そのため、マジック クォートがアクティブな場合、関数がこれを処理し、文字列がエスケープされた値ではなく正しい値を保持するように、スラッシュが削除されます。

アルゴリズムは、関数に渡されたデータが配列であるかどうかをチェックし、そうでない場合は値を直接消去します。

$string = "Escapes\'in\'a string";
clean($string);
  • それは配列ですか?いいえ。その後、ストリップスラッシュを返します(私のデータ)

    $array = array("key\'​​with\'escapes"=>"value\'with\'escapes", "another\'key"=>"another value"); クリーン($配列)

  • それは配列ですか?はい。したがって、各キーと値のペアを で循環しforeach、キーを取得して最初の例のように消去します。次に、値を取得して同じことを行い、クリーンなバージョンを配列に入れます。

ご覧のとおり、関数には「if」ステートメントによって区別される 2 つの異なる動作があります。配列を渡すと、配列ではなく文字列のペアを順番に渡す 2 番目の動作がアクティブになり、最初の動作がトリガーされます。

私の考えでは、この機能は適切に機能していません。同じ感覚になった人いますか?まだテストしていませんが、キー/値を置き換えるという意味で「クリーニング」していないようですが、クリーニングされていないバージョンに沿ってクリーニングされたバージョンが追加されます。

于 2012-05-25T07:27:57.823 に答える