Trimite php imaginar. Formulare HTML: formular php - trimiteți o solicitare către aceeași pagină. Cum să evitați problemele cu PHP _SELF

M-am gândit mult timp la ce titlu să dau acestui articol și nu am putut găsi ceva mai bun. Acesta este singurul titlu care reflectă măcar într-un fel esența celor afirmate. Sincer să fiu, nu știu cum se numește corect, așa că am numit articolul în același mod în care am încercat să găsesc măcar câteva informații într-un motor de căutare pe această temă.

Pe unul dintre site-uri, trebuia să folosesc două butoane de trimitere într-un singur formular, care ar trimite datele completate către diferiți „handlers” PHP, în funcție de momentul în care a fost apăsat butonul. Google nu mi-a răspuns nimic rezonabil, se pare că nu l-am întrebat în mod corect, așa că a trebuit să vin eu însumi.

Așa că l-am expus pentru a vă lua în considerare.

Esența problemei

După ce l-am implementat eu, am găsit în continuare câteva soluții care se bazau pe utilizarea butoanelor obișnuite la care era înșurubat JS.

Mi-am implementat planul aproape în același mod, dar am folosit tipul de trimitere standard. Totul pare să funcționeze și după părerea mea soluția mea este mai corectă din punct de vedere logic.

Această soluție va funcționa la fel de bine atât pe găzduire gratuită, cât și dacă alegeți găzduire profesională. Această metodă este implementată în întregime pe partea clientului și nu ar trebui să încetinească serverul.

Pentru a fi mai ușor de înțeles ce vreau și cum funcționează, iată un exemplu cu adevărat funcțional, sub forma unui formular care are 2 trimiteri care trimit date pe pagini diferite.

Unul dintre lucrurile grozave despre PHP este modul în care funcționează cu formularele HTML. Principalul lucru aici este că fiecare element de formular devine automat disponibil pentru programele dumneavoastră PHP. Pentru informații detaliate despre utilizarea formularelor în PHP, citiți secțiunea. Iată un exemplu de formular HTML:

Exemplul #1 Cel mai simplu formular HTML

Numele dumneavoastră:

Vârsta ta:

Nu este nimic special în această formă. Acesta este un formular HTML obișnuit, fără etichete speciale. Când utilizatorul completează formularul și face clic pe butonul de trimitere, pagina action.php va fi apelată. Acest fișier ar putea avea ceva de genul:

Exemplul #2 Afișarea datelor din formular

Buna ziua, .
Esti batran.

Exemplu de ieșire a acestui program:

Bună, Sergey. Ai 30 de ani.

Dacă nu țineți cont de bucățile de cod cu htmlspecialchars() și (int), principiul de funcționare al acestui cod ar trebui să fie simplu și de înțeles. htmlspecialchars() asigură că caracterele HTML „speciale” sunt codificate corect, astfel încât HTML sau Javascript rău intenționat să nu fie inserat în pagina dvs. Câmpul de vârstă, despre care știm că ar trebui să fie un număr, îl putem converti pur și simplu într-un număr întreg, care va scăpa automat de caracterele nedorite. PHP poate face acest lucru automat folosind extensia de filtru. Variabilele $_POST["nume"] și $_POST["vârstă"] sunt setate automat pentru dvs. de PHP. Anterior am folosit variabila superglobală $_SERVER, dar aici folosim și variabila superglobală $_POST, care conține toate datele POST. observa asta metoda de trimitere(metoda) din formularul nostru este POST. Dacă am folosi metoda OBȚINE, atunci informațiile din formular ar fi în variabila superglobală $_GET . Alternativ, puteți utiliza variabila $_REQUEST dacă sursa de date nu contează. Această variabilă conține un amestec de date GET, POST, COOKIE.

acum 15 ani

Conform specificației HTTP, ar trebui să utilizați metoda POST atunci când utilizați formularul pentru a schimba starea ceva la capătul serverului. De exemplu, dacă o pagină are un formular care să permită utilizatorilor să-și adauge propriile comentarii, ca acesta aici, formularul ar trebui să utilizeze POST. Dacă faceți clic pe „Reîncărcare” sau „Actualizați” pe o pagină la care ați accesat printr-un POST, este aproape întotdeauna o eroare -- nu ar trebui să postați același comentariu de două ori -- motiv pentru care aceste pagini nu sunt marcate sau stocate în cache.

