1

私は次のPHPスクリプトを持っています:

<?php 
  function dump_extracted_post() {
    extract($_POST);
    var_dump(get_defined_vars());
  }
  dump_extracted_post();
?>

このスクリプトに、いくつかのデータを含むフォームを投稿すると、次の(予期しない)結果が生成されます。

Array(0) {
}

投稿されたデータが表示されないのはなぜですか?

extract()またはget_defined_vars()の理解に欠けているものはありますか?$ _POSTからの抽出を妨げる可能性のあるセキュリティ設定はありますか?

私はextractの性質に眉をひそめていることを知っているので、おそらくそれはセキュリティの問題ですが、phpドキュメントをスキャンしてもそのような問題については言及されていないようです。これを使用して、簡単なテンプレートを作成したいと思います。

スクリプトを次のように変更した場合:

<?php 
  function dump_extracted_post() {
    var_dump($_POST);
  }
  dump_extracted_post();
?>

投稿されたデータは期待どおりに表示されます(そうです、間違いなくデータを投稿しています)。

同様に、スクリプトを次のように変更すると、次のようになります。

<?php 
  function dump_extracted_post() {
    $a = 'moocows';
    var_dump(get_defined_vars());
  }
  dump_extracted_post();
?>

期待される出力が表示されます。

array(1) {
  ["a"]=>
  string(7) "moocows"
}
4

2 に答える 2

3

あなたの元の機能は私にとってはうまく機能します。extract.phpテストには次のスクリプト(名前付き)を使用しました。

<form method="post" aciton="extract.php">
  <input type="text" name="foo" />
  <input type="submit" />
</form>
<pre>
<?php
  function dump_extracted_post() {
    extract($_POST);
    var_dump(get_defined_vars());
  }
  dump_extracted_post();
?>
</pre>

関数は、キーが既存の変数と競合しない有効な識別子であるペアextractのみを抽出します。key=>valueしたがって、おそらくあなたのキーは$_POST有効な識別子ではないか、既存の変数と競合しています。

于 2013-03-06T06:32:08.473 に答える
0

問題を再現できなかったため(私のマシンでは正常に機能しました)、挿入しているキー/値に問題がある可能性があります。面倒かもしれませんが、各POSTパラメーターをテストする必要があります。これは私の提案です:

(1)テストアレイで試してください(あなたが述べたように、これは機能するはずです)

function dump_extracted_post() {
    $postParams = array('testkey' => 'testval');

    extract($postParams);
    var_dump(get_defined_vars());
}
dump_extracted_post();

(2)すべてのPOSTキー/値をその配列に入れて、再試行してください

function dump_extracted_post() {
    $postParams = array('testkey' => 'testval');
    foreach ($_POST as $k=>$v) {
        $postParams[$k] = $v;
    }

    extract($postParams);
    var_dump(get_defined_vars());
}
dump_extracted_post();

(2)が失敗した場合は、$_POSTの何かが問題を引き起こしていることを意味します。

POSTパラメーターを1つずつ挿入して結果をテストすると、失敗するポイントに遭遇するはずです。

function dump_extracted_post() {
    $postParams = array('testkey' => 'testval');
    $i=1;
    foreach ($_POST as $k=>$v) {
        if ($i > 1) break;  // increment this value each time, and see where the extract fails
        $postParams[$k] = $v;
        $i++;
    }

    extract($postParams);
    var_dump(get_defined_vars());
}
dump_extracted_post();

抽出が失敗する原因となるPOSTパラメーターが正常に検出された場合は、それを解決できます(または、新しい質問でスタックオーバーフローに戻ります)。

于 2013-03-06T06:21:42.357 に答える