我有以下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"
}
答案 0 :(得分: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=>value
对。因此,$_POST
中的密钥可能不是有效的标识符,也不会与现有变量混淆。
答案 1 :(得分: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参数测试结果, 你应该遇到失败的地方。
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)。