Ar trebui să utilizați metoda GET atunci când formularul dvs. scoate ceva de pe server și nu schimbă nimic. De exemplu, formularul pentru un motor de căutare ar trebui să folosească GET, deoarece căutarea într-un site Web nu ar trebui să schimbe nimic care i-ar putea interesa clientului, iar marcarea sau stocarea în cache a rezultatelor unei interogări din motorul de căutare este la fel de utilă ca marcarea sau stocarea în cache. o pagină HTML statică.

acum 2 ani

Merita clarificat:

POST nu este mai sigur decât GET.

Motivele pentru care alegeți GET vs POST implică diverși factori, cum ar fi intenția solicitării („trimiteți” informații?), dimensiunea cererii (există limite pentru cât de lungă poate fi o adresă URL și parametrii GET sunt trimiși în URL-ul) și cât de ușor doriți ca acțiunea să poată fi partajată -- De exemplu, Căutările Google sunt GET deoarece facilitează copierea și partajarea interogării de căutare cu altcineva, pur și simplu partajând adresa URL.

Securitatea este doar o considerație aici, datorită faptului că un GET este mai ușor de partajat decât un POST. Exemplu: nu doriți să fie trimisă o parolă de către GET, deoarece utilizatorul ar putea împărtăși adresa URL rezultată și își poate expune din neatenție parola.

Cu toate acestea, un GET și un POST sunt la fel de ușor de interceptat de către o persoană rău intenționată bine plasată dacă nu implementați TLS/SSL pentru a proteja conexiunea la rețea în sine.

Toate formularele trimise prin HTTP (de obicei portul 80) sunt nesigure, iar astăzi (2017), nu există multe motive întemeiate pentru ca un site web public să nu folosească HTTPS (care este în esență HTTP + Transport Layer Security).

Ca bonus, dacă utilizați TLS, minimizați riscul ca utilizatorii să primească cod (AD-uri) injectat în traficul dvs. care nu a fost introdus acolo de dvs.

Metodele POST și GET sunt utilizate în principal pentru a transfera parametrii din forțe. Principala diferență dintre metodele POST și GET este modul în care sunt transferate informațiile. În metoda GET, parametrii sunt trecuți prin bara de adrese (URL), adică. în antetul cererii HTTP, în timp ce în metoda POST parametrii sunt transmisi prin corpul solicitării HTTP și nu se reflectă în bara de adrese.

1. Butoane - Etichetă

Eticheta creează butoane pe o pagină web și acțiunea sa seamănă cu rezultatul obținut folosind eticheta (cu parametrul type="button | reset | submit"). Spre deosebire de această etichetă, oferă opțiuni avansate pentru crearea de butoane. De exemplu, pe un astfel de buton puteți plasa orice elemente HTML, inclusiv imagini. Folosind stiluri, puteți defini aspectul unui buton schimbând fontul, culoarea de fundal, dimensiunea și alți parametri.

În teorie, eticheta ar trebui să fie amplasată în interiorul formei stabilite de element. Cu toate acestea, browserele nu afișează un mesaj de eroare și funcționează corect cu eticheta dacă aceasta este întâlnită de la sine. Cu toate acestea, dacă trebuie să trimiteți rezultatul clicului pe buton către server, acesta trebuie să fie plasat într-un container. Eticheta de închidere este necesară.

Opțiuni:

dezactivat - blochează accesul și modificarea elementului.

tip - tip buton

value - Valoarea butonului care va fi trimisă la server sau citită folosind sprit-uri.

Buton cu text

Parametru DISABLED Blochează accesul și modificarea butonului. În acest caz, este afișat gri și nu poate fi activat de către utilizator. În plus, un astfel de buton nu poate obține focalizarea apăsând tasta Tab, folosind mouse-ul sau în alt mod. Cu toate acestea, starea acestui buton poate fi schimbată prin scripturi.

Buton activ Buton inactiv

Parametrul TYPE Specifică tipul de buton, care stabilește comportamentul acestuia pe formular. Diferitele tipuri de butoane nu diferă în niciun fel ca aspect, dar fiecare buton are propriile sale funcții. Valoare implicită: buton.

Argumente:

buton - Buton obișnuit.

resetare - Un buton pentru ștergerea datelor din formular introduse și pentru a readuce valorile la starea inițială.

Submit - Buton pentru trimiterea datelor din formular către server.

Ștergeți formularul Trimiteți formularul

