Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка PHP 2008.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.28 Mб
Скачать

3.2 Трансляция полей формы в переменные

Интерпретатор все данные из полей формы преобразует в глобальные одноименные переменные. Значение поля name после начала работы программы будет храниться в переменной $name, а значение поля age – в переменной $age.

Теперь сделаем так, чтобы при запуске без параметров сценарий выдавал документ с формой, а при нажатии кнопки – выводил нужный текст. Самый простой способ определить, был ли сценарий запущен без параметров – проверить, существует ли переменная с именем, совпадающим с именем кнопки отправки. Если такая переменная существует, то, очевидно, что пользователь запустил программу, нажав на кнопку.

<html>

<body>

<?if(!@$doGo)

{

?>

<form action=”<?=$SCRIPT_NAME?>”>

//<form action=hello.php>

Введите имя:

<input type=text name="name" value="Елена"><br>

Ваш возраст:

<input type=text name="age" value="5"><br>

<input type=submit name="doGo" value="Отправить">

</form>

<?

} else {

?>

Привет!<br>

<?

print "Привет, ".$_GET['name'].

". Вам ".$_GET['age']." лет.";

?>

<?

}

?>

</body>

</html>

Конструкция <?=выражение?> является более коротким обозначением для <?echo(выражение) ?>, и предназначена для того, чтобы вставлять величины прямо в HTML-страницу.

Обратите внимание на полезный прием: в параметре action тэга <form> мы не задали явно имя файла сценария, а извлекли его из переменной SCRIPT_NAME (которая устанавливается автоматически перед запуском сценария). Это позволило нам не "привязываться" к имени файла, т.е. теперь мы можем его в любой момент переименовать без потери функциональности.

Если РНР установлен не как модуль Apache, а как отдельный обработчик, то переменная $SCRIPT_NAME будет содержать не то значение, на которое мы рассчитываем.

К тому же, теперь исчезла необходимость и в промежуточном файле form.html, его код встроен в сам сценарий.

Трансляция переменных окружения и Cookies. В переменные преобразуются не только все данные формы, но и переменные окружения (включая QUERY_STRING, CONTENT_LENGTH и многие другие), а также все Cookies.

Пример сценария, который печатает IP-адрес пользователя, который его запустил, а также тип его браузера (эти данные хранятся в переменных окружения REMOTE_USER и HTTP_USER_AGENT):

<html><body>

Ваш IP-адрес: <?=$REMOTE_USER?><br>

Ваш браузер: <?=$HTTP_USER_AGENT?>

</body></html>

По умолчанию, трансляция выполняется в порядке ENVIRONMENT-GET-POST-COOKIE, причем каждая следующая переменная как бы перекрывает предыдущее свое значение. Например, пусть у нас есть переменная окружения а=10, параметр, поступивший из GET-формы a=20 и Cookie а=30. В этом случае в переменную $а сценария будет записано 30, поскольку Cookie перекрывает GET, a GET перекрывает переменные окружения.

Трансляция списков. Механизм трансляции полей формы в РНР работает приемлемо, когда среди них нет полей с одинаковыми именами. Если же таковые встречаются, то в переменную записываются только данные последнего встретившегося поля. Это довольно-таки неудобно при работе, например, со списком множественного выбора <select multiple>:

<select name=Sel multiple>

<option>First

<option>Second

<option>Third

</select>

B таком списке вы можете выбрать (подсветить) не одну, а сразу несколько строчек, используя клавишу <Ctrl> и щелкая по ним кнопкой мыши. Пусть мы выбрали First и Third. Тогда после отправки формы сценарию придет строка параметров Sel=First&Sel=Third, и в переменной $Sel окажется только Third. Для решения подобных проблем в РНР предусмотрена возможность давать имена полям формы в виде имени массива с индексами:

<select name="Sel[]" multiple>

<option>First

<option>Second

<option>Third

</select>

Теперь сценарию придет строка Sel[]=First&Sel[]=Third, интерпретатор обнаружит, что мы хотим создать "автомассив" (то есть массив, который не содержит пропусков, и у которого индексация начинается с нуля), и, действительно, создаст переменную $Sel типа массив, содержимое которого следующее:

array (0=>"First", 1=>"Third").

Пример работы с автомассивами:

$A[]=10;

$А[]=20;

$А[]=30;

После отработки этих строк будет создан массив $A, заполненный последовательно числами 10, 20 и 30, с индексами, отсчитываемыми с нуля. То есть, если внутри квадратных скобок при присваивании элементу массива не указано ничего, то подразумевается элемент массива, следующий за последним.

Прием с автомассивом применим не только к этому элементу формы: автомассивы мы можем применять и в любых других полях.

Пример, создающий 2 переключателя (кнопки со значениями вкл/выкл), один редактор строки и одно текстовое (многострочное) поле, причем все данные после запуска сценария, обрабатывающего эту форму, будут представлены в виде одного-единственного автомассива:

<input type=checkbox name=Arr[] value=chl>

<input type=checkbox name=Arr[] value=ch2>

<input type=text name=Arr[] value="Some string">

<textarea name=Arr[] >Some text</textarea>

Автомассивы можно использовать для любых элементов формы.

Трансляция массивов. Пусть имеется форма, содержащая следующие элементы:

Имя: <input type=text name=Data[name]><br>

Адрес: <input type=text name=Data[address]><br>

Город:<br>

<input type=radio name=Data[city]

value=Moscow>Mоcква<br>

<input type=radio name=Data[city]

value=Peter>Caнкт-Петербург<br>

<input type=radio name=Data[city]

value=Kiev>Kиeв<br>

После передачи подобных данных сценарию на РНР в нем будет инициализирован ассоциативный массив $Data с ключами name, address и city. То есть, имена полям формы можно давать не только простые, но и представленные в виде одномерных ассоциативных массивов.

В сценарии к отдельным элементам формы можно будет обратиться при помощи указания ключа массива: например, $Data[’city’] обозначает значение той радиокнопки, которая была выбрана пользователем, a $Data["name"] – введенное имя. В сценарии мы обязательно должны заключать ключи в кавычки или апострофы – в противном случае интерпретатором будет выведено предупреждение. В то же время, в параметрах name полей формы мы, наоборот, должны их избегать. Многомерные массивы (то есть, массивы массивов) указывать нельзя.