PHP:extract($\u POST)然后get\u defined\u vars()不返回任何内容。。。。为什么?

PHP:extract($\u POST)然后get\u defined\u vars()不返回任何内容。。。。为什么?,php,post,extract,Php,Post,Extract,我有以下PHP脚本: <?php function dump_extracted_post() { extract($_POST); var_dump(get_defined_vars()); } dump_extracted_post(); ?> 为什么我看不到发布的数据? 在我对extract()或get_defined_vars()的理解中,有没有遗漏什么?是否有某种安全设置可能会干扰从$\u POST提取 我知道解压缩的本质令人不快,所以这可能

我有以下PHP脚本:

<?php 
  function dump_extracted_post() {
    extract($_POST);
    var_dump(get_defined_vars());
  }
  dump_extracted_post();
?>
为什么我看不到发布的数据?

在我对extract()或get_defined_vars()的理解中,有没有遗漏什么?是否有某种安全设置可能会干扰从$\u POST提取

我知道解压缩的本质令人不快,所以这可能是一个安全问题,但扫描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();
?>

我无法复制该问题(它在我的机器上正常工作),因此可能是您插入的键/值有问题。 这可能很乏味,但您应该测试每个POST参数。我的建议是:

(1) 尝试使用测试阵列(如您所述,这应该可以工作)

(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)失败,则表示您的$\u帖子中有问题

通过逐个插入POST参数来测试结果, 你会遇到失败的情况

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参数,
您可以解决它(或者用一个新问题返回stackoverflow)。

您原来的函数对我来说很好。我使用以下脚本(名为
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
对。因此,您的
$\u POST
中的键可能不是有效的标识符,或者与现有变量冲突。

您的函数在我的本地主机上运行良好。您是否已检查服务器上是否禁用了
extract()
?是的,它已启用且正在工作:
extract(数组('a'=>b');var_dump(get_defined_vars())按我的预期工作。。。(只是当我用$\u POST替换数组时没有)。运行PHP5.3.2。您的原始函数对我来说也很好。您可以显示您的HTML表单吗?谢谢,是的,字段中包含连字符。extract()使用的一个好方法是EXTR_SKIP,就像这个extract($\u POST,EXTR_SKIP);-它将避免用户通过url更改变量,如_SERVER[HTTP_user_AGENT]
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();
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();
<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>