Форма відправлення даних у PHP (POST, GET). HTML-форми. Методи надсилання даних на сервер за допомогою форми

Застосування методів GET та POST у PHP важко переоцінити, оскільки ці методи зустрічаються практично на кожному сайті. Перш ніж вивчати нижче описаний матеріал, раджу ознайомитись з html тегом

. Розглянемо кожен із цих методів у подробиці.

Метод GET

Метод GET використовує рядок URL для передачі даних. Можливо, Ви звертали увагу на довгі та незрозумілі URL-адреси. Наприклад: function.php?login=Alex&email=dezyakin. В даному випадку дані обробляються у function.php. Після знака питання "?" йде перерахування параметрів, що передаються (параметр поділяються знаком "&") зі значеннями: параметру login присвоєно значення Alex, а змінною email значення dezyakin. Дані зберігатимуться в суперглобальному масиві $_GET . Наведемо приклад використання методу GET наведений нижче:

Login : E-mail: За допомогою суперглобального масиву $_GET виводимо прийняті значення:*/ echo "
login = ". $_GET["login"] ; echo "
email = ". $_GET["email"] ; ?>

Зверніть увагу на те, як ми зчитуємо значення із суперглобального масиву $_GET: $_GET["ім'я_змінної"]. У прикладі імена змінних було оголошено у вигляді (name=login і name=email).

Порада:
Перш ніж обробляти отримані значення, раджу перевіряти їх на існування через функції. isset(ім'я_змінної)або empty(ім'я_змінної)- ці функції були розглянуті в попередньому уроці 2: змінні PHP. Наприклад:

перевірка на існування за допомогою isset: if isset ($_GET["login"] ) ( оператори для обробки login ... } //або ж перевірити на існування за допомогою empty: if empty ($_GET["email"] ) ( оператори для обробки email ... } ?>

У формі можна вказати ім'я файлу, який оброблятиме значення, що передаються. Робиться це за допомогою атрибуту форми action, якому можна присвоїти адресу цього файлу. За замовчуванням цей файл присвоєно поточному файлу (тобто обробляється у файлі, де розташована форма). Наведемо приклад, у якому дані форми передаються на обробку файл srcipt.php :

Login : E-mail:

У файлі script.php повинен бути якийсь обробник інформації, інакше інформація буде передана в порожню.

Метод GET має безліч недоліків:

  • Користувач бачить значення параметрів, що передаються;
  • Користувач може легко підробити параметри, що передаються;
  • незручна передача бінарної інформації (доводиться кодувати в текстовий формат);
  • Обсяг даних обмежений - 8 Кбайт;

Через перераховані вище недоліки метод GET застосовується тільки в тих випадках, коли потрібно передати невеликий обсяг даних, а також ці дані ніяк не засекречені.

Метод POST

Метод POST відрізняється від GET тим, що дані передаються у закритій формі. Існує суперглобальний масив $_POST, з якого можна зчитувати дані таким чином: $_POST["ім'я_змінної"]. Наприклад:

Login : "> E-mail: ">
За допомогою суперглобального масиву $_POST виводимо прийняті значення:*/ echo "
login = ". $_POST["login"] ; echo "
email = ". $_POST["email"] ; ?>

Результат виконання вищезазначеного коду представлений на малюнку нижче:

Як бачите URL не має ніякої приписки, але дані були отримані і виведені.

Примітка:
1) Обсяг значень, що передаються методом POST за умовчанням обмежений і дорівнює 8 Мбайт. Щоб збільшити це значення, потрібно змінити директиву post_max_size в php.ini.

2) У ранніх версіях PHP замість коротких назв суперглобальних масивів $_GET і $_POST використовувалися довші імена: $HTTP_GET_VARS і $HTTP_POST_VARS . За замовчуванням вони вимкнені у php 5, але Ви можете їх увімкнути в конфігураційному файлі php.ini за допомогою register_long_arrays . У php 6 версії ці довгі назви будуть недоступними.

3) Перед обробкою змінних з $_POST, раджу перевіряти змінні на їх наявність, також як це робилося з методом GET.

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

HTML-форми. Методи надсилання даних на сервер