Parametrul VALUE Specifică valoarea butonului care va fi trimis către server. O pereche „nume=valoare” este trimisă către server, unde numele este specificat de parametrul nume al etichetei, iar valoarea este specificată de parametrul valoare. Semnificația poate coincide fie cu textul de pe buton, fie poate fi independentă. Parametrul value este folosit și pentru a accesa date prin scripturi.

Trimiteți formularul

1.1. Buton (tip de intrare=buton) 1.2. Buton cu o imagine (tip de intrare = imagine) Buton cu poza

Butoanele cu imagini sunt similare în acțiune cu butonul Trimite, dar reprezintă o imagine. Pentru a face acest lucru, setați type=image și src="image.gif" .

Când utilizatorul face clic oriunde pe imagine, formularul corespunzător va fi trimis la server cu două variabile suplimentare - sub_x și sub_y . Acestea conțin coordonatele utilizatorului care dă clic pe imagine. Programatorii cu experiență pot observa că numele variabilelor trimise de browser conțin de fapt un punct mai degrabă decât un caracter de subliniere, dar PHP convertește automat punctul într-un caracter de subliniere.

1.3. Buton de trimitere formular (tip de intrare = trimitere)

Servește pentru a trimite formularul la script. Când creați un buton pentru a trimite un formular, trebuie să specificați 2 atribute: type="submit" și value="Button text)" . Атрибут name необходим, если кнопка не одна, а несколько и все они созданы для разных операций, например кнопки "Сохранить", "Удалить", "Редактировать" и т.д. После нажатия на кнопку сценарию передается строка имя=текст кнопки.!}

Nu este necesar un script PHP.

1.4. O serie de butoane (trimitere) pentru selectarea opțiunii de acțiune 2. Buton de resetare formular (Resetare)

Când faceți clic pe butonul de resetare, toate elementele formularului vor fi setate la starea care a fost specificată în atributele implicite, iar formularul nu va fi trimis.

Nu este necesar un script PHP.

3. Casetă de selectare

Casetele de selectare prezintă utilizatorului un număr de opțiuni și permit o selecție arbitrară (niciuna, una sau mai multe dintre ele).

alb
Verde
Albastru
roșu
Negru

// primul set de butoane
// al doilea set de butoane
// al treilea set de butoane

5. Câmp de text (text)

Când se creează un câmp de text obișnuit cu dimensiunea mărimii și lungimea maximă permisă a caracterelor de lungime maximă, atributul type preia valoarea text . Dacă parametrul valoare este specificat, câmpul va afișa valoarea specificată în variabilă. Când creați un câmp, nu uitați să specificați numele câmpului, deoarece... acest atribut este obligatoriu.

6. Câmpul pentru parolă

Exact la fel ca un câmp de text, cu excepția faptului că caracterele tastate de utilizator nu vor fi afișate pe ecran.

7. Câmp de text ascuns (ascuns)

Vă permite să transmiteți câteva informații de serviciu către script fără a le afișa pe pagină.

8. Listă drop-down (selectați)

O etichetă este o listă derulantă sau extinsă și unul sau mai multe rânduri pot fi selectate în același timp. Dar valoarea va fi transmisă ultimului buton selectat.

Lista începe cu etichete asociate. Etichetele vă permit să definiți conținutul listei, iar parametrul value definește valoarea șirului. Dacă parametrul selectat este specificat în etichetă, atunci rândul va fi selectat inițial. Parametrul dimensiune specifică câte linii va ocupa lista. Dacă dimensiunea este 1, atunci lista va fi un drop-down. Dacă este specificat atributul multiplu, atunci pot fi selectate mai multe elemente din listă. Dar această schemă practic nu este utilizată, iar cu dimensiunea = 1 nu are sens.

Alb Verde Albastru Roșu Negru

Dacă trebuie să creați un drop-down cu o secvență previzibilă. De exemplu, o listă cu anii de la 2000 la 2050. Apoi se folosește următoarea tehnică.

9. Câmp de introducere a textului pe mai multe linii (zona text)

Un câmp de introducere a textului cu mai multe linii vă permite să trimiteți nu doar o singură linie, ci mai multe deodată. Dacă este necesar, puteți specifica atributul readonly, care interzice editarea, ștergerea și modificarea textului, de exemplu. textul va fi doar pentru citire. Dacă este necesar ca textul să fie afișat inițial într-un câmp de introducere cu mai multe linii, atunci acesta trebuie plasat între etichete.

