2013-03-06 16 views
0

我有以下的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" 
} 
+1

你的函數在我的本地主機上正常工作。你是否檢查過你的服務器上是否禁用了'extract()'? – Sean 2013-03-06 03:34:16

+0

是的,它已啓用並正在運行:'extract(array('a'=>'b')); var_dump(get_defined_vars());'按我期望的那樣工作...(只是當我用$ _POST替換數組時)。運行PHP 5.3.2。 – MikeL 2013-03-06 03:50:32

+1

您的原始功能對我來說也適用。您能否請您展示您的HTML表單? – 2013-03-06 06:27:13

回答

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中的密鑰可能不是有效的標識符,或者與現有變量混淆。

+0

啊,當然...我的後期變量包含連字符。天才! – MikeL 2013-03-06 08:10:49

+0

與extract()一起使用的一個好處是EXTR_SKIP,就像這個提取($ _ POST,EXTR_SKIP); - 它將避免用戶通過url更改像_SERVER [HTTP_USER_AGENT]這樣的變量 – meurer 2014-10-09 18:32:42

0

我無法複製的問題(它工作正常我的機器上),所以MAYBE它可能是您插入的鍵/值的問題。 這可能很乏味,但你應該測試每個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參數,這將導致提取失敗, 你可以解決它(或復出新問題計算器)。

+0

謝謝,是的,這些字段包含連字符。 – MikeL 2013-03-06 08:11:36