Динамически создавать переменные в PHP - PullRequest
1 голос
/ 01 июня 2011

Я хочу создать 1 имя переменной, но частью имени является значение, хранящееся в $i.То же самое для результата GET:

$Site.$i = $_GET['site'.$i]; // Should look something like $Site1 = $GET['site1'];

Пожалуйста, помогите мне понять, как это сделать.

Ответы [ 5 ]

4 голосов
/ 01 июня 2011

Если вам нужен набор связанных переменных, используйте массив:

$site[ $i ] = $_GET['site'.$i];

Еще лучше, ваши параметры GET также могут быть массивом

HTML

<input name="site[foo]" value="bar" />

PHP

$site = $_GET[ "site" ];

print_r( $site );

вывод

$site = array(
  "foo" => "bar"
)

Если вы хотите, чтобы индексы для массива определялисьавтоматически тогда вы можете сделать

<input name="site[]" value="foo" />
<input name="site[]" value="bar" />
<input name="site[]" value="baz" />

и получить $_GET[ "site" ] как

$site = array(
  0 => "foo",
  1 => "bar",
  2 => "baz"
);
2 голосов
/ 01 июня 2011

Прямой ответ на вопрос

Вот как вы можете это сделать.Однако не самая лучшая идея.

$var = "$Site$i";
$$var = $_GET['site'.$i];

Используются переменные переменные .

Альтернатива Поддержание текущей структуры URL

В качестве альтернативы возможно что-то вроде этогоможет работать для вас:

$vars = array();
foreach($_GET as $key => $value) {
    if(0 === strpos($key, 'site')) { // Only grab value if the key is prefaced by the string 'site'
        // You must sanitise the value some way here eg:
        // $value = filter_var($value, FILTER_SANITIZE_STRING);
        $vars[] = $value;
    }
}

См. страницу справки filter_var () для получения дополнительной информации о PHP-фильтрах и очистке / проверке.

Пересмотренная структура URL

Я думаю, что это, вероятно, лучше всего решить, используя массивы HTML в тот момент, когда генерируется ваш URL.Для получения дополнительной информации о массивах HTML см. Справочную страницу PHP .

Это позволит вам получить доступ к вашей информации, например:

$site1 = $_GET['site'][0];
$site2 = $_GET['site'][4];

Это наиболее логичнометод решения этой ситуации.

Обновление также см. @ ответ Мата для получения дополнительной информации по этому вопросу.

1 голос
/ 01 июня 2011

Это плохая идея по нескольким причинам:

  • Вам нужно пройти через $ _GET, чтобы найти все переменные (нет языковой конструкции для сопоставления с образцом)
  • ДинамическийИмена переменных сбивают с толку и могут открыть дыры в безопасности.

Вы обнаружите, что использование массива решит вторую точку, а также облегчит работу с кодом.

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

site1=example&site2=example2&sitecount=2

Таким образом, вы знаете, что вам нужно только прочитать site1 и site2, и вам не нужноизучить любые другие переменные GET.

0 голосов
/ 01 июня 2011

Вы можете использовать переменные, как это:

$varname = $Site.$i;
$$varname = $_GET['site'.$i];

Однако делать это не рекомендуется, потому что это огромный риск для безопасности.Вы можете написать классы с полями, представляющими ваши значения из $_GET и проверяющими их внутри класса.

0 голосов
/ 01 июня 2011

вы используете $ как $ _GLOBAL вот так.

${'Site' . $i} = $_GET['site' . $i];

или вы можете использовать экстракт

пожалуйста, прочитайте предупреждения об извлечении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...