Există un parametru de împachetare - setarea împachetare a liniei. Valori posibile:

off - dezactivează împachetarea liniei;

virtuale - arată întreruperile de rând, dar trimite textul așa cum a fost introdus;

fizice - rupturile de linie sunt lăsate în forma lor originală.

În mod implicit, eticheta creează un câmp gol care are 20 de caractere lățime și este format din 2 rânduri.


Pentru ca un câmp de text cu mai multe linii să respecte formatarea html (încadrarea liniilor folosind eticheta
sau
), apoi utilizați funcția nl2br():

Linia 1 inserată inițial Linia 2 inserată inițial Linia 3 inserată inițial

10. Buton pentru încărcarea fișierelor (parcurge)

Servește pentru a implementa încărcarea fișierelor pe server. Când creați un câmp de text, trebuie să specificați și tipul câmpului ca „fișier” .

Incarca fisier:

MODALITATE DE COMUNICARE BROWSERUL CU SERVERUL

Există puține metode oferite de protocolul HTTP. Aceasta este o informație importantă. Nu există alte căi. În practică, sunt utilizate două: GET este atunci când datele sunt transferate în bara de adrese, de exemplu, când utilizatorul face clic pe un link. POST - când dă clic pe un buton din formular.

metoda GET

Pentru a transfera date folosind metoda GET, nu trebuie să creați un formular pe o pagină HTML (nimeni nu vă interzice să utilizați formulare pentru cereri folosind metoda GET - dar asta este o prostie) - doar un link către document cu adăugarea de un șir de interogare care poate arăta ca o pereche variabilă=valoare este combinat folosind un ampersand & și șirul este atașat la adresa URL a paginii folosind un semn de întrebare „? "

Dar nu trebuie să utilizați perechi cheie=valoare dacă trebuie să treceți doar o variabilă; pentru a face acest lucru, trebuie să scrieți VALOAREA (nu numele) variabilei după semnul întrebării.

Avantajul transmiterii parametrilor în acest fel este că clienții care nu pot folosi metoda POST (de exemplu, motoarele de căutare) pot transmite pur și simplu parametrii către script, urmând linkul și primesc conținutul.

Dezavantajul este că, prin simpla schimbare a parametrilor din bara de adrese, utilizatorul poate întoarce scriptul într-un mod imprevizibil, acest lucru creează o gaură uriașă de securitate atunci când este combinat cu variabile nedefinite și register_globals activat sau cineva ar putea afla valoarea unei variabile importante. (precum ID-ul sesiunii) doar privind pe ecranul monitorului.

Pentru a accesa pagini publice prin transmiterea de parametri (funcționalitate sporită)

Transfer de informații care nu afectează nivelul de securitate

Pentru a accesa paginile protejate cu parametrii trecuți

Pentru a transmite informații care afectează nivelul de securitate

