2012-05-06 31 views
1

我已經構建了一個空的關聯數組,它的鍵名引用了提交的發佈數據。我可以很好地捕獲postdata,但遇到麻煩時嘗試實例化名稱與數組鍵匹配的變量。使用foreach循環來初始化變量

例如:

$insArray = array('rUsername'=>'', 'rPass'=>'', 'rQuestion'=>'', 'rAnswer'=>'', 'rFName'=>'', 'rLName'=>'', 'rBDateD'=>'', 'rBDateM'=>'', 'rBDateY'=>'', 'rHCheck'=>'', 'rHCeckOption'=>'', 'rEmail'=>''); 

foreach($insArray as $key=>$value){ 
    if (filter_input(INPUT_POST, $key) != ''){ 
     $key = stripslashes(filter_input(INPUT_POST, $key)); 
     $insArray[$key] = $key; 
    }  
} 

第一行創建的空數組,然後在foreach通過此數組環路。現在變得棘手。

filter_input(INPUT_POST, $key)捕獲位於後數據匹配當前鍵,rUsername在這種情況下

$key是問題所在的值。我希望新變量的名稱是關聯鍵名,例如我想在第一次迭代中用$ rUsername替換$ key,在第二次中用$ rPass替換,等等。我嘗試使用兩個$$,但我知道這是不對的。以前從來沒有嘗試過這樣做,但如果我能弄清楚它會有所幫助。

UPDATE:

這是最後的代碼是兩個提供的答覆的組合。

if (isset($_POST['submit'])) { 
    //Build array of variables to be put into database 
    $insArray = array('rUsername'=>'', 'rPassword'=>'', 'rQuestion'=>'', 'rAnswer'=>'', 'rFName'=>'', 'rLName'=>'', 'rBDateD'=>'', 'rBDateM'=>'', 'rBDateY'=>'', 'rHCheck'=>'', 'rHCheckOption'=>'', 'rEmail'=>''); 

    foreach(array_keys($insArray) as $key){ 
     $insArray[$key] = filter_input(INPUT_POST, $key); 
     $$key = filter_input(INPUT_POST, $key); 
    } 
} 

給我完全我想要的輸出,謝謝你們!

+0

那麼什麼是你得到 – Satya

回答

2

根本沒有訪問$ _POST,所以你所做的只是把你自己定義的一些數組成員,過濾掉有害的POST字符(爲什麼你會嘗試注入你自己的代碼?),然後創建來自這些自定義鍵值的新數組。

如果我在你想要的猜測正確的,它應該是這樣的:

foreach(array_keys($insArray) as $key) { 
    $insArray[$key] = stripslashes(filter_input(INPUT_POST, $_POST[$key])); 
} 

的用stripslashes的建議你在PHP的新空房禁地版本,其中有magic_quotes的支持。你應該升級到現代版本的PHP和/或關閉它們。

+0

錯誤,我傷心地在我的託管服務提供商的憐憫這讓我對使用一個驚人的交易,因此,我要綁他們正在使用的PHP版本。至於注入我自己的代碼,我設置了從以前的表單提交中提交的一些字段的數組鍵。而不是手動編碼每個只需要我想要的變量,我初始化一個空數組,其中鍵名與表單中我想要的這個數組的字段名匹配。構建數組,並最終將該數組傳遞給處理函數。也就是說,數組鍵的答案正是我所期待的。再次感謝! – MaurerPower

1

解決的辦法是改變

$key = stripslashes(filter_input(INPUT_POST, $key)); 

$$key = stripslashes(filter_input(INPUT_POST, $key)); 

http://www.php.net/manual/en/language.variables.variable.php

此外,重新檢查代碼,這是做了一些錯誤..

+0

變量變量!我在代碼中使用的另一個項目!可悲的是,不能給出兩個答案,我討厭那個部分! – MaurerPower

0

希望這將有助於如果不是,我可能會誤解這個問題。

而不是

$key = stripslashes(filter_input(INPUT_POST, $key)); 
$insArray[$key] = $key; 

嘗試

$insArray[$key] =stripslashes(filter_input(INPUT_POST, $key)); 

然後foreach循環後

extract($insArray); 
1

如果我理解正確的話,我就要表明這種方法:

$defaultValues = array('rUsername'=>'', 'rPass'=>'', 'rQuestion'=>'', 'rAnswer'=>'', 'rFName'=>'', 'rLName'=>'', 'rBDateD'=>'', 'rBDateM'=>'', 'rBDateY'=>'', 'rHCheck'=>'', 'rHCeckOption'=>'', 'rEmail'=>''); 
$values = array_map('stripslashes', array_merge($defaultValues, array_filter($_POST))); 
extract($values, EXTR_SKIP); 
echo $rUsername; 
echo $rPass; 
......... 

通過使用上面的代碼片段,您可以使用extract功能與EXTR_SKIP所以你不要覆蓋現有的變量要考慮到以下

  • 林。確保只在你的代碼中使用你需要的變量,並適當地對它們進行消毒。

  • 通過在$ _POST超全局即時消息中使用array_filter所有空或空變量。所以如果預期的密鑰不是通過$ _POST發送的,它將默認爲由$ defaultValues數組指定的值。

  • 我不太明白你爲什麼使用filter_input沒有第三個參數(過濾器常量)。

+0

我正在使用filter_input來抓取直接後置堆棧,以確保在提交後沒有任何內容添加到該帖子。雖然過濾器評論是一個很好的建議! – MaurerPower