1

キー名が送信された投稿データを参照する空の連想配列を作成しました。postdata は問題なくキャプチャできますが、名前が配列キーと一致する変数をインスタンス化しようとすると問題が発生します。

例えば:

$insArray = array('rUsername'=>'', 'rPass'=>'', 'rQuestion'=>'', 'rAnswer'=>'', 'rFName'=>'', 'rLName'=>'', 'rBDateD'=>'', 'rBDateM'=>'', 'rBDateY'=>'', 'rHCheck'=>'', 'rHCeckOption'=>'', 'rEmail'=>'');

foreach($insArray as $key=>$value){
    if (filter_input(INPUT_POST, $key) != ''){
        $key = stripslashes(filter_input(INPUT_POST, $key)); 
        $insArray[$key] = $key;
    }       
}

最初の行は空の配列を作成し、次に foreach はこの配列をループします。今、それはトリッキーになります。

filter_input(INPUT_POST, $key)現在のキー (この場合は rUsername) に一致する投稿データにある値を取得します

$key問題があるところです。新しい変数の NAME を連想キー名にしたいのです。たとえば、最初の反復で $key を $rUsername に置き換え、2 回目の反復で $rPass に置き換えたいなどです。2 つの $$ を使用してみましたが、それが正しくないことはわかっています。これまでにこれを試したことはありませんでしたが、理解できれば助かります。

アップデート:

これは、提供された 2 つの回答を組み合わせた最終的なコードです。

if (isset($_POST['submit'])) {
    //Build array of variables to be put into database
    $insArray = array('rUsername'=>'', 'rPassword'=>'', 'rQuestion'=>'', 'rAnswer'=>'', 'rFName'=>'', 'rLName'=>'', 'rBDateD'=>'', 'rBDateM'=>'', 'rBDateY'=>'', 'rHCheck'=>'', 'rHCheckOption'=>'', 'rEmail'=>'');

    foreach(array_keys($insArray) as $key){
        $insArray[$key] = filter_input(INPUT_POST, $key);
        $$key = filter_input(INPUT_POST, $key);
    }
}

まさに私が望んでいた出力が得られました、ありがとう!

4

4 に答える 4

2

$ _POSTにまったくアクセスしていないので、自分で定義した配列メンバーを取得し、それらを有害なPOST文字でフィルタリングして(なぜ独自のコードを挿入しようとするのですか?)、から新しい配列を作成するだけです。それらの自己定義のキー値。

私があなたが望むものを正しく推測しているなら、それはこれであるはずです:

foreach(array_keys($insArray) as $key) {
    $insArray[$key] = stripslashes(filter_input(INPUT_POST, $_POST[$key]));
}

ストリップスラッシュの使用は、magic_quotesが有効になっているブレインデッドバージョンのPHPを使用していることを示しています。PHPの最新バージョンにアップグレードするか、オフにする必要があります。

于 2012-05-06T04:44:56.530 に答える
1

私があなたを正しく理解しているなら、私はこのアプローチを提案するつもりです:

$defaultValues = array('rUsername'=>'', 'rPass'=>'', 'rQuestion'=>'', 'rAnswer'=>'', 'rFName'=>'', 'rLName'=>'', 'rBDateD'=>'', 'rBDateM'=>'', 'rBDateY'=>'', 'rHCheck'=>'', 'rHCeckOption'=>'', 'rEmail'=>'');
$values = array_map('stripslashes', array_merge($defaultValues, array_filter($_POST)));
extract($values, EXTR_SKIP);
echo $rUsername;
echo $rPass;
.........

上記のスニペットを使用する場合は、次のことを考慮する必要があります

  • EXTR_SKIPでextract関数を使用しているので、既存の変数を上書きしないでください。コードで必要な変数のみを使用し、それらを適切にサニタイズするようにしてください。

  • $ _POSTスーパーグローバルimでarray_filterを使用することにより、すべての空またはnull変数を「消去」します。したがって、予期されたキーが$ _POSTを介して送信されなかった場合、デフォルトで$defaultValues配列で指定された値になります。

  • 3番目のパラメーター(フィルター定数)なしでfilter_inputを使用している理由がよくわかりません。

于 2012-05-06T06:45:10.957 に答える
1

解決策は変化です

$key = stripslashes(filter_input(INPUT_POST, $key));

$$key = stripslashes(filter_input(INPUT_POST, $key));

http://www.php.net/manual/en/language.variables.variable.phpを参照してください

また、いくつかの間違いをしているコードを再確認してください。

于 2012-05-06T04:45:19.573 に答える
0

これが役立つことを願っています。そうでない場合は、問題を誤解しています。

それ以外の

$key = stripslashes(filter_input(INPUT_POST, $key)); 
$insArray[$key] = $key;

試す

$insArray[$key] =stripslashes(filter_input(INPUT_POST, $key));

次に、 foreach ループの後

extract($insArray);
于 2012-05-06T04:49:32.390 に答える