2012-05-12 9 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を送信する必要があります。

これは、evalソリューションが理想的な理由です。これは、すでに配列の変数を作成し、そのIDをdisectするために他の関数を使う必要なくインデックスを含んでいます。それはひどく長いプロセスを減らすか、あるいは私は信じています。

したがって、本質的に、私がevalを使用したり、代替機能を使用したりするより安全な方法があります。上記の方法でevalを使用することの危険性は何ですか?上記のコンテキストで悪質なコードを実行することはできますか? $の前に確実にコードを実行すると、PHPエラーが発生するでしょうか?

+2

「評価」の潜在的な危険性を評価する際には、文字列のソースに注意することが重要です。文字列はユーザ​​が生成しているので(あなたはそれらを100%制御できません)、evalは問題になりません。 –

+0

私は配列を作ることができるように(PHPはいくつかの[奇妙なことをします({{{{{{{{{{{{}}})、php:// input'を読み込んで角括弧のキーを解析して '$ _POST'データを" 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' 
関連する問題