Уявний submit php. Html формами: php form-надіслати заявку на ту ж сторінку. Як уникнути неприємностей, пов'язаних з PHP _SELF

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

На одному з сайтів мені потрібно було в одній формі використовувати дві кнопки submit , які пересилали б заповнені дані різним PHP-"обробникам", залежно від натискання кнопки. Google нічого розумного мені не відповів, мабуть я просто не так його якось про це просив, тому довелося вигадувати самому.

Ось і виклав на ваш суд.

Суть проблеми

Після самостійної реалізації, я все ж таки знайшов кілька рішень, які ґрунтувалися на використанні звичайних кнопок, до яких прикручувався JS.

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

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

Для того, щоб було простіше зрозуміти що я хочу і як це працює ось реально робочий приклад, у вигляді форми, який має 2 submit`a, що пересилають дані на різні сторінки.

Одна з найголовніших переваг PHP - те, як він працює з формами HTML. Тут основним є те, що кожен елемент форми автоматично стає доступним вашим програмам на PHP. Для детальної інформації про використання форм у PHP читайте розділ. Ось приклад форми HTML:

Приклад #1 Найпростіша форма HTML

Ваше ім'я:

Ваш вік:

У цій формі немає нічого особливого. Це звичайна форма HTML без спеціальних тегів. Коли користувач заповнить форму та натисне кнопку відправки, буде викликана сторінка action.php . У цьому файлі може бути щось на кшталт:

Приклад #2 Виводимо дані форми

Вітаю, .
Вам літ.

Приклад виведення цієї програми:

Здрастуйте, Сергію. Вам тридцять років.

Якщо не брати до уваги шматки коду з htmlspecialchars() і (int), принцип роботи цього коду має бути простим і зрозумілим. htmlspecialchars() забезпечує правильне кодування "особливих" HTML-символів так, щоб шкідливий HTML або Javascript не був вставлений на вашу сторінку. Поле age, про яке нам відомо, що воно має бути число, ми можемо просто перетворити на integer , що автоматично позбавить нас небажаних символів. PHP також може зробити це автоматично за допомогою розширення filter. Змінні $_POST["name"] і $_POST["age"] автоматично встановлені для вас засобами PHP. Раніше ми використовували суперглобальну змінну $_SERVER , тут ми так само використовуємо суперглобальну змінну $_POST , яка містить всі POST-дані. Зауважимо, що метод відправки(method) нашої форми – POST. Якби ми використовували метод GET, то інформація нашої форми була б у суперглобальній змінній $_GET. Крім цього, можна використовувати змінну $_REQUEST, якщо джерело даних не має значення. Ця змінна містить суміш GET, POST, COOKIE.

15 років тому

Відповідно до HTTP specification, ви повинні використовувати метод POST, коли ви "за допомогою форми для зміни статей деякого часу на сервері кінця. Для прикладу, якщо сторінка має форму для доступних користувачів для отримання своїх нових коментарів, як це page here, form should use POST.If you click "Reload" або "Refresh" on page that you reached through a POST, it's always an error - you shouldn't be posting the same comment twice -- which is why ці pages aren"t bookmarked або cached.

Ви повинні використовувати GET метод, коли ваша форма є, добре, щоб отримати деякий час від сервера і не фактично змінюється будь-який. Для прикладу, спосіб для пошуку знаряддя повинен використовувати GET, тому що вивчити веб-сайт повинен не змінювати будь-яку думку, що клієнт може скористатися ним, і bookmarking або caching результати search-engine query є just as useful as bookmarkingor static HTML page.

2 years ago

Worth clarifying:

POST is not more secure than GET.

Відповідь для вибору GET vs POST involve різні factory така, як наслідування доцільності (якщо ви "суміщення"? URL), і як можна зробити, щоб зробити функцію, щоб бути shareable -- наприклад, Google Searchs є Get because it makes it easy to copy and share the search query with someone lose simply by sharing the URL.

Здоров'я є лише розглядом, що робить насправді, що в GET є easier до share than a POST. До прикладу: ви не повинні писати слово, щоб бути в GET, тому що користувач збирається використовувати URL і невідповідно розкривати їхнє слово.

Хоча, GET і POST є еквівалентно приємним для інтерпретації, щоб добре розібратися малих людей, якщо ви не розробляєте TLS/SSL для захисту мережі підключення до неї.

Всі форми мають бути HTTP (зазвичай port 80) є додатковим, і сьогодні (2017), там є багато хороших умов для громадських веб-сайтів, щоб не використовувати HTTPS (який є принципово HTTP + Transport Layer Security).

Як bonus, якщо ви використовуєте TLS ви, мінімізуйте ризик ваших користувачів, щоб отримати код (ADs), вмикається в свій транспорт, що не буде йти там.

В основному передачі параметрів з форс використовуються методи POST і GET . Головна відмінність методів POST та GET полягає у способі передачі інформації. У методі GET параметри передаються через рядок адреси (URL ), тобто. у HTTP-заголовку запиту, тоді як у методі POST параметри передаються через тіло HTTP-запиту і ніяк не відображаються в адресному рядку.

1. Кнопки - Тег

Тег створює на веб-сторінці кнопки і нагадує результат, одержуваний за допомогою тега (з параметром type="button | reset | submit" ). На відміну від цього тега, пропонує розширені можливості створення кнопок. Наприклад, на подібній кнопці можна розміщувати будь-які елементи HTML, у тому числі зображення. Використовуючи стилі, можна визначити вид кнопки шляхом зміни шрифту, кольору фону, розмірів та інших параметрів.

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

Параметри:

disabled - блокує доступ та зміну елемента.

type - тип кнопки

value - Значення кнопки, яке буде надіслано на сервер або прочитано за допомогою сприптів.

Кнопка з текстом

Параметр DISABLED Блокує доступ та зміну кнопки. Вона у такому разі відображається сірою та недоступною для активації користувачем. Крім того, така кнопка не може отримати фокус шляхом натискання клавіші Tab , мишею або іншим способом. Проте такий стан кнопки можна змінювати через скрипти.

Активна кнопка Неактивна кнопка

Параметр TYPE Визначає тип кнопки, який визначає її поведінку у формі. На вигляд кнопки різного типу ніяк не відрізняються, але у кожної такої кнопки свої функції. Значення за замовчуванням: button .

Аргументи:

button - Звичайна кнопка.

reset - Кнопка для очищення введених даних форми та повернення значень у початковий стан.

Submit - Кнопка для надсилання даних форми на сервер.

Очистити форму Надіслати форму

Параметр VALUE Визначає значення кнопки, яке буде надіслано на сервер. На сервер відправляється пара "ім'я=значення", де ім'я задається параметром name тега , а значення - параметром value . Значення може, як збігатися з текстом на кнопці, так і самостійним. Також параметр value використовується для доступу до даних через скрипти.

Надіслати форму

1.1. Кнопка (input type = button) 1.2. Кнопка із зображенням (input type=image) Кнопка з малюнком

Кнопки із зображеннями аналогічні дії кнопці Submit , але є малюнок. Для цього задаємо type=image та src="image.gif" .

Коли користувач клацне десь на зображенні, відповідна форма буде передана на сервер із двома додатковими змінними - sub_x і sub_y. Вони містять координати натискання користувача на зображення. Досвідчені програмісти можуть помітити, що насправді імена змінних, відправлених браузером, містять точку, а не підкреслення, але PHP автоматично конвертує точку підкреслення.

1.3. Кнопка надсилання форми (input type=submit)

Служить для надсилання форми сценарію. При створенні кнопки для надсилання форми необхідно вказати 2 атрибути: type="submit" та value="Текст кнопки" . Атрибут name необходим, если кнопка не одна, а несколько и все они созданы для разных операций, например кнопки "Сохранить", "Удалить", "Редактировать" и т.д. После нажатия на кнопку сценарию передается строка имя=текст кнопки.!}

РНР-сценарій не потрібний.

1.4. Масив кнопок (submit) для вибору варіанта дій 2. Кнопка скидання форми (Reset)

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

РНР-сценарій не потрібний.

3. Прапорець (checkbox)

Прапорці checkbox пропонують користувачеві низку варіантів, і дозволяє довільний вибір (жодного, одного або кількох з них).

Білий
Зелений
Синій
червоний
Чорний

// перший набір кнопок
// другий набір кнопок
// третій набір кнопок

5. Текстове поле (text)

При створенні звичайного текстового поля розміром size та максимальної допустимої довжини maxlength символів, атрибут type набуває значення text . Якщо вказано параметр value , то поле відображатиме вказаний у змінній value. Під час створення поля не забувайте вказувати ім'я поля, т.к. цей атрибут є обов'язковим.

6. Поле для введення пароля (password)

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

7. Приховане текстове поле (hidden)

Дозволяє передавати сценарію якусь службову інформацію, не відображаючи її на сторінці.

8. Список, що випадає (select)

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

Список починається з парних тегів. Теги дають змогу визначити вміст списку, а параметр value визначає значення рядка. Якщо в тегу вказано параметр selected , то рядок спочатку буде обраним. Параметр size задає, скільки рядків займатиме список. Якщо size дорівнює 1, то список буде випадаючим. Якщо вказано атрибут multiple , дозволено вибирати кілька елементів зі списку. Але ця схема практично не використовується, а при size = 1 немає сенсу.

Білий Зелений Синій Червоний Чорний

Якщо необхідно створити випадаючий із передбачуваною послідовністю. Наприклад, список із роками з 2000 по 2050. То використовується наступний прийом.

9. Багаторядкове поле введення тексту (textarea)

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

Існує параметр wrap – завдання перенесення рядків. Можливі значення:

off - відключає перенесення рядків;

virtuals - показує перенесення рядків, але відправляє текст, як він введений;

physical - перенесення рядків залишаються у вихідному вигляді.

За промовчанням тег створює порожнє поле шириною 20 символів і складається з 2 рядків.


Для того, щоб у багаторядковому текстовому полі дотримувалося html-форматування (перенесення рядків за допомогою тега
або
), то використовуйте функцію nl2br() :

Спочатку вставлений рядок 1 Спочатку вставлений рядок 2 Спочатку вставлений рядок 3

10. Кнопка завантаження файлів (browse)

Служить для завантаження файлів на сервер. При створенні текстового поля також необхідно вказати тип поля типу як "file" .

Завантажити файл:

СПОСОБИ СПІЛКУВАННЯ БРАУЗЕРА З СЕРВЕРОМ

Способів, що надаються протоколом HTTP, небагато. Це важлива інформація. Жодних інших способів немає. На практиці використовуються два: GET - це коли дані передаються в адресному рядку, наприклад, коли користувач тисне посилання. POST – коли він натискає кнопку у формі.

Метод GET

Щоб передати дані методом GET не треба створювати на HTML-сторінці форму (використовувати форми для запитів методом GET вам ніхто не забороняє - але це тупість) - достатньо посилання на документ з додаванням рядка запиту, який може виглядати як змінний = значення пари об'єднуються за допомогою амперсанд & а до URL сторінки рядок приєднується за допомогою знака запитання «? ».

Але можна не використовувати пари ключ = значення якщо треба передати лише одну змінну для цього треба після знака питання написати ЗНАЧЕННЯ (не ім'я) змінної.

Перевага передачі параметрів таким способом полягає в тому, що клієнти які не можуть використовувати метод POST (наприклад, пошукові машини) все ж таки зможуть просто пройшовши за посиланням передати параметри скрипту і отримати вміст.

Недолік в тому, що просто змінивши параметри в адресному рядку користувач може повернути хід сценарію непередбачуваним чином, це створює величезну дірку в безпеці у поєднанні з невизначеними змінними і register_globals on або хтось може дізнатися значення важливої ​​змінної (наприклад ID-сесії) просто подивившись на екрані монітора.

Для доступу до загальнодоступних сторінок із передачею параметрів (підвищення функціональності)

Передача інформації, що не впливає на рівень безпеки

Для доступу до захищених сторінок із передачею параметрів

Для передачі інформації, що впливає на рівень безпеки

Для передачі інформації, що не підлягає модифікації користувачем (деякі передають текст SQL-запитів).

Метод POST

Надіслати дані методом POST можна лише за допомогою форми на HTML сторінці. Основна відмінність POST від GET в тому, що дані передаються не в заголовку запиту а в тілі, тому користувач їх не бачить. Модифікувати може лише змінивши саму форму.

Перевага:

Велика безпека та функціональність запитів за допомогою форм методом POST.

Недолік:

Найменша доступність.

Для чого слід використовувати:

Для передачі великого обсягу інформації (текст, файли...);

Для передачі будь-якої важливої ​​інформації;

Для обмеження доступу (наприклад, використовувати для навігації лише форму – можливість доступна не всім програмам-роботам або грабберам-контенту).

Для чого не слід використовувати:

Нема обмежень.

Завантаження файлів методом POST

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

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

//Форма для завантаження файлів Надіслати цей файл:

У наведеному вище прикладі "_URL_" необхідно замінити посиланням на PHP-скрипт. Приховане поле MAX_FILE_SIZE (значення необхідно вказувати в байтах) має передувати полю для вибору файлу, і його значення є максимально допустимим розміром файлу. Також слід переконатися, що в атрибутах форми ви вказали enctype="multipart/form-data" , інакше завантаження файлів на сервер не виконуватиметься.

Увага

Опція MAX_FILE_SIZE є рекомендацією браузеру, навіть якби PHP також перевіряв цю умову. Обійти це обмеження на стороні браузера досить просто, тому ви не повинні покладатися на те, що всі файли більшого розміру будуть блоковані за допомогою цієї можливості. Тим не менш, обмеження PHP щодо максимального розміру обійти неможливо. Ви в будь-якому випадку повинні додавати змінну форми MAX_FILE_SIZE , тому що вона запобігає тривожному очікуванню користувачів при передачі величезних файлів, тільки для того, щоб дізнатися, що файл занадто великий і передача фактично не відбулася.

Як визначити спосіб запиту?

Безпосередньо:

Getenv("REQUEST_METHOD");

поверне GET або POST.

Який спосіб слід застосовувати?

Якщо форма служить запиту певної інформації, наприклад - під час пошуку, її слід відправляти методом GET . Щоб можна було оновлювати сторінку, можна було поставити закладку та надіслати посилання другу.

Якщо ж у результаті відправки форми дані записуються чи змінюються на сервері, слід їх відправляти методом POST , причому обов'язково після обробки форми треба перенаправити браузер методом GET . Так само, POST може знадобитися, якщо на сервер треба передати великий обсяг даних (у GET він сильно обмежений), а так само, якщо не слід "світити" дані в адресному рядку (при введенні логіна і пароля, наприклад).

У будь-якому випадку, після обробки POST треба завжди перенаправити браузер на якусь сторінку, нехай ту саму, але вже без даних форми, щоб при оновленні сторінки вони не записувалися повторно.

Як передати дані до іншого файлу безпосередньо з тіла PHP-програми методом GET та POST? Наприклад, для демонстрації відправлення даних методом POST та GET одночасно та отримання відповіді від сервера.

У статті докладно йдеться про використання змінної PHP _SELF.

Що за змінна PHP _SELF?

Змінна PHP _SELF повертає ім'я та шлях до поточного файлу (щодо кореня документа). Ви можете використовувати цю змінну в атрибуті форми action. Існують також деякі нюанси, які ви маєте знати. Ми, звичайно, ніяк не можемо обминути ці нюанси.

Давайте розглянемо кілька прикладів.

Echo $_SERVER["PHP_SELF"];

1) Припустимо, що ваш php файл розташований за наступною адресою:

http://www.yourserver.com/form-action.php

У цьому випадку змінна PHP _SELF міститиме:

"/form-action.php"

2) Припустимо, ваш php файл розташований за такою адресою:

http://www.yourserver.com/dir1/form-action.php

PHP _SELF буде:

"/dir1/form-action.php"

PHP _SELF в атрибуті форми action. Навіщо вона там знадобилася?

Зазвичай змінну PHP _SELF використовують у атрибуті action тега form . В атрибуті action вказується адреса, за якою буде надіслано зміст форми після підтвердження (клік користувачем по кнопці з type="submit"). Як правило це та сама сторінка, з якої пішла форма.

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

Змінна PHP _SELF позбавить вас зайвих виправлень, оскільки адреса сторінки буде генеруватися автоматично, виходячи з назви файлу.

Допустимо, у вас є файл з формою form-action.php, і ви хочете, щоб після підтвердження форма відправлялася на той самий файл. Зазвичай пишуть так:

Але ви можете використовувати змінну PHP _SELF замість form-action.php. У цьому випадку код виглядатиме: