Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 [ 48 ] 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189

( Замечание

Помните наши рассуждения о том, что же первично в PHP: текст или программа? Конструкция <?= применяется обычно в тот момент, когда выгодно счи-

Вот наш окончательный сценарий hello.php (листинг 8.4). Как видите, он сжался до неприличных размеров:

\ Листинг 8.4. hello.php: окончательная версия

<html><body>

<? echo "Привет, $name!<br> Я знаю, Вам $age лет!" ?> </html></body>

Давайте теперь его усовершенствуем - сделаем так, чтобы при запуске без параметров сценарий выдавал документ с формой, а при нажатии кнопки - выводил нужный текст. Самый простой способ определить, был ли сценарий запущен без параметров - проверить, существует ли переменная с именем, совпадающим с именем кнопки отправки. Если такая переменная существует, то, очевидно, что пользователь запустил программу, нажав на кнопку. Здесь мы применим инструкцию if, которая нами еще не рассматривалась, но, думаю, читатель простит мне этот огрех (листинг 8.5).

i Листинг 8.5. hello.php: усовершенствованная версия

<html><body> <?if($doGo) {?>

<form action="<?=$SCRIPT NAME?>">

Введите имя: <input type=text name="name"><br>

Введите возраст: <input type=text name="age"><br>

<input type=submit name="doGo" value="Нажмите кнопку!">

</form> <?} else {?>

Привет, <?=$name?>!<br>

Я знаю, Вам <?=$age?> лет!"

<?}?>

</html></body>

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



Если PHP установлен не как модуль Apache, а как отдельный обработчик, то переменная $script name будет содержать не то значение, на которое мы рассчитываем. Например, если воспользоваться способом инсталляции PHP, который предлагается во второй части этой книги (когда мы устанавливаем PHP именно как внешнюю программу, а не модуль Apache), после запуска сценария переменная $script name будет содержать строку / php/php.exe, что, конечно же, нам не подходит. "Правильное" значение в этом случае можно найти в переменной окружения redirect url, или в переменной PHP

$REDIRECT URL.

К тому же, теперь исчезла необходимость и в промежуточном файле form.html: его код встроен в сам сценарий. Именно так и нужно разрабатывать сценарии: и просто и делу польза. Здесь действует общий принцип: чем меньше файлов, задающих внешний вид страницы, тем лучше (только, ради бога, не обобщайте это на файлы с программами - последствия могут быть катастрофическими!).

Трансляция переменных окружения и Cookies

Однако "интеллектуальные" возможности PHP на этом далеко не исчерпываются. Дело в том, что в переменные преобразуются не только все данные формы, но и переменные окружения (включая query string, content length и многие другие), а также все Cookies.

Например, вот сценарий (листинг 8.6), который печатает IP-адрес пользователя, который его запустил, а также тип его браузера (эти данные хранятся в переменных окружения REM0TE USER и http user agent):

! Листинг 8.6. Вывод IP-адреса и браузера пользователя

<html><body>

Ваш IP-адрес: <?=$REM0TE USER?><br> Ваш браузер: <?= HTTP USER AGENT?> </body></html>

тать, что первичен текст. В нашем примере именно так и происходит - ведь кода на PHP тут очень мало, в основном страница состоит из HTML-тэгов.

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



По умолчанию трансляция выполняется в порядке ENVIRONMENT-GET-POST-COOKIE, причем каждая следующая переменная как бы перекрывает предхдущее свое значение. Например, пусть у нас есть переменная окружения A=10, параметр, поступивший из GET-формы A=2 0 и Cookie A=30. В этом случае в переменную $A сценария будет записано 30, поскольку Cookie перекрывает GET, а GET перекрывает переменные окружения. Так что, проверяя какую-либо переменную окружения var в сценарии (особенно если она касается вопросов, связанных с разграничением прав доступа - например, переменная содержит пароль), задумайтесь на минутку: а что, если злоумышленник запустит ваш сценарий вот так:

http: www.somehost.com/foo.php?VAR=что то очень нехорошее

и старое значение переменной окружения var окажется стертым? К счастью, в таких ситуациях есть выход - достаточно воспользоваться функцией getenv(), чтобы прочитать значение переменной окружения с указанным именем, и только его - невзирая ни на какие другие данные. Подробнее об этой функции мы поговорим чуть позже.

Трансляция списков

Механизм трансляции полей формы в PHP работает приемлемо, когда среди них нет полей с одинаковыми именами. Если же таковые встречаются, то в переменную, ясное дело, записываются только данные последнего встретившегося поля. Это довольно-таки неудобно при работе, например, со списком множественного выбора

<select multiple>:

<select name=Sel multiple>

<option>First

<option>Second

<option>Third

</select>

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

<select name="Sel[]" multiple> <option>First <option>Second <option>Third



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 [ 48 ] 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189