З HTML-формами ви, напевно, вже зустрічалися:

Введіть ваше ім'я:

Зберігши цей код у HTML-файлі та переглянувши його за допомогою вашого улюбленого браузера, ви побачите звичну HTML-форму:

Введіть ваше ім'я:

Тег

, що має парний завершальний тег
, Власне і задає форму. Його атрибути – обидва необов'язкові:

  • action - вказує URL (повний або відносний), на який буде надіслано форму. Якщо цей атрибут не вказати, більшість браузерів (точніше кажучи, всі відомі мені браузери) надсилають форму на поточний документ, тобто "саму на себе". Це зручне скорочення, але за стандартом HTML атрибут action є обов'язковим.
  • метод - спосіб відправлення форми. Їх два.
    • GET - надсилання даних форми в адресному рядку.
      Ви могли побачити на різних сайтах присутність в кінці URL символу "?" та наступних за ним даних у форматі параметр = значення. Тут "параметр" відповідає значенню атрибуту name елементів форми (див. нижче про тег ), а "значення" - вмісту атрибуту value (у ньому, наприклад, міститься введення користувача в текстове поле того ж тэга ).
      Для прикладу – спробуйте пошукати що-небудь в Яндексі та зверніть увагу на адресний рядок браузера. Це і є спосіб GET.
    • POST - дані форми надсилаються у тілі запиту. Якщо не зовсім зрозуміло (або зовсім незрозуміло), що це таке – не турбуйтесь, скоро ми до цього питання повернемося.
    Якщо атрибут метод не вказаний - мається на увазі GET.

Тег - задає елемент форми, який визначається атрибутом type:

  • Значення "text" визначає однорядкове текстове поле введення
  • Значення submit задає кнопку, при натисканні якої відбувається відправлення форми на сервер

Можливі й інші значення (та й - Не єдиний тег, що задає елемент форми).

Отже, що відбувається, коли ми натискаємо кнопку "OK"?

  1. Браузер переглядає елементи, що входять у форму, і формує з їх атрибутів name і value дані форми. Допустимо, введено ім'я Vasya . В цьому випадку дані форми - name=Vasya&okbutton=OK
  2. Браузер встановлює з'єднання з сервером, відправляє на сервер запит документа, вказаного в атрибуті action тега
    , використовуючи метод відправлення даних, вказаний в атрибуті методу (в даному випадку - GET), передаючи в запиті дані форми.
  3. Сервер аналізує отриманий запит, формує відповідь, відправляє його браузеру та закриває з'єднання.
  4. Браузер відображає отриманий від сервера документ

Надсилання того ж запиту вручну (з допомогою 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, або клацнувши за посиланням. При використанні , до URL просто додаються знак запитання та дані форми.

Можливо, всі ці технічні подробиці та вправи з telnet-ом здаються вам неймовірно нудними і навіть непотрібними ("а до чого тут PHP?"). А даремно. :) Це основи роботи з протоколу HTTP, які необхідно знати назубок кожному Web-програмісту, і це не теоретичні знання - все це знадобиться на практиці.

Тепер замінимо перший рядок нашої форми на наступний:

Ми вказали спосіб відправлення "POST". В цьому випадку дані відправляються на сервер дещо іншим способом:

Telnet www.example.com 80 POST /cgi-bin/form_handler.cgi HTTP/1.0\r\n Host: www.example.com\r\n Content-Type: application/x-www-form-urlencoded\r\ n Content-Length: 41263 n=Vasya&okbutton=OK

При використанні методу POST дані форми надсилаються вже після "двох Enter-ів" – у тілі запиту. Все, що вище - насправді заголовок запиту (і коли ми використовували метод GET, ці форми відправлялися в заголовку). Для того, щоб сервер знав, на якому байті закінчити читання тіла запиту, у заголовку є рядок Content-Length ; про те ж, що дані форми будуть передані у вигляді параметр1=значення1&параметр2=значення2... , причому значення передаються у вигляді urlencode - тобто так само, як і за допомогою методу GET , але в тілі запиту, - серверу повідомляє заголовок Content -Type: application/x-www-form-urlencoded .

