Смекни!
smekni.com

Этапы создания веб-приложения. Основы РНР и MySQL (стр. 4 из 6)

</head>

<body>

<?

if ($_SERVER['REQUEST_METHOD'] == 'POST') {

echo "<h1>Привет, <b>" . $_POST['name'] ."</b>! Учите меня!</h1>";

}

?>

<form method="POST">

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

<br>

<input type="submit" name="okbutton" value="OK">

</form>

</body>

</html>

Из тэга form убрали атрибут action - это значит, что форма отправляется "сама на себя", т.е. на текущий URL. Это называют "postback form". С помощью оператора if проверяется, использован ли для загрузки документа метод POST, и - если это так - в следующей строке выводится приветствие. В окне браузера можно увидеть:

2.6. HTML-формы. Массивы $_GET и $_POST

Формы являются основным способом обмена данными между web-сервером и браузером (пользователем). Формы выполняют главную функцию web – программирования: обеспечивают взаимодействие с пользователем.

2.6.1. Особенности метода отправки формы POST

Возьмем уже знакомый по первой главе пример form_2.phpи внесем в него некоторые изменения:

Листинг form_3.php

<html>

<head>

<title>Вас приветствует PHP</title>

</head>

<body>

<?

if ($_SERVER['REQUEST_METHOD'] == 'POST') {

echo '<h1>Привет, <b>' . $_POST['name'] . '</b>!</h1>';

}

?>

<form method="POST" action="<?=$_SERVER['PHP_SELF']?>">

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

<br>

<input type="submit" name="okbutton" value="OK">

</form>

</body>

</html>

Форма, приведенная в строках 8-12 (выделено цветом), содержит два атрибута: name и okbutton:

1. атрибут method указывает метод отправки формы POST;

2. атрибут action, указывающий URL, на который отправляется форма, заполняется значением серверной переменной PHP_SELF - адресом выполняемого в данный момент скрипта.

<?=$_SERVER['PHP_SELF']?> - сокращенная форма записи для echo: <? echo $_SERVER['PHP_SELF']; ?>.

Если в поле форма name ввести, например, значение Вася, и нажать кнопку OK, то Браузер отправит после этого на сервер POST-запрос. Тело запроса имеет вид: name=Вася&okbutton=OK. PHP при этом автоматически заполнит массив $_POST:

$_POST['name'] = 'Вася'

$_POST['okbutton'] = 'OK'

В действительности, значение "Вася" отправляется браузером в urlencode-виде; для кодировки windows-1251 это значение выглядит как %C2%E0%F1%FF. Но, поскольку PHP автоматически осуществляет необходимое декодирование, мы можем "забыть" об этой особенности - пока не придется работать с HTTP-запросами вручную.


Так как в теле запроса указываются только имена и значения, но не типы элементов форм, PHP понятия не имеет, соответствует $_POST['name'] строке ввода, кнопке, или списку. Но эта информация нам, в общем-то, совершенно не нужна.

Поскольку знать, что написано на кнопке submit, нам необязательно, в строке можно удалить атрибут name, сократив описание кнопки до <input type="submit" value="OK"> (листинг form_4.php). В этом случае, браузер отправит POST-запрос name=Вася.

Листинг form_4.php

<html>

<head>

<title>Васприветствует PHP</title>

</head>

<body>

<?

if ($_SERVER['REQUEST_METHOD'] == 'POST') {

echo '<h1>Привет, <b>' . $_POST['name'] . '</b>!</h1>';

}

?>

<form method="POST" action="<?=$_SERVER['PHP_SELF']?>">

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

<br>

<input type="submit" value="OK">

</form>

</body>

</html>

2.6.2. Особенности метода отправки формы GET

А теперь подобные рассуждения проделаем для метода отправки формы GET:

Листинг form_5.php

<html>

<head>

<title>Васприветствует PHP</title>

</head>

<body>

<?

if (isset($_GET['name'])) {

echo '<h1>Привет, <b>' . $_GET['name'] . '</b>!</h1>';

}

?>

<form action="<?=$_SERVER['PHP_SELF']?>">

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

<br>

<input type="submit" value="OK">

</form>

</body>

</html>

<html>

<body>

<?

if (isset($_GET['name'])) {

echo '<h1>Привет, <b>' . $_GET['name'] . '</b></h1>!';

}

?>

<form action="<?=$_SERVER['PHP_SELF']?>">

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

<br>

<input type="submit" value="OK">

</form>

</body>

</html>

В строке 11 можно было бы написать <form method="GET">. Но GET - метод по умолчанию.

Браузер отправляет GET-запрос, который равносилен вводу в адресной строке адреса: http://адрес-сайта/имя-скрипта.php?name=Вася:

PHP с GET-формами поступает точно так же, как и с POST-формами, с тем отличием, что заполняет массив $_GET.

Кардинальное же отличие - в строке 7. Поскольку простой ввод адреса в строке браузера является GET-запросом, проверка if ($_SERVER['REQUEST_METHOD'] == 'GET') бессмысленна: все, что в этом случае можно выяснить, что кто-то не отправил на скрипт POST-форму. Поэтому прибегают к конструкции isset(), которая возвращает true, если переменная определена (т.е. ей было присвоено значение), и false - если переменная не определена. Если форма была заполнена - как Вы уже поняли, PHP автоматически присваивает $_GET['name'] соответствующее значение.

Способ проверки с помощью isset() - универсальный, его можно было бы использовать и для POST-формы. Более того, он предпочтительнее, так как позволяет выяснить, какие именно поля формы заполнены.

Во многих старых книгах и статьях утверждается, что:

1. Данные как из GET, так и из POST-форм попадают непосредственно в переменные (в нашем случае - $name), причем POST-данные приоритетнее, т.е. "затирают" GET-данные;

2. Данные GET и POST-форм хранятся соответственно в массивах $HTTP_GET_VARS и $HTTP_POST_VARS.

Эта информация устарела. Запомните этот момент, чтобы не попасть впросак со старыми скриптами или книгами.

Немного более сложный пример.

Листинг form_6.php

<html>

<body>

<?

if (isset($_POST['name'], $_POST['year'])) {

if ($_POST['name'] == '') {

echo 'Укажитеимя!<br>';

} else if ($_POST['year'] < 1900 || $_POST['year'] > 2004) {

echo 'Укажите год рождения! Допустимый диапазон значений: 1900..2004<br>';

} else {

echo 'Здравствуйте, ' . $_POST['name'] . '!<br>';

$age = 2004 - $_POST['year'];

echo 'Вам ' . $age . ' лет<br>';

}

echo '<hr>';

}

?>

<form method="post" action="<?=$_SERVER['PHP_SELF']?>">

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

<br>

ВведитеВашгодрождения: <input type="text" name="year">

<input type="submit" value="OK">

</form>

</body>

</html>

Никаких новых приемов здесь не используется. Разберитесь, выполните код, попробуйте модифицировать...


Изменим последний пример, чтобы пользователю не нужно было повторно заполнять поля. Для этого заполним атрибуты value элементов формы только что введенными значениями.

Листинг form_7.php

<html>

<body>

<?

$name = isset($_POST['name']) ? $_POST['name'] : '';

$year = isset($_POST['year']) ? $_POST['year'] : '';

if (isset($_POST['name'], $_POST['year'])) {

if ($_POST['name'] == '') {

echo 'Укажитеимя!<br>';

} else if ($_POST['year'] < 1900 || $_POST['year'] > 2004) {

echo 'Укажите год рождения! Допустимый диапазон значений: 1900..2004<br>';

} else {

echo 'Здравствуйте, ' . $_POST['name'] . '!<br>';

$age = 2004 - $_POST['year'];

echo 'Вам ' . $age . ' лет<br>';

}

echo '<hr>';

}

?>

<form method="post" action="<?=$_SERVER['PHP_SELF']?>">

ВведитеВашеимя: <input type="text" name="name" value="<?=$name?>">

<br>

ВведитеВашгодрождения: <input type="text" name="year" value="<?=$year?>">

<input type="submit" value="OK">

</form>

</body>

</html>

Несколько непонятными могут оказаться строки 4 и 5. Все очень просто: X = A ? B : C - сокращенная запись условия if (A) X=B else X=C. Строку 4 можно было бы записать так:

if (isset($_POST['name']))

$name = $_POST['name'];

else

$name = '';

Используемая в строках 21 и 23 конструкция <?=$foo ?> - и того проще: это сокращение для <? echo $foo ?>.

Может возникнуть вопрос - почему бы не выбросить строки 4-5 и не написать:

ВведитеВашеимя: <input type="text" name="name" value="<?=$_POST['name']?>"><br>

ВведитеВашгодрождения: <input type="text" name="year" value="<?=$_POST['year']?>">

Дело в том, что, если эти POST-переменные не определены (а так и будет, если форму еще не заполнили), то PHP выдаст предупреждения об использовании неинициализированных переменных (причем, вполне обоснованно).