Как оценить строку PHP как переменную? - PullRequest
0 голосов
/ 15 августа 2010

У меня есть переменная с именем $data["main_deal"], которая имеет значение $xml->deals->deal[0] (в виде строки).$ xml - это объект simpleXML, а значение main_deal - это селектор, необходимый для доступа к нужным данным.

Когда я пытался echo "<p><b>Main Deal:</b> ".$data["main_deal"];, он выводил: Main Deal: $ xml-> deal-> deal [0]

Так что я вернулся к тому, где дал $data["main_deal"] его значение, и добавил eval ().Вывод теперь пустой.Когда я вызываю $data["main_deal"], я хочу, чтобы он вывел значение $xml->deals->deal[0], а не "$ xml-> deal-> deal [0]".Как мне это сделать?

РЕДАКТИРОВАТЬ: Вот код, который я использую для загрузки $ data:

foreach($vars as $var) {
$data[$var] = $devOptions[$var];
}

$ devOptions [$ var] содержит строкунапример, "$ xml-> deal-> deal [0]".

Ответы [ 2 ]

1 голос
/ 16 августа 2010

Имейте в виду, что использование eval опасно до безумия.Что если кто-то каким-то образом установит $data['main_deal'] в exec("rm -rf .") или mysql_query('drop table users').Вы должны быть абсолютно уверены, что эту строку нельзя никоим образом испортить, чтобы это было безопасно.Это нетривиально, так как большинство фильтров направлены на предотвращение внедрения XSS, а не на этот тип атаки.

Я не хочу быть придурком, я понимаю, что вы просто пытаетесь выполнить работу, но я не думаю, что это может быть достаточно подчеркнуто.


Я заметил в комментариях, которые вы задали вопрос:

Имеет ли это смысл, или есть лучший способ сделать это?

Есть хороший шанс, что есть лучший способ сделать это, но, не зная больше о вашем XML и о том, что нужно вашим пользователям, трудно сказать.Вы сказали, что пример выбора может быть $xml->deals->deal[0].Нужно ли пользователям выбирать индекс этой сделки?Например, не могли бы вы позволить им выбрать из выпадающего списка, какую сделку выбрать?Тогда вы можете просто сохранить целое число, которое они хотят, и доступ к этим данным будет гораздо безопаснее и проще для загрузки.

Если им нужен больший контроль, чем это, возможно, вы могли бы дать им несколько выпадающих списков, чтобы помочь им построить«путь» к нужному элементу.Например:

[ Element 1 (v)]  [ Element 2 (v)] [ Field (v)]
 | Deals       |   | Deal        |  | 0       |
 | Steals      |   | Steal       |  | 1       |
 | Wheels      |   | Wheel       |  |_________|
 |_____________|   |_____________|

Тогда в вашем коде

 $array_of_valid_element1 = array ('Deals', 'Steals', 'Wheels');

 if(
    in_array($_POST['element1'], $array_of_valid_element1)
    &&
    in_array($_POST['element2'], $array_of_valid_element2)
    &&
    in_array($_POST['element3'], $array_of_valid_element3)
 )
 {
     echo $xml->$_POST['element1']->$_POST['element2'][$_POST['element3'];
 }

Вы можете увидеть, откуда приходит дополнительная проверка!Проверяя каждый элемент, вы убедитесь, что пользователь делает только то, что ему разрешено делать явно.

Я надеюсь, что это даст вам некоторые идеи или поможет вам пересмотреть, выбираете ли вы лучший подход.Не стесняйтесь задавать другой вопрос, если вы хотите получить дополнительную информацию по этому вопросу.Это не просто, но вот что делает его забавным!

1 голос
/ 16 августа 2010
eval('return '.$data['main_deal'].';');
...