Перевага методу POST – відсутність обмеження на довжину рядка з даними форми.

При використанні методу POST неможливо відправити форму, просто "зайшовши за посиланням", як було з GET.

При використанні POST-форми, в її атрибуті action можна вказати після знака питання та параметри GET-форми. Таким чином, метод POST включає і метод GET .

Масиви $_GET і $_POST

Отже, форми є основним способом обміну даними між веб-сервером і браузером, тобто забезпечують взаємодію з користувачем - власне, навіщо і потрібне веб-програмування.

Розглянемо простий приклад:



if ($_SERVER [ "REQUEST_METHOD" ] == "POST" ) (
echo "

Вітання, " . $_POST [ " name " ] . " .

!" ;
}
?>
">
Введіть ваше ім'я:






Форма, наведена у рядках 8-12, містить два елементи: name та okbutton . Атрибут method вказує метод відправлення форми POST , атрибут ж action , що вказує URL, який відправляється форма, заповнюється значенням серверної змінної 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 можна було б з таким самим успіхом написати

: GET - метод за замовчуванням. На цей раз браузер відправляє GET-запит, який рівносильний вводу в адресному рядку адреси: http://адреса-сайту/ім'я-скрипта.php?name=Вася.

PHP з GET-формами надходить так само, як і з POST, з тією відмінністю, що заповнюється масив $_GET.

Кардинальна відмінність - у рядку 4. Оскільки простий введення адреси в рядку браузера є GET-запитом, перевірка if ($_SERVER["REQUEST_METHOD"] == "GET") безглузда. Тому ми вдається до конструкції isset() , яка повертає true , якщо ця змінна визначена (тобто їй було надано значення), і false - якщо змінна не визначена. Якщо форма була заповнена - як ви вже зрозуміли, PHP автоматично надає $_GET["name"] відповідне значення.

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

Трохи складніший приклад.




echo "Вкажіть ім'я!
" ;
< 1900 || $_POST [ "year" ] > 2004 ) {
echo
"
;
) else (

" ;

echo "Вам". $age. років
" ;
}
echo "


" ;
}
?>
">
Введіть ваше ім'я:


Введіть свій рік народження:







Жодних нових прийомів тут не використовується. Розберіться, виконайте код, спробуйте модифікувати...

Змінимо останній приклад, щоб користувачеві не потрібно повторно заповнювати поля. Для цього заповнимо атрибути 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

  1. Браузер відкриває з'єднанняіз сервером
  2. Браузер надсилає серверу запит на отримання сторінки
  3. Сервер формує відповідь (найчастіше - HTML-код) браузеру та закриває з'єднання
  4. Браузер обробляє HTML-код та відображає сторінку

Зверніть увагу на виділене жирним. Ще до того, як ви побачили на екрані запитану сторінку, з'єднання з сервером закрите, і він про вас забув. І коли ви введете іншу (або ту саму) адресу, або клацніть на посилання, або натисніть на кнопку HTML-форми - та ж схема повториться знову.

Таку схему роботи називають "клієнт-сервер". Клієнт у даному випадку – браузер.

Отже, з'єднання з веб-сервером триває лише кілька секунд (або часткою секунд) - це проміжок часу між клацанням за посиланням (або іншим способом запиту) і початком відображення сторінки. Більшість браузерів під час з'єднання відображають певний індикатор, наприклад, MS Internet Explorer відображає анімацію у верхньому правому куті.

Щоб назавжди позбутися сприйняття HTTP як "чорної скриньки", "прикинемось" браузером за допомогою telnet"а:

  1. Запустимо telnet ya.ru 80
  2. Введемо у вікні терміналу наступне (якщо введення не відображається – нічого страшного):

GET/HTTP/1.0[тут натиснемо Enter]
Host: ya.ru[тут натиснемо Enter двічі]

Натискання Enter відповідає, як правило, комбінації символів CR+LF, що позначаються як \r\n. Далі використовуватиметься саме це позначення.

На екрані пробіжить HTML-код сторінки http://ya.ru/. Як бачите – нічого складного.

Вихідний код поточної сторінки можна переглянути практично в будь-якому браузері, вибравши меню "View|Source".

Картинки, фрейми - все це додаткові запити, такі самі. Власне, звідки беруться зображення у вікні браузера: при парсингу (обробці) HTML-коду, браузер, натикаючись на тег https://i2.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-формами ви, напевно, вже зустрічалися:

  1. Введіть ваше ім'я:

Зберігши цей код у HTML-файлі та переглянувши його за допомогою вашого улюбленого браузера, ви побачите звичну HTML-форму:

Введіть ваше ім'я:

Розглянемо теги, що використовуються в цьому невеликому прикладі, докладніше.

Тег

, що має парний завершальний тег
, Власне і задає форму. Його атрибути – обидва необов'язкові:

  • action- Вказує URL (повний або відносний), на який буде відправленоформа. Надсилання форми - це такий самий запит до сервера, як і всі інші (як я вже описав вище).

Якщо цей атрибут не вказати, більшість браузерів (точніше кажучи, всі відомі мені браузери) надсилають форму на поточний документ, тобто "саму на себе". Це зручне скорочення, але за стандартом HTML атрибут action є обов'язковим.

  • метод - спосіб відправлення форми. Їх два.
    • GET- Надсилання даних форми в адресному рядку.
      Ви могли побачити на різних сайтах присутність в кінці URL символу "?" та наступних за ним даних у форматі параметр = значення. Тут "параметр" відповідає значенняматрибуту nameелементів форми (див. нижче про тег ), а "значення" - вмісту атрибуту value(у ньому, наприклад, міститься введення користувача в текстове поле того ж таки тега ).
      Для прикладу – спробуйте пошукати що-небудь в Яндексі та зверніть увагу на адресний рядок браузера. Це і є спосіб GET.
    • POST- Дані форми відправляються в тілі запиту. Якщо не зовсім зрозуміло (або зовсім незрозуміло), що це таке – не турбуйтесь, скоро ми до цього питання повернемося.

Якщо атрибут методне вказано - мається на увазі "GET".

Тег - задає елемент форми, що визначається атрибутом type :

  • Значення "text"задає однорядкове текстове поле введення
  • Значення "submit"задає кнопку, при натисканні якої відбувається відправкаформи на сервер

Можливі й інші значення (та й - не єдиний тег, що задає елемент форми), але їх ми розглянемо у наступних розділах.

Отже, що відбувається, коли ми натискаємо кнопку "OK"?

  1. Браузер переглядає елементи, що входять у форму, і формує з їх атрибутів name і value дані форми. Допустимо, введено ім'я Vasya. В цьому випадку дані форми - name=Vasya&okbutton=OK
  2. Браузер встановлює з'єднання із сервером, надсилає на сервер запит документа, вказаного в атрибуті actionтега
    , використовуючи метод відправлення даних, вказаний в атрибуті метод(в даному випадку – GET), передаючи у запиті дані форми.
  3. Сервер аналізує отриманий запит, формує відповідь, відправляє його браузеру та закриває з'єднання.
  4. Браузер відображає отриманий від сервера документ

