і ). Для цього застосовується набір атрибутів formaction , formmethod , formenctype і formtarget , які є аналогами відповідних атрибутів без приставки form. У прикладі 4 показано використання цих атрибутів.Приклад 4. Надсилання форми
HTML5 IE Cr Op Sa Fx
Відправлення форми
Усі нові атрибути форм не підтримуються деякими браузерами, зокрема Internet Explorer і Safari.
Однією з найбільш популярних функцій на сайті є форма заявки або замовлення, дані з якої надсилаються на пошту власнику сайту. Як правило, такі форми є простими і складаються з двох трьох полів для введення даних. Як створити таку форму замовлення? Тут потрібне використання мови розмітки HTML та мови програмування PHP.
Мова розмітки HTML сама по собі нескладна, потрібно лише розібратися в тому як і де ставити ті чи інші теги. З мовою програмування PHP все трохи складніше.
Для програміста створити таку форму не важко, а от HTML верстальнику може здатися складним деякі дії.
Створюємо форму відправлення даних у html Перший рядок буде наступним
Тепер зберемо всі разом.
Тепер зробимо так, щоб поля у формі стали обов'язковими для заповнення. Маємо наступний код:
Створюємо файл, який приймає дані з HTML форми Це буде файл із ім'ям send.php
У файлі першому етапі потрібно прийняти дані з посаду масиву. Для цього створюємо дві змінні:
$fio = $_POST["fio"]; $email = $_POST["email"];
Перед назвами змінних у php ставиться знак $, наприкінці кожного рядка ставиться крапка з комою. $_POST це масив у який передаються даний з форми. У формі html при цьому вказано метод відправлення method = "post". Так, прийнято дві змінні форми html. Для захисту свого сайту потрібно провести ці змінні через кілька фільтрів - функцій php.
Перша функція перетворює всі символи, які користувач спробує додати до форми:
При цьому нові змінні в PHP не створюються, а використовуються вже наявні. Що зробить фільтр, він перетворить символ "<" в "<". Также он поступить с другими символами, встречающимися в html коде.
Друга функція декодує URL, якщо користувач спробує його додати у форму.
$fio = urldecode($fio); $email = urldecode($email);
Третьою функцією ми видалимо прогалини з початку і кінця рядка, якщо такі є:
$ fio = trim ($ fio); $ email = trim ($ email);
Існують інші функції, що дозволяють відфільтрувати змінні php. Їх використання залежить від того, наскільки ви побоюєтеся того, що зловмисник спробує додати програмний код у цю форму надсилання даних на пошту html.
Перевірка даних, що передаються від HTML форми у файл PHP
Для того, щоб перевірити, чи цей код працює, чи передаються дані можна просто їх вивести на екран за допомогою функції echo:
echo $fio; echo " "; echo $fio;
Другий рядок тут потрібний для того, щоб розділити виведення змінних php на різні рядки.
Надсилаємо отримані дані з форми HTML на пошту за допомогою PHP Для надсилання даних на пошту потрібно скористатися функцією mail у PHP.
mail("на яку адресу відправити", "тема листа", "Повідомлення (тіло листа)","From: з якого email відправляється лист \r\n");
Наприклад, потрібно надіслати дані на email власника сайту чи менеджера [email protected] .
Тема листа має бути зрозумілою, а повідомлення листа має містити те, що вказав користувач у формі HTML.
mail(" [email protected] ", "Заявка із сайту", "ПІБ:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n");
Необхідно додати умову, яка перевірить чи відправилася форма за допомогою PHP на вказану адресу електронної пошти.
if (mail(" [email protected] ", "Замовлення із сайту", "ПІБ:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n")) { echo "повідомлення успішно надіслано"; ) else ( }
Таким чином, програмний код файлу send.php, який відправить дані HTML форми на пошту, буде виглядати наступним чином:
$fio = $_POST["fio"]; $email = $_POST["email"]; $fio = htmlspecialchars($fio); $email = htmlspecialchars($email); $fio = urldecode($fio); $email = urldecode($email); $ fio = trim ($ fio); $ email = trim ($ email); // echo $ fio; // echo " "; // echo $ email; if (mail(" [email protected] ", "Заявка із сайту", "ПІБ:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n")) ( echo "повідомлення успішно надіслано"); ) else ( echo "при надсиланні повідомлення виникли помилки"; }?>
Три рядки для перевірки, чи передаються дані у файл закоментовані. При необхідності їх можна видалити, оскільки вони були потрібні тільки для налагодження.
Поміщаємо HTML та PHP код відправлення форми в один файл У коментарях до цієї статті багато хто запитує про те, як зробити, щоб і HTML форма і PHP код відправки даних на пошту знаходилися в одному файлі, а не двох.
Для реалізації такої роботи потрібно помістити HTML код форми у файл send.php та додати умову, яка перевірятиме наявність змінних у масиві POST (цей масив передається з форми). Тобто, якщо змінні в масиві не існують, потрібно показати користувачеві форму. Інакше потрібно прийняти дані з масиву та надіслати їх адресату.
Давайте подивимося, як змінити PHP код у файлі send.php:
Форма заявки із сайту //перевіряємо, чи існують змінні в масиві POST if(!isset($_POST["fio"]) and !isset($_POST["email"]))( ?>
) else ( //показуємо форму $fio = $_POST["fio"]; $email = $_POST["email"]; $fio = htmlspecialchars($fio); $email = htmlspecialchars($email); $fio = urldecode($fio); $email = urldecode($email); $ fio = trim ($ fio); $ email = trim ($ email); if (mail(" [email protected] ", "Заявка із сайту", "ПІБ:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n"))( echo "Повідомлення успішно надіслано"; ) else ( echo "При надсиланні повідомлення виникли помилки"; } } ?>
Існування змінної в масиві POST ми перевіряємо PHP функцією isset(). Знак оклику перед цією функцією в умові означає заперечення. Тобто, якщо змінної не існує, потрібно показати нашу форму. Якби я не поставив знак оклику, то умова дослівно означало б - "якщо існує, то показати форму". А це неправильно у нашому випадку. Звичайно, ви можете перейменувати його в index.php. Якщо будуть перейменовувати файл, то не забудьте перейменувати назву файлу і в рядку
Зберігши цей код у HTML-файлі та переглянувши його за допомогою вашого улюбленого браузера, ви побачите звичну HTML-форму:
Тег
, Власне і задає форму. Його атрибути – обидва необов'язкові:
action - вказує URL (повний або відносний), на який буде надіслано форму. Якщо цей атрибут не вказати, більшість браузерів (точніше кажучи, всі відомі мені браузери) надсилають форму на поточний документ, тобто "саму на себе". Це зручне скорочення, але за стандартом HTML атрибут action є обов'язковим.
метод - спосіб відправлення форми. Їх два. Якщо атрибут метод не вказаний - мається на увазі GET.
Тег - задає елемент форми, який визначається атрибутом type:
Значення "text" визначає однорядкове текстове поле введення
Значення submit задає кнопку, при натисканні якої відбувається відправлення форми на сервер
Можливі й інші значення (та й - Не єдиний тег, що задає елемент форми).
Отже, що відбувається, коли ми натискаємо кнопку "OK"?
Браузер переглядає елементи, що входять у форму, і формує з їх атрибутів name і value дані форми. Допустимо, введено ім'я Vasya . В цьому випадку дані форми - name=Vasya&okbutton=OK
Браузер встановлює з'єднання з сервером, відправляє на сервер запит документа, вказаного в атрибуті action тега
Сервер аналізує отриманий запит, формує відповідь, відправляє його браузеру та закриває з'єднання.
Браузер відображає отриманий від сервера документ
Надсилання того ж запиту вручну (з допомогою telnet) виглядає наступним чином (припустимо, що доменне ім'я сайту - www.example.com):
Telnet www.example.com 80 GET /cgi-bin/form_handler.cgi?name=Vasya&okbutton=OK HTTP/1.0\r\n Host: www.example.com\r\n \r\n
Як ви, швидше за все, вже здогадалися, натискання submit-кнопки у формі з методом відправки "GET" аналогічно до введення відповідного URL (зі знаком питання та даними форми в кінці) в адресному рядку браузера:
http://www.example.com/cgi-bin/form_handler.cgi?name=Vasya&okbutton=OK
Насправді метод GET використовується завжди, коли ви запитуєте з сервера будь-який документ, просто ввівши його URL, або клацнувши за посиланням. При використанні
Форма, наведена у рядках 8-12, містить два елементи: name та okbutton . Атрибут method вказує метод відправлення форми POST , атрибут ж action , що вказує URL, який відправляється форма, заповнюється значенням серверної змінної PHP_SELF - адресою виконуваного на даний момент скрипта.
=$_SERVER["PHP_SELF"]?>- скорочена форма запису для 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, нам необов'язково, у рядку 11 можна видалити атрибут name, скоротивши опис кнопки до . У цьому випадку браузер відправить POST -запит name=Вася.
А тепер - те саме, але для GET-форми:
if (isset($_GET ["name" ])) ( echo " Вітання, " . $_GET [ "name" ] . " !"
;
}
?>
У рядку 8 можна було б з таким самим успіхом написати
Жодних нових прийомів тут не використовується. Розберіться, виконайте код, спробуйте модифікувати...
Змінимо останній приклад, щоб користувачеві не потрібно повторно заповнювати поля. Для цього заповнимо атрибути value елементів форми щойно введеними значеннями.
$name = isset($_POST ["name"]) ? $_POST ["name"]: ""; $year = isset($_POST ["year" ]) ? $_POST ["year"]: "";If (isset($_POST ["name" ], $_POST [ "year" ])) ( if ($_POST [ "name" ] == "" ) ( echo "Вкажіть ім'я! "
;
) else if ($_POST [ "year" ]<
1900
||
$_POST
[
"year"
] >
2004
) {
echo "Вкажіть рік народження! Допустимий діапазон значень: 1900..2004 "
;
) else ( echo "Привіт," . $_POST ["name"] . "! "
;
$age = 2004 - $_POST ["year"]; echo "Вам". $age. років "
;
}
echo "
"
;
}
?>
Дещо незрозумілими можуть виявитися рядки 4 і 5. Все дуже просто: рядок 4 можна було б записати так:
if (isset($_POST ["name" ]))) $name = $_POST ["name"]; else $name = "";
Може виникнути питання - чому б не викинути рядки 4-5 і не написати:
Введіть ваше ім'я:
">
Введіть свій рік народження:
">
Справа в тому, що, якщо ці POST-змінні не визначені - а так і буде, якщо форму ще не заповнювали, - PHP видасть попередження про використання неініціалізованих змінних (причому, цілком обґрунтовано: таке повідомлення дозволяє швидко знаходити трудновиявлені друкарські помилки в іменах змінних, а також попереджає про можливі "дірки" на сайті). Можна, звичайно, помістити код з isset прямо у форму, але вийде занадто громіздко.
Розібралися? А тепер спробуйте знайти помилку у наведеному коді. Ну, не зовсім помилку, але недолік.
htmlspecialchars()
Не знайшли? Я підкажу. Введіть, наприклад, у поле "ім'я" подвійну лапку і який-небудь текст, наприклад, "Вася". Відправте форму, і погляньте на вихідний код отриманої сторінки. У четвертому рядку буде щось на кшталт:
Введіть ваше ім'я:
Тобто нічого хорошого. А якби хитрий користувач запровадив JavaScript-код?
Для вирішення цієї проблеми необхідно скористатися функцією htmlspecialchars() , яка замінить службові символи на їх HTML-подання (наприклад, лапку - на "):
$name = isset($_POST ["name"]) ? htmlspecialchars ($_POST ["name"]): ""; $year = isset($_POST ["year" ]) ? htmlspecialchars ($_POST ["year"]): "";If (isset($_POST ["name" ], $_POST [ "year" ])) ( if ($_POST [ "name" ] == "" ) ( echo "Вкажіть ім'я! "
;
) else if ($_POST [ "year" ]<
1900
||
$_POST
[
"year"
] >
2004
) {
echo "Вкажіть рік народження! Допустимий діапазон значень: 1900..2004 "
;
) else ( echo "Привіт," . $name. "! "
;
$age = 2004 - $_POST ["year"]; echo "Вам". $age. років "
;
}
echo "
"
;
}
?>
Повторіть досвід і переконайтеся, що HTML-код тепер коректний.
Запам'ятайте - функцію htmlspecialchars() необхідно використовувати завжди, коли виводиться вміст змінної, в якій можуть бути спецсимволи HTML.
phpinfo()
Функція phpinfo() - одна з найважливіших у PHP. Вона виводить інформацію про налаштування PHP, значення різних конфігураційних змінних...
Чому я згадую про неї у статті, присвяченій формам? phpinfo() - найзручніший засіб налагодження. phpinfo() , крім іншого, виводить значення всіх $_GET , $_POST і $_SERVER змінних. Отже, якщо змінна форми "загубилася", найпростіший спосіб виявити, у чому справа - скористатися функцією phpinfo(). Щоб функція виводила лише значення змінних (і вам не довелося прокручувати десяток сторінок), її слід викликати так: phpinfo(INFO_VARIABLES); , або - що абсолютно те саме - phpinfo(32);.
phpinfo (32); ?>
Або, наприклад, така ситуація: ви хочете дізнатися IP-адресу відвідувача. Ви пам'ятаєте, що відповідна змінна зберігається в масиві $_SERVER , але - ось невдача - забули, як саме змінна називається. Знову ж таки, викликаємо phpinfo(32); , шукаємо в табличці свою IP-адресу і знаходимо її - у рядку $_SERVER["REMOTE_ADDR"] .
Лабораторна робота 1. Протокол HTTP. Методи GET, POST. HTML форми.
Теоретична частина
Життєвий цикл запиту у протоколі HTTP
Браузер відкриває з'єднання із сервером Браузер надсилає серверу запит на отримання сторінки Сервер формує відповідь (найчастіше - HTML-код) браузеру та закриває з'єднання Браузер обробляє HTML-код та відображає сторінку
Зверніть увагу на виділене жирним . Ще до того, як ви побачили на екрані запитану сторінку, з'єднання з сервером закрите, і він про вас забув. І коли ви введете іншу (або ту саму) адресу, або клацніть на посилання, або натисніть на кнопку HTML-форми - та ж схема повториться знову.
Таку схему роботи називають "клієнт-сервер" . Клієнт у даному випадку – браузер.
Отже, з'єднання з веб-сервером триває лише кілька секунд (або часткою секунд) - це проміжок часу між клацанням за посиланням (або іншим способом запиту) і початком відображення сторінки. Більшість браузерів під час з'єднання відображають певний індикатор, наприклад, MS Internet Explorer відображає анімацію у верхньому правому куті.
Щоб назавжди позбутися сприйняття HTTP як "чорної скриньки", "прикинемось" браузером за допомогою telnet"а:
Запустимо telnet ya.ru 80 Введемо у вікні терміналу наступне (якщо введення не відображається – нічого страшного):
GET/HTTP/1.0 [тут натиснемо Enter] Host: ya.ru [тут натиснемо Enter двічі]
Натискання Enter відповідає, як правило, комбінації символів CR+LF, що позначаються як \r\n . Далі використовуватиметься саме це позначення.
На екрані пробіжить HTML-код сторінки http://ya.ru/. Як бачите – нічого складного.
Вихідний код поточної сторінки можна переглянути практично в будь-якому браузері, вибравши меню "View|Source".
Картинки, фрейми - все це додаткові запити, такі самі. Власне, звідки беруться зображення у вікні браузера: при парсингу (обробці) HTML-коду, браузер, натикаючись на тег https://i1.wp.com/ малюнок"> здійснює додатковий запит до сервера - запит картинки , і відображає її на місці, де стоїть тег .
Спробуйте:
Telnet www.google.ru 80
GET /php/php5ru.png HTTP/1.0 \r\n Host: ya.ru \r\n\r\n
По екрану пробіжить те, що ви побачите, якщо перегляньте цей PNG-файл у текстовому редакторі.
І-2. HTML-форми. Методи надсилання даних на сервер
З HTML-формами ви, напевно, вже зустрічалися:
Введіть ваше ім'я: