<?
if (!$cookie)
{
//посылаем заголовок переадресации на страницу,
//с которой будет предпринята попытка установить cookie
header(“Location: $PHP_SELF?cookie=l”);
// устанавливаем cookie с именем «test»
setcookie(“test”,”1”);
}
else
{
if (!$test)
{
echo(«Для корректной работы приложения необходимо включить cookies»);
}
else
{
//cookie включены, переходим на нужную страницу
header(“Location: http://localhost/testl.php “);
}
}
?>
Функцию setcookie () всего лишь посылает в браузер пользователя cookie с указанным именем и значением.
2.5. Обработка списков с множественным выбором
В списках множественного выбора можно выбрать не одно, а сразу несколько значений. Чтобы сделать список с множественным выбором, необходимо для тега SELECT указать атрибут multiple:
<select name=month2 multiple>
<option value=01>Январь</option>
<option value=02>Февраль</option>
<option value=03>Mapт</option>
<option value=04>Апрель</option>
<option value=05>Maй</option>
<option value=06>Июнь</option>
<option value=07>Июль</option>
<option value=08>Август</option>
<option value=09>Ceнтябрь</option>
<option value=10>Oктябрь</option>
<option value=11>Hоябрь</option>
<option value=12>Декабрь</option>
</select>
После отправки формы параметры передаются так: name=value1&name=value2&name=value3...
Переменная $name = month2 будет содержать только последнее значение (value N).
Пусть выбрали Maй и Август. Тогда после отправки формы сценарию придет строка параметров month2 = Maй&month2 = Август, и в переменной $_REQUEST ['month2'] окажется, конечно, только Август.
Первый пункт (Maй) потерялся. Для решения подобных проблем в РНР предусмотрена возможность давать имена полям формы в виде «массива с индексами» month2[](квадратные скобки - это признак массива.):
<select name=”month2[]”multiple>
<option value=01>Январь</option>
<option value=02>Февраль</option>
<option value=03>Mapт</option>
<option value=04>Апрель</option>
<option value=05>Maй</option>
<option value=06>Июнь</option>
<option value=07>Июль</option>
<option value=08>Август</option>
<option value=09>Ceнтябрь</option>
<option value=10>Oктябрь</option>
<option value=11>Hоябрь</option>
<option value=12>Декабрь</option>
</select>
Теперь сценарию придет строка month2[]= Maй&month2[]= Август.
Интерпретатор обнаружит, что мы хотим создать «автомассив», т. е. массив, который не содержит пропусков и у которого индексация начинается с нуля. Интерпретатор создаст запись $_REQUEST ['month2'] типа «массив», содержимое которого следующее: array (0=>»Maй «, l=>» Август «). Как мы видим, в результате ничего не пропало — данные только слегка видоизменились.
В результате мы получим в $_REQUEST массив массивов (или двумерный массив, как его еще называют).
Таким образом, множественный список преобразован в массив. Массив представляет собой индексированную совокупность переменных одного типа. Каждая переменная или элемент массива имеет свой индекс, т.е. все элементы массива последовательно пронумерованы.
Обход массива в цикле организуют (обрабатывают его элементы) с помощью цикла foreach. Принцип работы этого цикла прост: при проходе каждого элемента массива в переменную $key помещается индекс этого элемента, а в переменную $value – его значение.
Нам даже не нужно знать количество переданных элементов списка. Предварительно лишь нужно сообщить РНР, что мы будем передавать массив:
<select name”month2[]”size=4 multiple>
Напомним, что квадратные скобки — это признак массива.
Обрабатываетсямассивтак:
foreach($month2 as $key=>$value)
echo “$key = $value <br>”;
Листинг month2.html. Форма списка с множественным выбором
<html>
<head>
<title>Обработка списка с множественным выбором</title>
</head>
<body>
<form action=hello2.php>
<select name=”month2[]” size=4 multiple>
<option value=01>Январь</option>
<option value=02>Февраль</option>
<option value=03>Mapт</option>
<option value=04>Апрель</option>
<option value=05>Maй</option>
<option value=06>Июнь</option>
<option value=07>Июль</option>
<option value=08>Август</option>
<option value=09>Ceнтябрь</option>
<option value=10>Oктябрь</option>
<option value=11>Hоябрь</option>
<option value=12>Декабрь</option>
</select><br>
<input type=submit vа1ue = “Нажмитекнопку, чтобызапуститьсценарий! «>
</form>
</body>
</html>
Листинг hello2.php. Обработка списка с множественным выбором при включенной директиве register_globals
<?php
echo “<bг><b>Список month2: </b><br>” ;
foreach ($month2 as $key=>$value)
echo “$key = $value <br>”;
?>
В окне браузера форма выглядит следующим образом:
Природа этой ошибки подробно будет рассмотрена в п. 3: «Какой режим выбрать: register_globals = off & on?». Здесь заметим лишь, что мы обратились к переменной $month2 как к глобальной, что требует наличия включенной директивы register_globals=on. Если эта директива отключена (register_globals=off), что настоятельно рекомендуется делать, то нужное значение можно получить через глобальный массив $_REQUEST['month2']. Поэтому сделаем необходимые исправления.
Листинг hello2.php. Обработка списка с множественным выбором при отключенной директиве register_globals
<?php
echo “<bг><b>Список month2: </b><br>” ;
foreach ($_REQUEST[’month2’] as $key=>$value)
echo “$key = $value <br>”;
?>
Прием с автомассивом в поле <seiect multiple> для списка с множественным выбором выглядит довольно элегантно. Однако не стоит думать, что он применим только к этому элементу формы: автомассивы можно применять и в любых других полях. Вот пример, создающий два переключателя (кнопки со значениями вкл/выкл), один элемент ввода строки и одно текстовое (многострочное) поле, причем все данные после запуска сценария, обрабатывающего эту форму, будут представлены в виде одного-единственного автомассива:
Листинг txt.html. Применение автомассивов
<html>
<head>
<title>Применение автомассивов</title>
</head>
<body>
<form action=hello3.php>
<input type=checkbox name=Arr[] value=chl>
<input type=checkbox name=Arr[] value=ch2>
<input type=text name=Arr[] value=”Однострочныйтекст”>
<textarea name=Arr[]>Многострочныйтекст</textarea>
<input type=submit vа1ue = “Нажмитекнопку, чтобызапуститьсценарий! «>
</form>
</body>
</html>
В окне браузера форма выглядит следующим образом:
Листинг hello3.php. Сценарий обработки автомассивов
<?php
echo “<bг><b>Список month3: </b><br>” ;
foreach ($_REQUEST[’Arr’] as $key=>$value)
echo “$key = $value <br>”;
?>
Видно, что РНР совершенно нет никакого дела до того, в каких элементах формы мы используем автомассивы — он в любом случае обрабатывает все одинаково. И это, пожалуй, не только правильно, но и удобно.
Рассмотрены почти все возможности РНР по автоматической трансляции данных формы. Напоследок взглянем на еще одно полезное свойство РНР. Пусть имеется такая форма:
Листинг txt1.html. Форма для примера «Обработка массивов»
<html>
<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 полей формы, наоборот, нужно их избегать — так устроен РНР.