Надсилання того ж запиту вручну (з допомогою 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, або клацнувши за посиланням. При використанні , до URL просто додаються знак запитання та дані форми.

Тепер замінимо перший рядок нашої форми на наступний:

Ми вказали спосіб відправлення "POST". В цьому випадку дані відправляються на сервер дещо іншим способом:

telnet www.example.com 80

POST /cgi-bin/form_handler.cgi HTTP/1.0\r\n
Host: www.example.com\r\n
Content-Type: application/x-www-form-urlencoded\r\n
Content-Length: 22\r\n
\r\n
name=Vasya&okbutton=OK

При використанні методу POST дані форми відправляються вже після "двох Enter-ів" - тілізапиту. Все, що вище – насправді Заголовокзапиту (і коли ми використовували метод GET, ці форми відправлялися в заголовку). Для того, щоб сервер знав, на якому байті закінчити читання тіла запиту, у заголовку є рядок Content-Length; про те, що дані форми будуть передані вигляді параметр1=значення1&параметр2=значення2..., причому значення передаються у вигляді urlencode - тобто, так само, як і за допомогою методу GET, але в тілі запиту, - серверу повідомляє заголовок "Content-Type: application/x-www-form-urlencoded".

Перевага методу POST – відсутність обмеження на довжину рядка з даними форми.

При використанні методу POST неможливо відправити форму, просто "зайшовши за посиланням", як було з GET.

При використанні POST-форми у її атрибуті actionможна вказати після знака питання та параметри GET-форми. Таким чином, метод POST включає і метод GET.

Оновлено 12.12.2015 р.

Незважаючи на те, що тема відправки поштових повідомлень прямо зі сторінок сайту вже досить побита, але судячи з листів, які я отримую від відвідувачів свого сайту, роблю висновок, що багато хто ще має прогалини знань у цих питаннях.

Отже, у цьому уроці ми навчимося робити форму надсилання поштових повідомлень зі сторінок сайту з перевіркою на правильність введення даних. Тобто. якщо якесь поле форми буде не заповнене, то скрипт видасть помилку і повідомить про це відвідувача. Приклад роботи такої форми Ви можете побачити. Якщо Ви заповните цю форму та натисніть кнопку: Надіслати повідомлення, то я отримаю Ваше послання.

Перевага такого надсилання повідомлень очевидна:

1. Вам не потрібно "світити в Інтернеті" свою поштову адресу, а значить вона не потрапить до спамерів.

2. Якщо відвідувач хоче запитати Вас або щось запитати йому не потрібно, копіювати адресу електронної пошти, відкривати свій поштовий клієнт, писати повідомлення і т.д. Відвідувач швидко заповнить у формі потрібні дані та надішле Вам повідомлення.

3. За такої організації зворотного зв'язку з відвідувачами, ймовірність доставки Вам повідомлення майже 100%, особливо якщо поштова адреса прив'язана до вашого домену. Адже з довгого поштового ланцюжка виключаються проміжні вузли. Отже надійність доставки пошти різко підвищується.

Як створити форму надсилання повідомлень?

Як правило, подібні скрипти складаються з двох частин і код розташований у двох різних файлах:

  • Перший файл- це сама форма, у якій заповнюються дані повідомлення.
  • Другий файл- це файл-обробник, який отримує дані з форми (першого файлу) та відправляє за вказаною в скрипті ел.адресою. Але ці частини скрипта працюють завжди обов'язково в парі.

Першу частину скрипту ми виносимо в окремий файл та назвемо його: mail.php. У цьому файлі буде розміщена форма введення даних. ім'я файлу mail.phpя взяв умовно, Ви можете назвати цей файл як завгодно. Цей файл може мати й інше розширення, наприклад .html.

Для звернення відвідувачів сайту до цього файлу, зазвичай роблять просте посилання: Написати автору сайту , Надіслати повідомлення або щось подібне. Коли відвідувач натискає на таке посилання він потрапляє на окрему сторінку з формою в яку потрібно ввести дані (інформацію) для відправлення повідомлення.

Отже, створюєте новий файл, надайте йому ім'я: mail.phpабо mail.htmlі вставляєте код код Лістинга 1.

Лістинг 1









Для надсилання повідомлення автору сайту використовуйте таку форму:



Ваше ім'я:


Ваш e-mail:


Ваше повідомлення:




Це найпростіша форма, що складається всього з трьох полів для введення даних. Ці поля я назвав: Ваше ім'я, Ваш e-mail, Ваше повідомлення. За потреби кількість полів можна збільшити.

Перші два поля: Ваше ім'я, Ваш e-mail, описуються тегами:

Ваше ім'я:

але кожному з них присвоюється своє ім'я, яке називається ідентифікатор: name="name"і name="email"відповідно.

Третє поле для введення повідомлення описане тегами:

Ваше повідомлення:

Це поле має ідентифікатор: name="mess".

І звичайно є дві кнопки: Надіслати повідомленняі Очистити форму.

Даним (інформації), які відвідувач заносить у форму, надаються відповідні ідентифікатори: name, emailі mess, запам'ятовуйте – це важливо!

Для зручності оформлення вся форма поміщена у звичайну таблицю, зовнішній вигляд якої можна оформити за допомогою , у мене це клас: class="td_border", його я тут не наводжу, за потреби допишіть самі, на власний смак.

Файл обробник.

Друга частина скрипта складається з файлу оброблювача: mail2.php, в який методом POSTпередаються всі дані з відповідними ідентифікаторами: name, emailі mess. Тут ці дані поміщаються у змінні: $name, $email, $mess.

Створюємо файл mail2.phpі прописуємо до нього код Лістинга 2:

Лістинг 2

$name = $_POST["name"];
$email = $_POST["email"];
$mess = $_POST["mess"];

$REMOTE_ADDR = $_POST["REMOTE_ADDR"];

if (isset ($name))
{
$name = substr($name,0,20); //Не може бути більше 20 символів
if (empty($name))
{
echo "

Не вказано ім'я!

";
echo "";
exit;
}
}
else
{
$name = "не вказано";
}

if (isset ($email))
{
$email = substr($email,0,20); //Не може бути більше 20 символів
if (empty($email))
{
echo "

Не вказано e-mail !!!

";
echo " Повернутись та правильно заповнити форму.";
exit;
}
}
else
{
$email = "не вказано";
}

if (isset ($mess))
{
$ mess = substr ($ mess, 0,1000); //Не може бути більше 1000 символів
if (empty($mess))
{
echo "

Повідомлення не написано!!!

";
echo " Повернутись та правильно заповнити форму.";
exit;
}
}
else
{
$mess = "не вказано";
}

$i = "не вказано";
if ($name == $i AND $email == $i AND $mess == $i)
{
echo "Увага! Сталася помилка! Ви не заповнили поля повідомлення!";
exit;
}

$to = "admin@сайт";
$subject = " Повідомлення з сайту сайт";
$message = "Ім'я, що надіслав листа: $name .\nЕлектронна адреса: $email\nПовідомлення: $mess .\nIP-адреса: $_SERVER";
mail ($to,$subject,$message,"Content-type:text/plain; charset = windows-1251 ") or print "Не можу надіслати листа!!!";
echo "

Дякуємо за надсилання Вашого повідомлення.

Для мене це дуже важливо!

Найближчим часом Ви обов'язково отримаєте відповідь.";
exit;
?>

У цьому файлі відбувається перевірка введених відвідувачем сайту у форму даних та подальше відправлення повідомлення за вказаною адресою електронної пошти.

При незаповнених полях чи заповнених некоректно, скрипт поверне відвідувачу повідомлення із зазначенням конкретної причини.

Звертаю Вашу увагу, що файл: mail2.php обов'язково повинен мати розширення .php , т.к. надсилання повідомлення здійснюється за допомогою функції mail PHP.

І природно ваш хостинг, повинен підтримувати роботу PHP. Це переважно стосується безкоштовних хостингів, хоча останнім часом навіть на безкоштовних хостингах практично скрізь встановлений PHP.

У коді Лістинга 2все просто, виправте всі значення, виділені червоним під свої вимоги, а саме:

  • пропишіть свій Адреса електронної пошти, на який надсилатимуться повідомлення (змінна $to);
  • виправте тему повідомлення (змінна $subject);
  • зверніть увагу на кодування ( charset = windows-1251). Кодування пропишіть те, що використовується на вашому сайті. У російськомовному інтернеті кодування може бути: "utf-8"або "windows-1251". Якщо ви помилитеся з кодуванням текст у листі буде відображатися неправильно (кракозябрами).

Ось, власне, і все, тепер залишилося завантажити файли: mail.phpі mail2.phpі на вашому сайті з'явиться зручна форма для надсилання повідомлень.



Коментарі до цієї статті (уроку):

Дякую за урок. Ото правду кажуть, що все приходить вчасно. Сьогодні збиралася шукати в інтернеті як зробити форму контакту для сайту, причому незалежну. Я так розумію, що ця підійде.

Гарний урок! Дякую!

Спасибі Андрію, гарний урок.

Дякую, думаю, стане в нагоді

Вам пише Савін Дмитро Олександрович (SAVIN DMITRY ALEXANDROVICH), хочу дізнатися все по докладніше про форми в CSS, я мало про це обізнаний: докладніше про властивість action, як я знаю action це посилання на документ, куди надсилається запит даних або самі дані з форми, або щось в цьому роді.

Вітаю, Андрій! З повагою до Вас Ахмад. Ось я теж хочу на сайті створити "Додати Ваш коментар" щоб відвідувачі могли залишити свої Відгуки. Який код писати мені? Дякую Вам мені сподобалося. Ахмад

Красень! дуже корисна інформація!

Корисно, то корисно, але не запускаюсь. Після заповнення форми видається листинг mail2.php

Корисно, щось корисно, але не запускається. Після заповнення форми видається листинг mail2.php

Все добре працює, тільки кнопочки не виходять об'ємними як автор. Чи може хтось підкаже, як зробити об'ємні кнопочки? Автору дякую!

а в мене не працює. Точніше працює на половину. лист надсилає, але порожній. дані з майл1 не переходять у майл2

На маїл не приходить. У чому каверза? Я не зрозумію як він без логіна і пароля чогось відправить. Це що поштовий сервер типу? Проста форма та все

Дякую за форму! Працює! У кого не працює – уважно виконуйте кожен крок. У мене теж не одразу все вийшло. Андрію, ще раз дякую!

Допоможіть пліз, форму вставила все як Ок, але на пошту яку я вказала повідомлення не доходить, хоча і пишеться повідомлення відправлено...

Підкажіть, а як зробити так, щоб після відправки/невдалої відправки листа не відкривалося нове вікно, а писалість у старому?

Андрій. Я розумію, що обробник викликається. Я поки що не особливо у php знаюся. Але мені ось чого хотілося досягти: сторінка з поштовою формою одна, тобто. після натискання "Надіслати повідомлення" нове вікно не відкривається, а змінюється поточна сторінка. Тобто, я так розумію вона динамічна. Самої поки не додуматися як зробити таке, тому питаю поради.

Андрію, підкажіть будь ласка, форма чудово працює в хромі, а ось з експлорером проблема. Не надсилаються листи та не відображаються повідомлення про помилки або надсилання. У чому тут річ? Заздалегідь дякую

Класний урок! Дякую!

Дякую. Все чудово працює)