Pentru a transmite informații care nu pot fi modificate de către utilizator (unii transmit textul interogărilor SQL.

metoda POST

Puteți trimite date folosind metoda POST numai folosind un formular pe o pagină HTML. Principala diferență dintre POST și GET este că datele sunt transmise nu în antetul cererii, ci în body, prin urmare utilizatorul nu le vede. Poate fi modificat doar prin schimbarea formularului în sine.

Avantaj:

Securitate și funcționalitate sporite pentru cererile folosind formulare POST.

Defect:

Disponibilitate mai mică.

La ce ar trebui să-l folosești:

Pentru a transmite o cantitate mare de informații (text, fișiere..);

Pentru a transmite orice informație importantă;

Pentru a restricționa accesul (de exemplu, utilizați doar formularul pentru navigare - o opțiune care nu este disponibilă tuturor programelor robot sau aplicatorilor de conținut).

Pentru ce nu trebuie folosit:

Fara restrictii.

Încărcarea fișierelor folosind metoda POST

PHP este capabil să accepte un fișier descărcat folosind orice browser. Acest lucru face posibilă încărcarea atât a fișierelor text, cât și a fișierelor binare. În combinație cu autentificarea PHP și funcțiile sistemului de fișiere, aveți control deplin asupra cui este permis să încarce fișiere și ce să facă cu fișierul odată ce acesta a fost încărcat.

Pagina de încărcare a fișierelor poate fi implementată folosind un formular special care arată cam așa:

//Formular pentru încărcarea fișierelor Trimiteți acest fișier:

În exemplul de mai sus, „_URL_” trebuie înlocuit cu un link către scriptul PHP. Câmpul ascuns MAX_FILE_SIZE (valoarea trebuie specificată în octeți) trebuie să preceadă câmpul de selecție a fișierului, iar valoarea acestuia este dimensiunea maximă permisă pentru a fi acceptată. De asemenea, ar trebui să vă asigurați că specificați enctype="multipart/form-data" în atributele formularului, altfel fișierele nu vor fi încărcate pe server.

Atenţie

Opțiunea MAX_FILE_SIZE este o recomandare de browser, chiar dacă PHP ar verifica și această condiție. Ocolirea acestei limitări din partea browserului este destul de ușoară, așa că nu ar trebui să vă bazați pe această funcție pentru a bloca toate fișierele mai mari. Cu toate acestea, nu există nicio modalitate de a ocoli limita de dimensiune maximă a PHP. Ar trebui să adăugați oricum o variabilă de forma MAX_FILE_SIZE, deoarece împiedică utilizatorii să aștepte cu nerăbdare în timp ce transferă fișiere uriașe, doar pentru a afla că fișierul este prea mare și că transferul a eșuat efectiv.

Cum se definește o metodă de solicitare?

Direct:

Getenv("RECQUEST_METHOD");

va returna GET sau POST.

Ce metodă ar trebui folosită?

Dacă formularul este folosit pentru a solicita anumite informații, de exemplu în timpul unei căutări, atunci acesta ar trebui trimis folosind metoda GET. Pentru a putea actualiza pagina, puteți să o marcați și sau să trimiteți linkul unui prieten.

Dacă, în urma trimiterii unui formular, datele sunt înregistrate sau modificate pe server, atunci acestea ar trebui trimise prin metoda POST, iar după procesarea formularului, este imperativ să redirecționați browserul folosind metoda GET. De asemenea, POST poate fi necesar dacă o cantitate mare de date trebuie transferată pe server (pentru GET este foarte limitată) și, de asemenea, dacă datele transferate nu ar trebui să fie afișate în bara de adrese (la introducerea unui login și a unei parole, de exemplu).

În orice caz, după procesarea POST-ului, ar trebui să redirecționați întotdeauna browserul către o anumită pagină, chiar și aceeași, dar fără datele din formular, astfel încât atunci când pagina este reîmprospătată, acestea să nu fie înregistrate din nou.

Cum se transferă date într-un alt fișier direct din corpul unui program PHP folosind metodele GET și POST? Un exemplu pentru a demonstra trimiterea datelor folosind metodele POST și GET simultan și primirea unui răspuns de la server.

Acest articol intră în detaliu despre utilizarea variabilei PHP _SELF.

Ce este variabila PHP _SELF?

Variabila PHP _SELF returnează numele și calea fișierului curent (relativ cu rădăcina documentului). Puteți utiliza această variabilă în atributul de acțiune al formularului. Există și câteva nuanțe pe care ar trebui să le cunoașteți. Desigur, nu putem ignora aceste nuanțe.

Să ne uităm la câteva exemple.

Echo $_SERVER["PHP_SELF"];

1) Să presupunem că fișierul dvs. php se află la următoarea adresă:

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

În acest caz, variabila PHP _SELF va conține:

„/form-action.php”

2) Să presupunem că fișierul dvs. php se află la această adresă:

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

PHP_SELF va fi:

„/dir1/form-action.php”

PHP _SELF în atributul de acțiune al formularului. De ce era nevoie de ea acolo?

De obicei, variabila PHP _SELF este utilizată în atributul de acțiune al etichetei formular. Atributul acțiune specifică adresa la care va fi trimis conținutul formularului după confirmare (utilizatorul dă clic pe butonul cu tip="submit"). De regulă, aceasta este aceeași pagină din care a plecat formularul.

Cu toate acestea, dacă redenumiți fișierul la care face referire formularul, va trebui să redenumiți numele fișierului în atributul acțiune, altfel formularul nu va funcționa.

Variabila PHP _SELF vă va scuti de corecții inutile, deoarece adresa paginii va fi generată automat pe baza numelui fișierului.

Să presupunem că aveți un fișier formular numit form-action.php și doriți ca formularul să fie trimis în același fișier după confirmare. De obicei ei scriu astfel:

Dar puteți folosi variabila PHP _SELF în loc de form-action.php. În acest caz, codul va arăta astfel: