2

PHPの参照(&)に奇妙な問題があります。

次のようなフォームがあるとします。

<form name="form1" id="form1" method="post">
   Name: <input type="text" name="name" /><br />
   Email: <input type="text" name="email" /><br />
   Location: <input type="text" name="location" /><br />
   Phone Number: <input type="text" name="phonenumber" /><br />
</form>

次に、そのフォームを別のPHPハンドラーに送信します。そして、ハンドラーはこれを行います:

foreach($_POST as $name => &$value)
{
    //more code here
}
echo $_POST['phonenumber']; //Returns value of $_POST['location'] for some reason

電話番号の値がどこにあるのかという値になる理由を誰かが私に説明できますか?foreach内にコードがない場合でも、これを実行します。

編集:

foreach内で何が起こっているのか、なぜ私がこれを行っているのか疑問に思っている人にとっては、ハンドラーに送信されたすべてのデータを手動で一度に1つの変数で実行するのではなく、エスケープするためのクリーンな方法であるためです。動的入力が入ってくるので、次のようになります。

foreach($_POST as $name => &$value)
{
    $value = preg_replace( "/[<>#$%]/", "", $value);
    $value = preg_replace('/\s\s+/', ' ', $value);
}

私が上で述べた問題を除いて、それは美しく働きます。

4

3 に答える 3

3

1 回は参照あり、もう 1 回は参照なしで、おそらく 2 回反復していますか? それは大きな違いを生みます:

$array = [1, 2];

foreach($array as &$value);
echo implode(',', $array); # 1, 2

foreach($array as $value);
echo implode(',', $array); # 1, 1

そして、これがデモです。修正は、ループ間で設定$valueを解除することです:

$array = [1, 2];

foreach($array as &$value);
echo implode(',', $array); # 1, 2
unset($value);

foreach($array as $value);
echo implode(',', $array); # 1, 2
于 2012-08-26T00:53:35.367 に答える
1

foreachループ内の参照による値に混乱していると確信しています。使用してはいけないもう1つの理由。本当に必要だと思うなら、少なくともループunset()の後に。valueこの例を確認してください: http://codepad.viper-7.com/VCOI2O& (最初のダンプの at phonenumber に注意してください。まだ参照されています)。

しかし、参照によって行うことを再考する必要があると真剣に考えています。代わりに、ループで必要なアイテムにアクセスするだけです:

foreach($_POST as $name => $value)
{
    // do with the value what you want
    $_POST[$name] = $value;
}

$_POSTただし、スーパーグローバルをまったく変更しない方がよいでしょう。後でアクセスしようとして何かが変更されたときに、他の人や自分自身を混乱させるだけです.

于 2012-08-26T00:33:13.433 に答える
0

変数を再割り当てしている$value場合、これが発生する可能性があります。たとえば、この場合、(電話番号の) 最後の反復は場所の値と等しくなります。これは、&割り当てた場合に値が更新されることを意味するためです。

<?php

$i = 0;

foreach($_POST as $name => &$value) {
    if ($i > 2) {
        $value = $temp;
    }
    $i++;

    $temp = $value;
    echo $value;
}

?>
于 2012-08-26T00:32:59.980 に答える