у коді немає тегів, що закривають /p. Чому?

Warning: mail(): "sendmail_from" немає в php.ini або custom "From:" Як бути??

не можу розібратися з кодуванням. Якщо прописувати windows-1251 - текст скрипта у повідомленні нормальний, сам текст повідомлення на пошту надходить крокозяброю. а якщо ставити utf-8 – текст скрипту у повідомленні на пошті – знаки питання, а текст повідомлення з форми – нормальний. як зробити, щоб і те й те нормальним було?

у мене не працює, але сайт ще не на хостингу, коли поміщу-буде?

Все працює, дякую за скрипт! Покажіть, будь ласка, як зробити що б при натисканні кнопки відправити не відкривалася нова сторінка з обробником. Що б сайт залишався на тій сторінці, де і був до натискання кнопки відправити?

а як зробити поле введення майл вище?

Якщо необхідно відправити листи на кілька адрес, просто через кому дописуєте потрібні адреси так: $to = "admin@сайт, [email protected], [email protected]";

А як зробити, щоб після відправлення повідомлення була переадресація на іншу сторінку?

є $to = "admin@сайт"; питання: якщо необхідна відправка на 2 адреси! одна з адрес у вигляді $to = "$email"; тобто функціонал "порадити другові" з дублюванням послання на мною задану пошту. Дякую.

У мене чомусь форма зворотного зв'язку не працює, причому ніяка не працює. Вдає, що повідомлення надіслано, але на пошту воно не надходить.

Здрастуйте! Поясніть, будь ласка, чому не працює на хостингу, пише: "Не можу надіслати листа". А на lockalhost на Денвері працює нормально. В чому проблема?...

чому у мене не одна формнеа не оре пише

Велике дякую. Дуже просто і доступно. Я використав ваш приклад на сайті gosdogovor.ru. Лише трохи підточив дизайн під себе та склад полів: http://www.gosdogovor.ru/easuzcon.html. Ще раз дякую.

Дітлахів, якщо ви намагаєтеся відправити повідомлення з вашого локального сервера, тобі з сайту ще не розміщеному в інтернеті, - у вас нічого не вийде. Розмістіть на якомусь хостингу і буде вам щастя)

Андрію, а як зробити так стоби при натисканні на кнопку відправлялося повідомлення з певним текстом на певну адресу? Допоможіть будь ласка: [email protected]

Сама форма зазвичай призначена для отримання від користувача інформації для подальшого пересилання її на сервер, де ці форми приймає програма-обробник. Така програма може бути написана будь-якою серверною мовою програмування на кшталт PHP, Perl та ін. Адреса програми вказується в атрибуті action тега

