2012-05-12 29 views
3

我做了一個話題關於設法以前使用數組索引作爲變量名,並獲得我感興趣here一個答案。評估和數組索引作爲變量

答案之一建議使用eval(),雖然沒有推薦,由於其潛在的安全問題。

$string = 'welcome["hello"]'; 
eval('$' . $string . " = 'thisworks';"); 

// This also works : eval("$$string = 'thisworks';"); 

// I could then print the array keys value like this 
print($welcome["hello"]); // Prints 'thisworks' 

但是,這種解決方案是最簡單的,並且可能是我想要實現的最合適的解決方案。我實際上在一個WordPress的管理面板上工作,用戶可以設置各種選項。每個選項是通過含有一個多維陣列中,這樣的(僅大得多)的變量設定:

$options = array(
array(
    'id' => 'option_id', // The name of the input field 
    'type' => 'text', // Input type 
    'value' => 'some value here' // Input value 
) 
); 

當用戶保存的選項,功能火災,創建一個數組出所有的各種輸入值的並將它們保存到數據庫中。像下面,雖然高度剝離下來:

foreach ($options as $o) { 
if (isset($_POST[ $o[ 'id' ] ])) { 
    $settings[ $o[ 'id' ] ] = $_POST[ $o[ 'id' ] ]; 
} 
} 

一些從多層面選擇變量的選項,將被保存爲一個陣列的一部分,而不是字符串。這些選項在其ID中包含方括號,如'option_id [value1]'。

這就是事情變得複雜。目前,我不得不通過檢查方括號[]的函數發送ID,然後告訴save函數如何處理它(保存爲數組或字符串)。

這就是爲什麼EVAL解決方案是理想的。它允許我創建一個已經是數組並且包含索引的變量,而不必使用其他函數來檢測該ID。這嚴重減少了漫長的過程,或者我相信。

所以在本質上,是有一個更安全,類似的方法可以讓我去使用eval,或者使用替代功能。以上述方式使用eval有什麼危險?惡意代碼可以在上面使用的上下文中執行嗎?在$之前肯定執行代碼會導致PHP錯誤?

+2

在評估'eval'的潛在危險時注意字符串的來源是很重要的。由於字符串是用戶生成的(你沒有100%的控制權),eval是不可能的。 –

+0

我最近碰到這個問題,試圖通過閱讀'php:// input'解析括號的關鍵字來修復'$ _POST'數據,這樣我就可以創建數組(PHP會做一些[奇怪的事情]( http://www.php.net/manual/en/language.variables.external.php#81080)到某些輸入鍵)。 –

+0

你應該詳細說明整個「將一些保存爲一個數組,另存爲一個字符串的東西」。目前還不清楚你在做什麼。充分豐富實例。 – goat

回答

3

以這種方式使用的eval似乎是一個黑客對我來說,是不可能高性能。爲什麼不使用變量來實現同樣的目標呢?

$string = 'welcome'; 
$key = "hello"; 

${$string}[$key] = "this works better"; 
print($welcome["hello"]); // Prints 'this works better'