Procesăm cererile POST în PHP. Transferul și procesarea parametrilor de solicitare HTTP folosind PHP Procesarea solicitărilor HTTP PHP

Formularele HTML permit trimiterea datelor introduse de utilizator către un server, unde pot fi procesate în continuare. Întreținerea formularului se realizează în două etape. Formularul trebuie mai întâi prezentat utilizatorului, care îl va completa cu datele sale și apoi îl va trimite pe server. Fiecare formular are o pagină web de destinație care trebuie încărcată pentru a procesa datele transmise de utilizator. Acesta este adesea același fișier script care generează formularul. În acest caz, codul PHP pur și simplu verifică datele din formular pentru a determina dacă să apeleze din nou scriptul pentru a crea formularul sau să înceapă procesarea datelor primite.

Atenţie! Lecția este depășită. Lecții noi pe acest subiect sunt conținute în cursul PHP pentru începători.

În cele mai multe cazuri, trimiterea formularelor către server implică un fel de lucru în baza de date. De exemplu, o operațiune de căutare în baza de date este o acțiune necesară pentru cele mai diverse aplicații, fie că este vorba de căutarea în postări de forum, utilizatori sau blog. În orice caz, această operațiune poate face viața mai ușoară utilizatorului. Deoarece În acest moment, nu ne-am familiarizat încă cu interacțiunea dintre PHP și SGBD-ul MySQL, în acest articol vom analiza exemple simple de procesare a formularelor, iar sarcina principală pentru mine este să arăt cum sunt transferate informațiile folosind limbajul PHP. .

Transferarea informațiilor folosind limbajul PHP

Această secțiune oferă informații de bază despre modul în care datele pot fi transferate între paginile web. Unele dintre aceste informații nu se referă exclusiv la tehnologia PHP, ci descriu interacțiunea dintre PHP și instrumentele HTML sau se referă la protocolul HTTP în sine.

Lipsa suportului de stat în protocolul HTTP

Cea mai importantă caracteristică a oricărei tehnologii web care ar trebui să fie întotdeauna reținută este faptul că protocolul HTTP în sine este apatrid. Aceasta înseamnă că fiecare solicitare HTTP (care în majoritatea cazurilor echivalează cu o solicitare de a primi și livra o singură resursă, cum ar fi o pagină HTML, un fișier .jpg, o foaie de stil etc.) este independentă de toate celelalte solicitări, nu include orice - informații despre identificarea clientului și nu lasă urme în memoria computerului.

Chiar dacă site-ul este conceput în așa fel încât navigarea, i.e. trecerea de la o pagină la alta are loc strict într-o direcție (să spunem că pagina 1 duce doar la pagina 2, care duce doar la pagina 3 etc.), instrumentele de suport pentru protocolul HTTP nu au informații și nu țin cont de faptul că un utilizator vizualizarea paginii 2 trebuie să fi vizitat pagina 1 înainte de a face acest lucru. Nu puteți atribui o valoare unei variabile de pe pagina 1 și vă așteptați să fie importată în pagina 2 folosind HTML. Codul HTML poate fi folosit pentru a afișa un formular, iar acest cod poate fi folosit chiar și pentru a introduce informații, dar dacă nu sunt utilizate mijloace suplimentare pentru a transfera informațiile introduse pe o altă pagină sau pe altă pagină, valoarea atribuită variabilei va dispărea pur și simplu după mutare. la o altă pagină.

Tehnologiile de procesare a formularelor precum PHP sunt concepute special pentru a rezolva această problemă. Instrumentele PHP vă permit să interceptați valoarea unei variabile care este transmisă de la pagina anterioară la următoarea și oferă acces la această valoare pentru utilizare ulterioară. După cum se dovedește, tehnologia PHP oferă posibilitatea de a efectua aceste tipuri de funcții de transfer de date extrem de bine, astfel încât vă permite să implementați rapid și ușor instrumentele necesare pentru a rezolva o mare varietate de probleme asociate cu asigurarea funcționării unui site web.

Formularele HTML oferă o modalitate convenabilă de a trece un număr mic de valori de la o anumită pagină la orice altă pagină de pe un site web. Există și alte modalități de a menține starea în multe vizualizări de pagină care sunt mai durabile, cum ar fi cookie-urile și sesiunile, care vor fi tratate într-un articol viitor. Acest articol se concentrează în principal pe cele mai simple moduri de a transfera informații între pagini web, care utilizează metodele GET și POST în combinație cu protocolul HTTP pentru a crea pagini generate dinamic și a procesa datele din formular.

GET parametrii

Metoda GET transmite parametrii de la pagina anterioară la următoarea ca parte a unui șir de interogare, care este reprezentat în formatul unui URI Uniform Resource Identifier. Când utilizați metoda GET pentru a procesa un formular, adresa URL identificată de atributul de acțiune al formularului este urmată de un semn de întrebare după delimitator, urmat de numele și valoarea (valorile) variabilei specificate, iar apoi întregul șir este transmis agentului de procesare (în acest caz, serverul web).

