php.exe,
что, конечно же, нам не подходит. "Правильное" значение в этом случае можно
найти в переменной окружения REDIRECT_URL, или в переменной PHP
$REDIRECT_URL.
К тому же, теперь исчезла необходимость и в промежуточном файле form.html: его
код встроен в сам сценарий. Именно так и нужно разрабатывать сценарии: и просто
и
делу польза. Здесь действует общий принцип: чем меньше файлов, задающих внеш-
ний вид страницы, тем лучше (только, ради бога, не обобщайте это на файлы с
про-
граммами — последствия могут быть катастрофическими!).
Трансляция переменных
окружения и Cookies
Однако "интеллектуальные" возможности PHP на этом далеко не исчерпываются.
Дело в том, что в переменные преобразуются не только все данные формы, но и пе-
ременные окружения (включая QUERY_STRING, CONTENT_LENGTH и многие другие), а
также все Cookies.
Например, вот сценарий (листинг 8.6), который печатает IP-адрес пользователя,
ко-
торый его запустил, а также тип его браузера (эти данные хранятся в переменных
окружения REMOTE_USER и HTTP_USER_AGENT):
Листинг 8.6. Вывод IP-адреса и браузера пользователя
Ваш IP-адрес: =$REMOTE_USER?>
Ваш браузер: = HTTP_USER_AGENT?>
Глава 8. Работа с данными формы 149
По умолчанию трансляция выполняется в порядке ENVIRONMENT-GET-POSTCOOKIE,
причем каждая следующая переменная как бы перекрывает предыдущее
свое значение. Например, пусть у нас есть переменная окружения A=10, параметр,
поступивший из GET-формы A=20 и Cookie A=30.
В этом случае в переменную $A сценария будет записано 30, поскольку Cookie
пере-
крывает GET, а GET перекрывает переменные окружения. Так что, проверяя какую-
либо переменную окружения VAR в сценарии (особенно если она касается вопросов,
связанных с разграничением прав доступа — например, переменная содержит па-
роль), задумайтесь на минутку: а что, если злоумышленник запустит ваш сценарий
вот так:
http://www.somehost.com/foo.php?VAR=что_то_очень_нехорошее
и старое значение переменной окружения VAR окажется стертым? К счастью, в таких
ситуациях есть выход — достаточно воспользоваться функцией getenv(), чтобы
прочитать значение переменной окружения с указанным именем, и только его — не-
взирая ни на какие другие данные. Подробнее об этой функции мы поговорим чуть
позже.
Трансляция списков
Механизм трансляции полей формы в PHP работает приемлемо, когда среди них нет
полей с одинаковыми именами. Если же таковые встречаются, то в переменную, яс-
ное дело, записываются только данные последнего встретившегося поля. Это
доволь-
но-таки неудобно при работе, например, со списком множественного выбора