<head>
<title>Обработка массивов</title>
</head>
<body>
<form action=hello4.php>
Имя: <input type=text name=Data[name]><br>
Адрес: <input type=text name=Data[address]><br>
Город: <br>
<input type=radio name=Data[city] value=Newomoscow>Новомocковск<br>
<input type=radio name=Data[city] value=Kiev>Kиев<br>
<input type=submit vа1ue = “Нажмите кнопку, чтобы запустить сценарий! «>
</form>
</body>
</html>
В окне браузера форма выглядит следующим образом:
После передачи подобных данных сценарию на РНР в нем будет инициализирован ассоциативный массив $Data с ключами name, address и city. То есть, имена полям формы можно давать не только простые, но и представленные в виде одномерных ассоциативных массивов.
В сценарии к отдельным элементам формы можно обратиться при помощи указания ключа массива: например, $_REQUEST ['Data'] ['city'] обозначает значение той радиокнопки, которая была выбрана пользователем, а $_REQUEST ['Data'] ['name'] -- введенное имя.
Предупреждение. В сценарии обязательно нужно заключать ключи в кавычки или апострофы. В противном случае интерпретатором будет выведено предупреждение. В то же время, в параметрах name полей формы, наоборот, нужно их избегать -- так устроен РНР.
Напишем сценарий.
Листинг hello4.php. Сценарий для обработки массива
<?php
echo “<bг><b>Список month4 </b><br>” ;
foreach ($_REQUEST['Data'] as $key=>$value)
echo “$key = $value <br>”;
?>
2.7. Особенности обработки независимых переключателей
Рассмотрим вопрос, который находит частое практическое применение в Web-программировании. Независимый переключатель (checkbox или более коротко -- флажок) имеет одну довольно неприятную особенность, которая иногда может помешать Web-программисту. Если перед отправкой формы пользователь установил независимый переключатель в выбранное состояние, то сценарию в числе других параметров приходит пара имя_флажка=значение. В то же время, если флажок не был установлен пользователем, указанная пара не посылается.
Для упрощения обработки, хотелось бы, чтобы в невыбранном состоянии флажок также присылал данные, но только значение было равно какой-нибудь специальной величине -- например, нулю или пустой строке.
Добиться этого эффекта в РНР довольно несложно. Достаточно воспользоваться одноименным скрытым полем (hidden) со значением, равным, например, нулю, поместив его перед нужным флажком.
Листинг checkbox.php. Особенности обработки независимых переключателей
<?php # # Гарантированный прием значений от флажков.
if (@$_REQUEST['doGo'] )
{
foreach (@$_REQUEST ['known'] as $k=>$v)
if($v) echo «Вы знаете язык $k!<br>»;
else echo «Вы не знаете языка $k. <br>»;
}
<form action=”<?=$_SERVER['SCRIPT_NAME']?>” method=post>
Какие языки программирования вы знаете?<br>
<input type=hidden name=”known[PHP]” value=”0”>
<input type=checkbox name=”known[PHP]” value=”l”>PHP<br>
<input type=hidden name=”known[Perl] “ value=”0”>
<input type=checkbox name=”known[Perl]” value=”l”>Perl<br>
<input type=submit name=”doGo” value=”Go!”>
Инструкция foreach предназначена для перебора всех элементов массива, указанного в ее первом аргументе.
Теперь в случае, если пользователь не выберет никакой из флажков, браузер отправит сценарию пару known [язык] = 0, сгенерированную соответствующим скрытым полем, и в массиве $_request [' known'] создастся соответствующий элемент:
Если пользователь выберет флажок, эта пара также будет послана, но сразу же после нее последует пара known [язык] =1, которая «перекроет» предыдущее значение:
Если бы не были включены скрытые поля в форму, сценарий печатал бы только сообщения о тех языках, которые «знает пользователь», пропуская языки, ему «неизвестные». В рассмотренном случае сценарий реагирует и на сброшенные флажки.
Такой способ немного увеличивает объем данных, передаваемых методом post, за счет тех самых пар, которые генерируются скрытыми полями. Впрочем, в реальной жизни это «увеличение» практически незаметно (особенно для POST-форм).
2.8. Диагностика создаваемых массивов
Напомним, какие массивы создает РНР, когда обрабатывает данные, пришедшие из формы:
? $_GET -- содержит GET-параметры, пришедшие скрипту через переменную окружения QUERY_STRING. Например, $_GET [' login'];
? $_post -- данные формы, пришедшие методом post;
? $_cookie -- все cookies, которые прислал браузер;
? $_REQUEST -- объединение трех перечисленных выше массивов.
Именно переменную $_REQUEST рекомендуется использовать в скриптах, потому что таким образом мы не «привязываемся» жестко к типу принимаемых данных (get или post);
? $_server -- содержит переменные окружения, переданные сервером (отсюда и название).
Может показаться, что это много. Чтобы не запутаться в переменных, рассмотрим полезный прием, помогающий при отладке сценариев: можно вывести все переменные в браузер.
Листинг dump.php. Вывод всех переменных в браузер
<! - - Выводит все глобальные переменные - ->
<pre>
<?print_r($GLOBALS)?>
</pre>
Задача данного сценария -- распечатать в браузер все глобальные переменные программы (включая описанные выше массивы) в читабельном представлении. Глобальные переменные доступны через используемый массив $GLOBALS. Встроенная функция print_r() делает все остальное.
Страница, генерируемая данным сценарием, весьма интересна. Рекомендуем поэкспериментировать с ней, передавая программе различные GET-данные (включая многомерные массивы) и подставляя ее в атрибут action различных HTML-форм.
3. КАКОЙ РЕЖИМ ВЫБРАТЬ: register_globals=off & on ?
В рассмотренных примерах каждый раз при обращении к переменным, полученным из полей формы, писали:
$_REQUEST[' … ']
Это делать необходимо из-за того, что все данные из полей формы PHP помещает в глобальный массив $_REQUEST.
В ранних версиях РНР (вплоть до РНР 4.1) существовал способ, позволяющий работать с полями формы значительно проще. По умолчанию РНР не помещал данные в $_REQUEST, а создавал обыкновенные глобальные переменные для каждого из полей формы. Например, можно было написать такой сценарий:
<!- - Вывод параметров командной строки. - ->
echo”Hello, $name!”;
Запустив его с нужным параметром, например: http://localhost/hello.php?name=Виктор Сергеевич, можно увидеть корректную страницу приветствия: РНР создал глобальную переменную $name, значение которой и напечатано:
Такой режим работы называется register_globals и поддерживается в РНР по сей день. При этом в файле php.ini этот параметр находится во включенном состоянии:
Однако, начиная с PHP 4.2.0, register_globals по умолчанию выключен в файле php.ini:
Разработчики РНР поступили так по соображениям безопасности: часто скрипты, написанные в расчете на включенный register_globals, обнаруживали проблемы с защитой.
Внимание
Начиная с PHP 4.2.0, значение директивы register_globals по умолчанию установлено в off (отключено, раньше было on - включено). Положение register_globals в off делает предопределенные переменные доступными в глобальной области видимости.
Например, чтобы получить:
? $DOCUMENT_ROOT, вам необходимо будет использовать $_SERVER['DOCUMENT_ROOT'] вместо $DOCUMENT_ROOT;
? $_GET['id'] из URL http://www.example.com/test.php?id=3 вместо $id;
? $_ENV['HOME'] вместо $HOME.
Использование доступных зарезервированных предопределенных переменных PHP, таких как суперглобальные массивы, является предпочтительным.
Предупреждение!
В PHP 4.2.0 и позднее, набор по умолчанию предопределённых переменных, доступных в глобальной области видимости, изменён. Отдельные переменные ввода и сервера по умолчанию больше не размещаются непосредственно в глобальной области видимости; они размещаются в суперглобальных массивах.
Вы можете форсировать старое поведение, установив register_globals в 'On' в вашем файле php.ini.
Суперглобальные переменные PHP
$GLOBALS
Содержит ссылку на каждую переменную, доступную в данный момент в глобальной области видимости скрипта. Ключами этого массива являются имена глобальных переменных. $GLOBALS существует, начиная с PHP 3.
$_SERVER
Переменные, установленные web-сервером либо напрямую связанные с окружением выполнения текущего скрипта. Аналог старого массива $HTTP_SERVER_VARS (который по-прежнему доступен, но не рекомендуется).
$_GET
Переменные, передаваемые скрипту через HTTP GET. Аналог старого массива $HTTP_GET_VARS (который по-прежнему доступен, но не рекомендуется).
$_POST
Переменные, передаваемые скрипту через HTTP POST. Аналог старого массива $HTTP_POST_VARS (который по-прежнему доступен, но не рекомендуется).
$_COOKIE
Переменные, передаваемые скрипту через HTTP cookies. Аналог старого массива $HTTP_COOKIE_VARS (который по-прежнему доступен, но не рекомендуется).
$_FILES
Переменные, передаваемые скрипту через HTTP post-загрузку файлов. Аналог старого массива $HTTP_POST_FILES (который по-прежнему доступен, но не рекомендуется). Для дополнительной информации смотрите Загрузка методом POST.
$_ENV
Переменные, передаваемые скрипту через окружение. Аналог старого массива $HTTP_ENV_VARS (который по-прежнему доступен, но не рекомендуется).
$_REQUEST
Переменные, передаваемые скрипту через механизмы ввода GET, POST и COOKIE, и которым, следовательно, нельзя доверять. Наличие и порядок включения переменных в этот массив определяется в соответствии с директивой конфигурации PHP variables_order. Этот массив не имеет прямых аналогов в версиях PHP до 4.1.0
Страницы: 1, 2, 3, 4, 5, 6, 7, 8