скачать рефераты
  RSS    

Меню

Быстрый поиск

скачать рефераты

скачать рефератыУчебное пособие: Этапы создания веб-приложения. Основы РНР и MySQL

<html>

<head>

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

</head>

<body>

<form method="POST" action="form_handler.php">

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

<br>

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

</form>

</body>

</html>

PHP – код разместим в файле form_handler.php:

<?

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

?>

PHP – скрипт заключен в специальные тэги <? и ?>, внутри которых использован для вывода текста оператор echo.

Переменные GET-запроса попадают в массив $_GET, переменные POST-запроса - в массив $_POST, серверные переменные (типа IP-адреса, имени скрипта и т.д.) - в массив $_SERVER, оператор "точка" (.) - объединение строк... Причем все служебные операции (чтение stdin и переменных среды, Url-декодирование) уже произвел сам PHP. Удобно, не так ли?

Далее. Зачем нам два файла - HTML с формой и PHP-скрипт? Вполне достаточно одного скрипта:

Листинг form_2.html

<html>

<head>

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

</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 выдаст предупреждения об использовании неинициализированных переменных (причем, вполне обоснованно).

Такое сообщение позволяет быстро находить трудно обнаруживаемые опечатки в именах переменных, а также предупреждает о возможных "дырах" на сайте.

Можно, конечно, поместить код с isset(). прямо в форму, но получится слишком громоздко.

Разобрались? А теперь попробуйте найти ошибку в приведенном коде. Ну, не совсем ошибку, - но недочет.

 

2.7. Функция htmlspecialchars()

Не нашли? Я подскажу. Введите, например, в поле "имя" двойную кавычку и какой-нибудь текст, например, "123. Отправьте форму, и взгляните на исходный код полученной страницы. В четвертой строке будет что-то наподобие:

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


То есть - ничего хорошего. А если бы хитрый пользователь ввел JavaScript-код?

Для решения этой проблемы необходимо воспользоваться функцией htmlspecialchars(), которая заменит служебные символы на их HTML-представление (например, кавычку - на &quot;):

Листинг form_7.php

<html>

<body>

<?

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

$year = isset($_POST['year']) ? htmlspecialchars($_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 'Здравствуйте, ' . $name . '!<br>';

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

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

}

echo '<hr>';

}

Страницы: 1, 2, 3, 4


Новости

Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

© 2010.