, як показано у прикладі 1.

Приклад 1. Надсилання даних форми

HTML5 IE Cr Op Sa Fx

Дані форми



У цьому прикладі дані форми, позначені атрибутом name (login і password), будуть передані у файл за адресою /example/handler.php. Якщо атрибут action не вказувати, передача відбувається на адресу поточної сторінки.

Передача на сервер відбувається двома різними методами: GET і POST для завдання методу в тезі

використовується атрибут method, яке значеннями виступають ключові слова get і post. Якщо атрибут метод не заданий, то за умовчанням дані відправляються на сервер методом GET. У табл. 1 показано різницю між цими методами.

Який метод використовується легко визначити за адресним рядком браузера. Якщо в ній з'явився знак питання і адреса стала схожою на цю, то це точно GET.

http://www.google.ru/search?q=%D1%81%D0%B8%D1%81%D1%8C%D0%BA%D0%B8&ie=utf-8

Унікальне поєднання параметрів адресного рядка однозначно ідентифікує сторінку, тому сторінки з адресами?q=node/add і?q=node вважаються різними. Цю особливість використовують системи управління контентом (CMS, Content management system) для створення багатьох сторінок сайту. Насправді ж використовується один файл, який отримує запит GET і відповідно до нього формує вміст документа.

Нижче наведено типові області застосування цих методів на сайтах.

GET

Передача невеликих текстових даних на сервер; Пошук по сайту.

Пошукові системи, форми пошуку по сайту завжди відправляються методом GET, це дозволяє ділитися результатами пошуку з друзями, надсилати посилання поштою або викладати його на форумі.

POST

Пересилання файлів (фотографій, архівів, програм та ін.); відправлення коментарів; додавання та редагування повідомлень на форумі, блозі.

Робота з формою за промовчанням відбувається в поточній вкладці браузера, при цьому допустимо при відправленні форми змінити цей параметр і відкривати обробник форми у новій вкладці або у кадрі. Така поведінка задається через «ім'я контексту», яке є значенням атрибуту target тега . Популярні значення це _blank для відкриття форми в новому вікні або вкладці та ім'я кадру, яке задається атрибутом name тега



У цьому прикладі при натисканні на кнопку «Надіслати» результат відправки форми відкривається у кадрі з ім'ям area .

Елементи форми зазвичай розташовуються всередині тега

, тим самим визначаючи дані, які будуть передаватися на сервер. Водночас у HTML5 є можливість відокремити форму від її елементів. Це зроблено для зручності та універсальності, так, складний макет може містити кілька форм, які не повинні перетинатися між собою або, наприклад, деякі елементи виводяться за допомогою скриптів в одному місці сторінки, а сама форма знаходиться в іншому. Зв'язок між формою та її елементами відбувається у такому разі через ідентифікатор форми, а до елементів слід додати атрибут form зі значенням, що дорівнює цьому ідентифікатору (приклад 3).

Приклад 3. Зв'язування форми з полями

HTML5 IE Cr Op Sa Fx

Форма



У цьому прикладі тег

однозначно ототожнюється через ідентифікатор auth , а полям, які слід відправити за допомогою форми, додається form="auth" . При цьому поведінка елементів не змінюється, при натисканні на кнопку логін та пароль пересилаються на обробник handler.php.

Хоча параметри передачі форми традиційно вказуються в тезі , їх можна перенести і в кнопки відправлення форми (