Mai jos este un exemplu de formular HTML care folosește metoda GET (tastați acest marcaj și salvați fișierul ca sportselect.html):

Bazele PHP

Alege sportul tău preferat

Odată ce utilizatorul face selecția și dă clic pe butonul Trimite, browserul va conecta următoarele elemente în ordinea afișată, fără spații între elemente:

  • URL între ghilimele după cuvântul acțiune (http://localhost/sports.php).
  • Un semn de întrebare (?) care indică faptul că următoarele caractere alcătuiesc un șir GET.
  • Variabila nume, semnul egal (=) și parametrul de valoare corespunzător (valoare=Hochei).
  • Ampersand (&) urmat de perechea nume=valoare (dacă există).

Deci, browserul va genera următorul șir URL:
http://localhost/sports.php?sport=Hochei

Browserul redirecționează apoi șirul URL rezultat în propriul spațiu de adrese ca o nouă solicitare. Scriptul PHP de mai jos (sports.php), la care este trimis formularul, preia valorile variabilei GET din ultima parte a șirului de interogare, inserează acele variabile și valori ale variabilelor în tabloul superglobal $_GET (care urmează să fie descris pe scurt) și efectuează unele acțiuni necesare cu aceste valori; în acest caz, inserarea are loc într-un șir de text.

Mai jos este un exemplu de cod care arată gestionarea formularului PHP pentru formularul HTML de mai sus:

Sportul preferat

Sportul tău preferat este

Rețineți că valoarea introdusă în câmpul formular HTML cu atributul name="sport" în pagina anterioară este acum disponibilă ca o variabilă PHP numită $_GET["sport"]. Următoarea figură demonstrează cum funcționează acest exemplu:

Acum trebuie să explicăm exact cum puteți accesa valorile transmise de la o pagină la alta. Acest articol discută cele două metode principale de transmitere a valorilor utilizate în formulare - GET și POST. Fiecare metodă are asociată o matrice superglobală. Matricele superglobale sunt descrise mai detaliat în articolul „Variabile și constante”. O caracteristică distinctivă a matricelor superglobale față de alte matrice este prezența unui prefix în nume sub forma unei liniuțe de subliniere.

Procesorul de formulare accesează fiecare element trimis folosind metoda GET accesând tabloul $_GET și fiecare element trimis folosind metoda POST accesând tabloul $_POST. Structura sintactică folosită pentru a accesa orice element al unui tablou superglobal este simplă și complet uniformă:

$_array_name["index_name"]

Aici, nume_index este porțiunea nume a perechii nume-valoare (pentru metoda GET) sau numele câmpului formular HTML (pentru metoda POST). Urmând exemplul anterior, $_GET["sport"] specifică valoarea elementului select al formularului numit "sport"; această valoare a fost transmisă folosind o operație GET efectuată pe fișierul original. Managerul de formulare trebuie să utilizeze o matrice corespunzătoare metodei prin care au fost transmise datele. Mai exact, în acest exemplu, valoarea lui $_POST["sport"] este nedefinită deoarece formularul original nu a trimis nicio dată folosind metoda POST.

Metoda GET de procesare a formularelor are un avantaj semnificativ față de metoda POST - vă permite de fapt să generați un șir de interogare URL nou de fiecare dată, potrivit situației curente. Utilizatorii pot apoi marca această pagină. Pe de altă parte, rezultatele trimiterilor de formulare folosind metoda POST nu pot fi marcate.

Doar pentru că funcționalitatea dorită poate fi obținută folosind parametrii GET nu înseamnă că trebuie utilizată metoda GET. Dezavantajele metodei GET care se găsesc în majoritatea tipurilor de procesare a formularelor sunt atât de semnificative. Specificația originală de lucru HTML 4.0, publicată în 1997, nu recomanda această metodă. Principalele dezavantaje ale metodei GET sunt enumerate mai jos:

  • Metoda GET nu este aplicabilă la crearea ferestrelor de înregistrare, deoarece numele de utilizator și parola sunt complet vizibile pe ecran și este posibil și ca aceste date să fie stocate în memoria browserului clientului ca informații despre pagina vizitată.
  • Fiecare operațiune de transfer GET, inclusiv setul de date în sine, este înregistrată pe serverul web.
  • Metoda GET atribuie date unei variabile de mediu server, astfel încât lungimea URL-ului este limitată. Este posibil să fi văzut cum arată URL-urile foarte lungi când sunt transmise folosind metoda GET și, într-adevăr, este puțin probabil ca cineva să dorească să trimită o bucată de text HTML de 300 de cuvinte folosind această metodă.

Specificația HTML originală prevedea că lungimea șirului de interogare nu trebuie să depășească 255 de caractere. Bineînțeles, această restricție a fost eliminată ulterior și a rămas doar recomandarea de a adera la limita de 255 de caractere, dar utilizarea liniilor mai lungi poate provoca încă perturbări.

Parametrii POST

În prezent, metoda preferată pentru trimiterea datelor din formular este POST (mai ales în cazurile în care efectuarea de acțiuni duce la modificări permanente, cum ar fi introducerea de informații într-o bază de date). Setul de date al formularului este inclus în corpul formularului atunci când formularul este redirecționat către agentul de procesare (în acest caz, interpretul PHP). Șirul URL nu suferă modificări vizibile pentru a reflecta varietatea de date transferate.

Există o credință nejustificată răspândită în rândul dezvoltatorilor că metoda POST este mai sigură decât GET. În realitate, nici una dintre metode nu este mai mult sau mai puțin sigură decât cealaltă. Un vizitator poate vizualiza variabilele și datele trimise folosind metoda POST la fel de bine ca și metoda GET. Singura diferență este că, în primul caz, datele transmise nu se găsesc în bara de adrese. Dar asta nu înseamnă că sunt ascunse. Datele trimise prin metoda POST pot fi vizualizate și modificate de către utilizatorul site-ului.

Prima și cea mai importantă regulă de programare, în special programarea în rețea, este aceasta:
Nu aveți încredere niciodată în datele de intrare.

Ar trebui să presupuneți întotdeauna că un vizitator ar putea fi modificat cu răutate sau chiar accidental datele care sunt transmise unei anumite aplicații, așa că trebuie să verificați cu atenție datele respective.

Datele transmise din formular sunt mai mult sau mai puțin sigure doar dacă cererea este securizată folosind SSL, TLS sau o altă metodă de criptare. Dar datele ajung în continuare la utilizatorul final sau la vizitator în formă clară, astfel încât acesta are în continuare posibilitatea de a vizualiza și modifica datele într-un fel sau altul. Cert este că protocolul SSL criptează pur și simplu datele transmise prin rețea, ceea ce nu permite ca datele să fie vizualizate în text clar în etapa trecerii lor de la expeditor la destinatar. În ceea ce privește capacitatea unui vizitator de a face modificări datelor din formular, protocolul SSL nu oferă nimic care să împiedice acest lucru.

Pentru a modifica modul în care datele sunt transferate în exemplul anterior, trebuie să faceți următoarele modificări:

...

Lucrul cu valori multiple

Dacă formularul are casete de selectare sau butoane radio, apare o nouă problemă. De exemplu, un utilizator poate selecta două valori simultan într-un formular, dar o variabilă nu poate stoca mai mult de o valoare, așa că va trebui utilizată o matrice. Această situație este demonstrată în exemplul de mai jos:

" method="post">
Alegeți-vă animalele de companie preferate

Animale selectate: "; foreach ($animal ca $a) ( ecou " „.htmlentities($a).”"; } } ?>

Acest formular permite utilizatorului să-și selecteze animalele de companie preferate. În acest exemplu, utilizatorul poate selecta mai multe casete de selectare simultan. Aceasta înseamnă că atunci când procesați datele formularului într-un script PHP, este necesar să oferiți posibilitatea de a accesa mai multe valori folosind un singur nume. Am plasat o pereche de paranteze drepte () după nume în atributul name pentru a putea trimite mai multe opțiuni ca matrice. Dacă parantezele pătrate au fost omise și utilizatorul a bifat mai multe casete de selectare, selecția lor ar fi suprascrisă de ultima casetă de selectare bifată. Punând paranteze pătrate după nume, am indicat că valorile ar trebui să fie stocate ca o matrice.

În handler, matricea este stocată în variabila $animal și enumerată folosind o buclă foreach, ca o matrice obișnuită.

Validarea formularului și formatarea variabilelor de formular

Când o aplicație primește date de la un utilizator, trebuie să le verifice de fiecare dată pentru corectitudine. Dacă nu verificați datele introduse de utilizator, puteți avea multe probleme, inclusiv riscuri de securitate. Efectuarea unei verificări a antecedentelor nu este atât de dificilă pe cât ar putea părea.

Este mai convenabil pentru utilizatori să verifice din partea clientului folosind JavaScript, dar indiferent dacă această verificare este utilizată, trebuie efectuată verificarea pe partea serverului.

Un alt lucru de luat în considerare atunci când creați formulare HTML este că, dacă formularul trebuie să afișeze intrare completată în prealabil, atunci atributul value trebuie setat. Acest punct este valabil mai ales pentru două tipuri de formulare - cele care sunt utilizate pentru a edita datele primite dintr-o bază de date și cele care sunt concepute pentru a transmite date de mai multe ori. Acest din urmă caz ​​este foarte frecvent în situațiile în care formularul trebuie re-afișat după ce sunt detectate erori în datele deja completate în prealabil. Un exemplu este un formular de înregistrare care nu acceptă date pentru prelucrare până când utilizatorul furnizează o adresă de e-mail validă sau alte date solicitate.

Exemplul de mai jos arată cum să procesați un formular, inclusiv validarea și procesarea pe partea serverului pe aceeași pagină de formular:

Bazele PHP

" method="post">
Informații de contact "clasa="">
"clasa="">

Acest exemplu folosește funcția filter_var(), care testează o variabilă folosind un filtru și ia doi parametri - un șir sursă și o constantă care indică tipul filtrului. Pe lângă validarea adreselor de e-mail (FILTER_VALIDATE_EMAIL), această funcție acceptă următoarele constante: FILTER_VALIDATE_URL - verifică valoarea pentru corectitudinea adresei URL (de exemplu), FILTER_VALIDATE_IP - verifică valoarea pentru corectitudinea adreselor IP, FILTER_VALIDATE_REGEXP - verifică valoarea pentru corectitudinea sintaxei expresiilor regulate și a altor câteva constante, care sunt alternative la funcțiile is_bool(), is_float(), is_int(), etc.

accesul la astfel de date a fost efectuat de numele variabilelor transferate (remintim că datele sunt transferate sub formă de perechi „nume variabilă, simbol „=", valoare variabilă”). Astfel, dacă, de exemplu, first_name=Nina a fost trecut, atunci în script a apărut variabila $first_name cu valoarea Nina. Dacă a fost necesar să se distingă prin ce metodă au fost transmise datele, atunci s-au folosit tablouri asociative $HTTP_POST_VARSŞi $HTTP_GET_VARS, ale căror chei erau numele variabilelor transferate, iar valorile au fost, respectiv, valorile acestor variabile. Astfel, dacă perechea prenume = Nina este trecută prin metoda OBŢINE, apoi $ HTTP_GET_VARS ["first_name"]="Nina".

Nu este sigur să folosiți numele variabilelor transmise direct într-un program. Prin urmare, s-a decis, începând cu PHP 4.1.0, să se folosească o matrice specială pentru a accesa variabilele transmise cu ajutorul cererilor HTTP - $_CERERE. Această matrice conține datele transmise de metode POSTŞi OBŢINE, precum și utilizarea cookie-urilor HTTP. Aceasta este o matrice asociativă superglobală, adică valorile sale pot fi obținute oriunde în program folosind numele variabilei corespunzătoare (elementul de formular) ca cheie.

Exemplul 4.2. Să presupunem că am creat un formular pentru a înregistra participanții la o școală de corespondență de programare, ca în exemplul de mai sus. Apoi, în fișierul 1.php care procesează acest formular, puteți scrie următoarele:

Apoi, dacă am introdus numele „Vasya”, numele de familie „Petrov” în formular și am selectat cursul PHP dintre toate cursurile, vom primi următorul mesaj pe ecranul browserului:

După introducerea matricei $_CERERE matrice $HTTP_POST_VARSŞi $HTTP_GET_VARS pentru consistență au fost redenumite în $_POSTŞi $_GET respectiv, dar ei înșiși nu au dispărut de la utilizare din motive de compatibilitate cu versiunile anterioare de PHP. Spre deosebire de predecesorii lor, matrice $_POSTŞi $_GET au devenit super-globale, adică accesibile direct și în interiorul funcțiilor și metodelor.

Să dăm un exemplu de utilizare a acestor matrice. Să presupunem că trebuie să procesăm un formular care conține elemente de intrare numite first_name , last_name , kurs (de exemplu, form.html de mai sus). Datele au fost transferate folosind metoda POST, și nu dorim să procesăm datele transmise prin alte metode. Acest lucru se poate face după cum urmează:

Apoi, pe ecranul browserului, dacă am introdus numele „Vasya”, numele de familie „Petrov” și am selectat cursul PHP dintre toate cursurile, vom vedea un mesaj, ca în exemplul anterior:

Pentru a menține capacitatea de a procesa scripturi mai devreme decât PHP 4.1.0, a fost introdusă o directivă register_globals, permițând sau interzicând accesul la variabile direct după numele lor. Dacă în fișierul de setări PHP parametrul register_globals =Activat, apoi variabilelor transmise serverului prin metode OBŢINEŞi POST, vă puteți referi pur și simplu la ei după numele lor (adică puteți scrie $first_name ). Dacă register_globals =Oprit, atunci trebuie să scrieți $ _CERERE [„prenume”] sau $ _POST [„nume”], $ _GET [„prenume”], $ HTTP_POST_VARS [„nume”], $ HTTP_GET_VARS [„nume”]. Din punct de vedere al securității, este mai bine să dezactivați această directivă (de ex. register_globals =Oprit). Când directiva este activată register_globals tablourile enumerate mai sus vor conține și datele transmise de client.

Uneori este nevoie de a afla semnificația unora variabila de mediu, cum ar fi metoda utilizată pentru transmiterea cererii sau adresa IP a computerului care a trimis solicitarea. Puteți obține astfel de informații folosind funcția getenv(). Returnează o valoare variabila de mediu, al cărui nume îi este transmis ca parametru.

Exemplul 4.3.

Folosind funcția getenv(). OBŢINE După cum am spus deja, dacă se folosește metoda

, apoi datele sunt transferate prin adăugarea unui șir de interogare sub forma perechilor „nume_variabilă=valoare” la adresa URL a resursei. Orice lucru după semnul de întrebare din URL poate fi preluat folosind comanda

getenv("QUERY_STRING"); OBŢINE Datorită acestei metode este posibil $_GET transmite date într-o altă formă. De exemplu, puteți specifica doar valorile mai multor parametri folosind un semn plus, iar în script puteți analiza șirul de interogare în părți sau puteți trece valoarea unui singur parametru. În acest caz, în matrice

va apărea un element gol cu ​​o cheie egală cu această valoare (întregul șir de interogare), iar caracterul „+” întâlnit în șirul de interogare va fi înlocuit cu un caracter de subliniere „_”. POST datele sunt transmise doar folosind formulare, iar utilizatorul (clientul) nu vede ce date sunt trimise la server. Pentru a le vedea, hackerul trebuie să înlocuiască formularul nostru cu al lui. Apoi serverul va trimite rezultatele procesării formularului incorect în locul greșit. Pentru a evita acest lucru, puteți verifica adresa paginii de pe care au fost trimise datele. Acest lucru se poate face din nou folosind funcția getenv():

getenv("HTTP_REFERER");

Acum este momentul să rezolvăm problema formulată la începutul prelegerii.

Exemplu de procesare a unei cereri folosind PHP

Să ne amintim care a fost sarcina și să clarificăm formularea acesteia. Trebuie să scrieți un formular pentru a înregistra participanții la școala de programare prin corespondență și, după înregistrare, trimiteți un mesaj participantului. Am numit acest mesaj o scrisoare universală, dar va fi ușor diferită de scrisoarea pe care am compus-o în prelegerea anterioară. Aici nici nu vom trimite nimic prin email, pentru a nu fi ca spammerii, ci pur și simplu vom genera acest mesaj și îl vom afișa pe ecranul browserului. Am furnizat deja versiunea inițială a formularului de înregistrare mai sus. O vom schimba astfel încât fiecare registrator să poată alege câte cursuri dorește să participe și nu vom confirma primirea formularului de înregistrare.

Formular de înregistrare a studenților

Nume

Nume

E-mail

Selectați cursul la care doriți să urmați:
PHP
Lisp
Perl
Unix

Ce vrei să știm despre tine?

Lista 4.4.

form_final.html

Totul aici este destul de simplu și clar. Singurul lucru de remarcat este modul în care sunt transmise valorile elementului casetă de selectare. Când scriem kurs în numele elementului, aceasta înseamnă că primul element de casetă de selectare bifat va fi scris în primul element al matricei kurs, a doua casetă de selectare bifată va fi scrisă în al doilea element de matrice etc. Puteți, desigur, să dați pur și simplu nume diferite elementelor casetei de selectare, dar acest lucru va complica prelucrarea datelor dacă există multe cursuri. Scriptul care va analiza și procesa toate acestea se numește 1.php (formularul se referă la acest fișier, care este scris în atributul său acţiune OBŢINE). Metoda implicită este folosită pentru trecere POST, dar am indicat

"14.30","Lisp" =>"12.00", "Perl" =>"15.00","Unix" =>"14.00"); $lectori = array("PHP"=>"Vasili Vasilievici", "Lisp"=>"Ivan Ivanovici", "Perl"=>"Petr Petrovici", "Unix"=>"Semyon Semenovici"); define("SEMNĂ","Cu respect, administrare");
// definește semnătura scrisorii ca o constantă define("MEETING_TIME","18.00");
// setați ora întâlnirii studenților $date = "12 mai"; // setează data prelegerilor // începe să compun textul mesajului $str = "Bună, dragă " . $_POST[„nume”] . " " . $_POST["nume"]."!
"; $str .="

    Vă informăm că "; $kurses = $_POST["kurs"]; // stochează în această variabilă // lista cursurilor selectate dacă (!isset($kurses)) ( // dacă nu este selectat niciun curs $event = " următoarea întâlnire a studenților" $str .= "$event va avea loc la $date ". "; ) else ( // dacă este selectat cel puțin un curs $event = "prelegerile pe care le-ați selectat vor avea loc $date
"; //funcția de numărare calculează numărul de elemente din tabloul $lect = ""; pentru ($i=0;$i
prelegere despre $k în $time[$k]"; // compune un mesaj $lect .= "(Lectorul tău, $lectorii[$k])"; ) $event = $event . $lect . " "; $str .= "$eveniment"; ) $str .= "

Concluzie

". SEMNA; // adaugă o semnătură echo $str; // afișează un mesaj pe ecran?>

Lista 4.5. Scriptul 1.php procesează formularul form_final.html Să rezumam. Am învățat să distingem un client de un server și un computer server de un program server, ne-am familiarizat cu metodele de bază folosite pentru a transfera date pe server, am studiat instrumentele oferite de limbajul PHP pentru procesarea cererilor clienților și le-am încercat în practică. . În principiu, acest lucru este suficient pentru a crea aplicații client-server. Conținutul formularului este codificat exact la fel ca și pentru metodă OBŢINE (vezi mai sus), dar în loc să adăugați o linie la URL Conținutul formularului este codificat exact la fel ca și pentru metodă conținutul cererii este trimis ca un bloc de date ca parte a operațiunii

POST . Dacă este prezent atributul ACTION, atunci valoarea, care se află acolo, determină unde să trimită acest bloc de date. Această metodă, după cum sa menționat deja, este recomandată pentru transferul de blocuri mari de date. (vezi mai sus), dar în loc să adăugați o linie la Informații introduse de utilizator și transmise server folosind metoda , este furnizat intrării standard în programul specificat în atribut acţiune

, sau scriptul curent dacă acest atribut este omis. Lungimea fișierului trimis este transmisă în (vezi mai sus), dar în loc să adăugați o linie la variabila de mediu CONTENT_LENGTH, iar tipul de date este în variabila CONTENT_TYPE. Transmite date folosind metoda Scriptul 1.php procesează formularul form_final.html. În consecință, puteți modifica valoarea parametrilor doar prin modificarea valorii introduse în formular. Când se utilizează (vezi mai sus), dar în loc să adăugați o linie la utilizatorul nu vede transmisia . Dacă este prezent atributul ACTION, atunci valoarea date.

Avantajul principal (vezi mai sus), dar în loc să adăugați o linie la cererile este securitatea și funcționalitatea lor mai mare în comparație cu cererile GET. Prin urmare metoda (vezi mai sus), dar în loc să adăugați o linie la Mai des folosit pentru a transmite informații importante, precum și informații la scară largă. Cu toate acestea, nu ar trebui să vă bazați în întregime pe securitatea acestui mecanism, deoarece datele (vezi mai sus), dar în loc să adăugați o linie la Solicitarea poate fi, de asemenea, falsificată, de exemplu prin crearea unui fișier html pe mașina dvs. și completarea acestuia cu datele necesare. Mai mult, nu toate clientii poate aplica metoda (vezi mai sus), dar în loc să adăugați o linie la, ceea ce limitează cazurile de utilizare.

La trimiterea datelor către server folosind orice metodă, se transmit nu doar datele introduse de utilizator, ci și un număr de variabile apelate variabile de mediu, caracterizand client, istoricul lucrării sale, căile către fișiere etc. Iată câteva dintre variabile de mediu:

    REMOTE_ADDR – adresa IP a gazdei (calculatorului) care trimite cererea;

    REMOTE_HOST – numele gazdei de la care a fost trimisă cererea;

    HTTP_REFERER – adresa paginii care face legătura cu scriptul curent;

    REQUEST_METHOD – metoda care a fost folosită la trimiterea cererii;

    QUERY_STRING – informațiile conținute în Conținutul formularului este codificat exact la fel ca și pentru metodă după semnul întrebării;

    SCRIPT_NAME – cale virtuală către programul de executat;

    HTTP_USER_AGENT – informații despre browserul care folosește client

Gestionarea cererilor folosind php

Până acum am menționat doar acele cereri client prelucrate la server folosind un program special. De fapt, acest program îl putem scrie singuri, inclusiv în PHP, și va face tot ce vrem cu datele primite. Pentru a scrie acest program, trebuie să vă familiarizați cu unele dintre regulile și instrumentele oferite în acest scop de PHP.

În cadrul unui script PHP există mai multe modalități de a accesa datele transmise client conform protocolului HTTP. Înainte de PHP 4.1.0, accesul la astfel de date era efectuat de numele variabilelor transferate (rețineți că datele sunt transferate sub formă de perechi „nume variabilă, simbol „=”, valoare variabilă”). Astfel, dacă, de exemplu, first_name=Nina a fost trecut, atunci în script a apărut variabila $first_name cu valoarea Nina. Dacă a fost necesar să se distingă prin ce metodă au fost transmise datele, atunci s-au folosit tablouri asociative $HTTP_POST_VARSŞi $HTTP_GET_VARS, ale căror chei erau numele variabilelor transferate, iar valorile au fost, respectiv, valorile acestor variabile. Astfel, dacă perechea first_name=Nina este trecută prin metoda Scriptul 1.php procesează formularul form_final.html, apoi $HTTP_GET_VARS["first_name"]="Nina".

Nu este sigur să folosiți numele variabilelor transmise direct într-un program. Prin urmare, s-a decis, începând cu PHP 4.1.0, să se folosească o matrice specială pentru a accesa variabilele transmise cu ajutorul cererilor HTTP - $_CERERE. Această matrice conține datele transmise de metode (vezi mai sus), dar în loc să adăugați o linie laŞi Scriptul 1.php procesează formularul form_final.html, și, de asemenea, cu ajutorul HTTP cookie-uri. Aceasta este o matrice asociativă superglobală, adică valorile sale pot fi obținute oriunde în program folosind numele variabilei corespunzătoare (elementul de formular) ca cheie.

Exemplul 4.2. Să presupunem că am creat un formular pentru a înregistra participanții la o școală de corespondență de programare, ca în exemplul de mai sus. Apoi, în file1.php care procesează acest formular, puteți scrie următoarele:

$str = "Bună ziua,

".$_REQUEST["prenume"]. "

„.$_REQUEST[„nume”].”!
";

$str .="Ați ales să studiați un curs în

".$_REQUEST["kurs"];

Exemplu 4.2. Fişier1.php,prelucrareformăform.html(html , TXT )

Apoi, dacă am introdus numele „Vasya”, numele de familie „Petrov” în formular și am selectat cursul PHP dintre toate cursurile, vom primi următorul mesaj pe ecranul browserului:

Bună, Vasya Petrov!

După introducerea matricei $_CERERE matrice $HTTP_POST_VARSŞi $HTTP_GET_VARS pentru consistență au fost redenumite în $_POSTŞi $_GET respectiv, dar ei înșiși nu au dispărut de la utilizare din motive de compatibilitate cu versiunile anterioare de PHP. Spre deosebire de predecesorii lor, matrice $_POSTŞi $_GET au devenit super-globale, adică accesibile direct și în interiorul funcțiilor și metodelor.

Să dăm un exemplu de utilizare a acestor matrice. Să presupunem că trebuie să procesăm un formular care conține elemente de intrare numite prenume, prenume, kurs (de exemplu, formularul de mai sus). Datele au fost transferate folosind metoda (vezi mai sus), dar în loc să adăugați o linie la, și nu dorim să procesăm datele transmise prin alte metode. Acest lucru se poate face după cum urmează:

$str = "Bună ziua,

„.$_POST [„prenume”].”

".$_POST ["nume"] ."!
";

$str .= „Ați ales să studiați un curs pe „.

Apoi, pe ecranul browserului, dacă am introdus numele „Vasya”, numele de familie „Petrov” și am selectat cursul PHP dintre toate cursurile, vom vedea un mesaj, ca în exemplul anterior:

Bună, Vasya Petrov!

Ați ales să studiați un curs PHP

Pentru a menține capacitatea de a procesa scripturi mai devreme decât PHP 4.1.0, a fost introdusă o directivă register_globals, permițând sau interzicând accesul la variabile direct după numele lor. Dacă parametrul register_globals=On în fișierul de setări PHP, atunci variabilele au trecut . Dacă este prezent atributul ACTION, atunci valoarea metode Scriptul 1.php procesează formularul form_final.htmlŞi (vezi mai sus), dar în loc să adăugați o linie la, îi puteți contacta pur și simplu după numele lor (adică puteți scrie $first_name). Dacă register_globals=Off, atunci trebuie să scrieți $_REQUEST["first_name"] sau $_POST["first_name"], $_GET["first_name"], $HTTP_POST_VARS["first_name"], $HTTP_GET_VARS["first_name"]. Din punct de vedere al securității, este mai bine să dezactivați această directivă (adică register_globals=Off). Când directiva este activată register_globals tablourile enumerate mai sus vor conține și datele transmise client.

Uneori este nevoie de a afla semnificația unora , este furnizat intrării standard în programul specificat în atribut, cum ar fi metoda utilizată pentru transmiterea cererii sau adresa IP a computerului care a trimis solicitarea. Puteți obține astfel de informații folosind funcția getenv(). Returnează o valoare variabila de mediu, al cărui nume îi este transmis ca parametru.

getenv("CERERE_METODA");

// va returna metoda folosită

echo getenv("REMOTE_ADDR");

// va afișa adresa IP a utilizatorului,

// cine a trimis cererea

Exemplul 4.3. Folosind funcția getenv() (html , TXT )

După cum am spus deja, dacă se folosește metoda Scriptul 1.php procesează formularul form_final.html, apoi datele sunt transmise prin adăugarea unui șir de interogare sub forma perechilor „variable_name=value to Conținutul formularului este codificat exact la fel ca și pentru metodă- adresa resursei." Tot ce este scris Conținutul formularului este codificat exact la fel ca și pentru metodă după semnul întrebării, poate fi obținut folosind comanda

, apoi datele sunt transferate prin adăugarea unui șir de interogare sub forma perechilor „nume_variabilă=valoare” la adresa URL a resursei. Orice lucru după semnul de întrebare din URL poate fi preluat folosind comanda

Datorită acestei metode este posibil Scriptul 1.php procesează formularul form_final.html transmite date într-o altă formă. De exemplu, puteți specifica doar valorile mai multor parametri folosind un semn plus, iar în script puteți analiza șirul de interogare în părți sau puteți trece valoarea unui singur parametru. În acest caz, în matrice $_GET va apărea un element gol cu ​​o cheie egală cu această valoare (întregul șir de interogare), iar caracterul „+” întâlnit în șirul de interogare va fi înlocuit cu o liniuță de subliniere „_”.

Metodă (vezi mai sus), dar în loc să adăugați o linie la datele sunt transferate numai prin intermediul formularelor, iar utilizatorul ( client) nu vede ce date sunt trimise . Dacă este prezent atributul ACTION, atunci valoarea. Pentru a le vedea, hackerul trebuie să înlocuiască formularul nostru cu al lui. Apoi server va trimite rezultatele procesării unui formular incorect în locul greșit. Pentru a evita acest lucru, puteți verifica adresa paginii de pe care au fost trimise datele. Acest lucru se poate face din nou folosind funcția getenv():

getenv("HTTP_REFERER");

Acum este momentul să rezolvăm problema formulată la începutul prelegerii.

Aceasta și următoarele secțiuni vor acoperi pe scurt cum să creați aplicații web de bază folosind PHP. Ceea ce s-a discutat în secțiune clar nu este suficient pentru ca aplicația ta să comunice cu utilizatorul și să formuleze în funcție de acțiunile pe care le-a efectuat sau de parametrii introduși. Ce lipsește? Nu există suficiente cunoștințe despre cum să organizați introducerea datelor utilizatorului și transferul acestor date către server. Ei bine, ar trebui să aveți deja cunoștințe de bază despre cum să procesați programatic informațiile primite pe server.

Metode de solicitare HTTP și parametrii acestora

Orice aplicație web dinamică generează un răspuns utilizatorului în conformitate cu parametrii introduși de acesta sau cu acțiunile efectuate pe partea clientului. Contactarea serverului se reduce cel mai adesea la două tipuri de solicitări: folosind metoda GET sau metoda POST. Câteva cuvinte despre diferențele dintre aceste două tipuri de solicitări.

Metoda GET:

    Parametrii sunt trecuți în antetul cererii HTTP, deci sunt vizibili pe linia de comandă, iar o astfel de solicitare poate fi salvată ca marcaje. Deoarece lungimea totală a antetului este limitată, numărul și lungimea parametrilor trecuți folosind GET sunt de asemenea limitate.

    Se crede că rezultatele mai multor cereri GET identice executate la rând ar trebui să fie aceleași.

Metoda POST:

    Parametrii de solicitare sunt trecuți în corpul cererii HTTP, deci nu sunt prezenți pe linia de comandă. Numărul și dimensiunea parametrilor sunt nelimitate.

    Se crede că rezultatele multiplelor solicitări POST identice pot returna valori diferite, deoarece pot modifica proprietățile obiectului țintă.

Metoda GET ar trebui utilizată pentru a prelua conținutul unei resurse de informații în funcție de parametri atunci când nu este nevoie de a face modificări la structurile de date ale resursei țintă și este logic să salvați cererea (URL) în marcaje. Metoda GET poate funcționa mai rapid decât solicitările similare folosind metoda POST.

Metoda POST ar trebui utilizată atunci când trebuie să ascundeți parametrii trecuți serverului din URL. Această metodă ar trebui folosită și în cererile de modificări ale conținutului resursei țintă, trecând o descriere a acestor modificări în parametrii (în corpul cererii).

Calea către resursă?parameter1=value1¶meter2=value2&...

Dacă nu aveți un formular HTML special pentru completarea parametrilor, atunci puteți depana funcționarea aplicației dvs. PHP trecând parametrii de testare direct pe linia de comandă a browserului, de exemplu:

Http://site/php-samples/sql.php?sql=select * din d_staff

Pentru a accesa parametrii de solicitare din partea serverului, ar trebui să utilizați matrice globale $_GETŞi $_POST respectiv. Dacă aplicației dvs. nu îi pasă prin ce metodă este accesată, atunci ar trebui să utilizați o matrice $_CERERE, care combină datele matricelor $_GET și $_POST, de exemplu, astfel:

$sql = isset($_REQUEST["sql"]) ? $_REQUEST["sql"]: "";

În acest exemplu, programul determină dacă parametrul „sql” a fost trecut: dacă da, își atribuie valoarea variabilei corespunzătoare, iar dacă nu, îi atribuie o valoare goală.

Definirea parametrilor de solicitare HTTP prin formular HTML

Desigur, definirea manuală a parametrilor direct în linia de comandă a browserului nu este foarte convenabilă. Această metodă este potrivită pentru executarea programatică a solicitărilor HTTP atunci când aplicațiile web comunică între ele. Pentru a introduce și a efectua verificarea inițială a datelor din partea clientului, ar trebui să utilizați formulare HTML și . Mai jos este un exemplu de cea mai simplă formă prin care se introduce un parametru de text (valoare), care este ulterior transmis serverului ca parametru al metodei POST.

metodă ="postează" server =’sql.php’ > SQL:

Atributul method al elementului formular specifică metoda care determină metoda de transmitere a datelor către server (get sau post). Atributul acțiune specifică fișier php, care va procesa cererea. Dacă handlerul ar trebui să fie fișierul curent, atunci nu este necesar să fie adăugat atributul de acțiune. Pentru toate elementele a căror valoare trebuie să fie transmisă ca parametru de solicitare HTTP, trebuie să definiți o valoare unică pentru atributul nume. Este valoarea atributului nume va fi indexîn tablourile $_GET, $_POST sau $_REQUEST (vezi exemplul de mai sus). Apăsând un buton depune trimite formularul cu toate valorile introduse către server.