【问题标题】:PHP: extract($_POST) then get_defined_vars() returns nothing.... why?PHP:extract($_POST) 然后 get_defined_vars() 什么也不返回......为什么?
【发布时间】:2013-03-06 02:38:42
【问题描述】:

我有以下 PHP 脚本:

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

对于这个脚本,我发布了一个包含一些数据的表单,它会产生以下(意外)结果:

Array(0) {
}

为什么我看不到发布的数据?

我对 extract() 或 get_defined_vars() 的理解是否遗漏了什么?是否有某种安全设置可能会干扰从 $_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();
?>

我看到了预期的输出:

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

【问题讨论】:

  • 你的函数在我的本地主机上运行良好。您是否检查过您的服务器上是否禁用了extract()
  • 是的,它已启用并正常工作:extract(array('a'=&gt;'b')); var_dump(get_defined_vars()); 按我的预期工作......(只是当我用 $_POST 替换数组时不是这样)。运行 PHP 5.3.2。
  • 您的原始功能也适用于我。请出示您的 HTML 表单好吗?

标签: php post extract


【解决方案1】:

您的原始功能对我来说很好用。我使用以下脚本(名为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=&gt;value 对。因此,$_POST 中的键可能不是有效的标识符,或者与现有变量冲突。

【讨论】:

  • 与 extract() 一起使用的一个好处是 EXTR_SKIP,就像这样 extract($_POST,EXTR_SKIP); - 它将避免用户通过 url 更改变量,如 _SERVER[HTTP_USER_AGENT]
【解决方案2】:

我无法复制该问题(它在我的机器上正常工作),所以可能是您插入的键/值有问题。 这可能很乏味,但您应该测试每个 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 参数来测试您的结果, 你应该会遇到失败的地方。

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)。

【讨论】:

  • 谢谢,是的,这些字段包含连字符。
猜你喜欢
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多