Laborator 4 - Folosirea formularelor (schimbul de informatii folosind metodele GET ; POST)


Responsabil: Popovici Matei <pdmatei@gmail.com>

Data publicarii: 21-03-2008

Data ultimei modificari: 14-03-2008 (fisierul UserCollection-lab4.class.php actualizat cu o varianta corecta)


Obiective:

- familiarizarea cu mecanismul de trimitere a informatilor in web

- intelegerea si folosirea corecta a metodelor GET si POST pentru schimbul de informatii

- crearea de interfete pentru modificarea datelor afisate (folosind metodele de mai sus)


Formulare in HTML

Formularele sunt utile pentru a realiza schimburi de informatii cu serverul, mai precis, pentru a trimite informatii server-ului.

Un exemplu de formular:


<form action="script.php" method="POST">

<input type="text" name="camp_text" value="completeaza aici">

<input type ="password" name="camp_parola">


<textarea rows="2" cols="20">

Textul vostru mare aici

</textarea>


<select name="camp_combobox">

<option value="valoare1">Valoare 1</option>

<option value="valoare2" selected="selected">Valoare 2</option>

</select>


<input type="radio" name="grup1" value="op1"> Optiune 1

<input type="radio" name="grup1" value="op2" checked="checked"> Optiune 2

<input type="radio" name="grup1" value="op3"> Optiune 3


<input type="submit" name="camp_submit" value="Trimite" >

</form>


Formularul de mai sus va fi trimis resursei script.php, folosind metoda POST.


Acesta contine un editbox avand numele camp_text si valoarea default "completeaza aici", valoare ce poate fi modificata de utilizator.

In continuare, formularul contine un camp de tip parola (are caracterele ascunse), apoi o camp richtext;


Acelasi formular contine si un selectbox, avand lista de optiuni posibile, precum si o optiune selectata default.

Gasim de asemenea si o lista de "radio buttons". Particularitatea la radio buttons este ca toate optiunile au acelasi nume. Va fi trimisa script-ului doar valoarea bifata.



Metodele GET si POST


In HTML, putem specifica doua metode diferite de trimitere a formularului (folosind proprietatea METHOD).


Daca metoda GET este cea specificata, browserul preia valoarea proprietatii action (in exemplu nostru "script.php"), adauga ? apoi concateneaza continutul informational sub forma perechi cheie-valoare. Cheile reprezinta numele componentelor din formular (specificate cu proprietatea name), iar valorile sunt efectiv continutul campurilor completate (sau specificate cu proprietatea value). Concatenarea va produce urmatorul url:

script.php?camp_text=valoare&camp_parola=valoare etc.

Se observa ca perechile cheie-valoare sunt codificate intr-o maniera directa: "cheie=valoare" si sunt separate prin &. Transmiterea se face direct prin URL, iar contintul informational este direct vizibil pentru utilizator;


Daca pentru trimitere specificam metoda POST, browser-ul va construi o cerere HTTP de tip post catre resursa ceruta (in exemplul nostru, "script.php"), iar perechile cheie-valoare se vor afla in continutul cererii HTTP catre server. In acest caz, informatiile nu mai sunt vizibile direct utilizatorului, insa in cererea HTTP ele sunt scrise in clar. Iata un exemplu de cerere HTTP folosind metoda POST:


POST /path/script.cgi HTTP/1.0 From: email@domain.com User-Agent: HTTPTool/1.0 Content-Type: application/x-www-form-urlencoded Content-Length: 32 home=Cosby&favorite=flies 


Accesul la informatiile trimise in PHP


Informatiile trimise prin intermediul variabilelor GET si POST pot fi regasite in PHP in vectorii asociativi $_POST si $_GET. Cheile lor reprezinta numele campurilor (definite cu proprietatea name, in HTML) iar valorile reprezinta valorile efective introduse de utilizator.

$_GET si $_POST sunt variabile super-globale si sunt vizibile oriunde in cadrul unui script PHP. Ele pot fi folosite exact ca oricare alt vector asociativ.


Diferenta intre $_GET si $HTTP_GET_VARS


In variante anterioare PHP 5 (si in general in cod scris cu versiuni mai vechi de PHP), pentru accesul la informatiile trimise cu GET sau POST, se foloseau $HTTP_GET_VARS (respectiv $HTTP_POST_VARS). Acestea functionau in mod perfect asemanator cu $_GET (si $_POST). Exista insa diferente.

$HTTP_GET_VARS este o variabila globala (nu super-globala), ceea ce inseamna ca trebuie declarata cu "global $HTTP_GET_VARS" pentru a putea fi folosita interior unei functii (sau clase).

Variabilele $HTTP_GET_VARS si $HTTP_POST_VARS sunt deprecated si din PHP 6. ele nu vor mai fi folosite. Desi inca functioneaza, se descurajeaza folosirea acestora.


Maniere particulare de trimitere a datelor


Putem profita de maniera de trimitere a informatiilor cu metoda GET, pentru a putea trimite date si mai flexibil (fara sa fim 'legati' de necesitatea introducerii formularelor). Astfel, un link de forma:


<a href="script.php?id=10"> Catre script </a>


Este echivalent cu un formular

<form method = "GET" action = "script.php">

<input type="text" name="id">

<input type="submit" value="Catre script" >

</form>

in care utilizatorul completeaza cu 10 campul id.


Aceasta abordare permite programatorului de aplicatii web sa particularizeze executia unui script (precum "script.php"), in functie de continutul variabilei id.

Nu exista o corespondenta a acestei abordari pentru metoda POST, insa pot fi trimise valori predefinite folosind tipul hidden. Exemplu:


<form action="script.php" method="POST">

<input type="hidden" name="id" value="5">

<input type="text" name="nume_camp">

<input type="submit" value="trimite">

</form>


Un astfel de input intr-un formular, va avea ca efect trimiterea (alaturi de campul nume_camp) si campul id cu valorea 5.

Input-urile hidden nu sunt vizibile cand afisam pagina HTML)



Directiva register-globals


Activarea directivei register_globals, permite folosirea directa a variabilelor trimise prin metodele GET si POST, fara a mai folosi variabilele globale $_GET si $_POST.

De exemplu, daca register_globals este activat, continutul $_GET['form_elem']

poate fi accesat in mod direct prin variabila $form_elem. Acelasi lucru este valabil si pentru elemente trimise prin POST.

Aparent este mai simplu a opera cu variabile efective $form_elem, decat cu elemente ale unui array asociativ (ex: $_GET['form_elem'] )

Cu toate astea, register_globals activata reprezinta un imens potential pericol pentru securitatea unei aplicatii.


Fie urmatorul cod (script.php) executat pe un server cu register_globals activat:

<?php

if (authenticated_user()) {

$authorized = true;

}


//executa cod in regim autorizat


?>

Daca cineva ar accesa script.php?authorized=true, scriptul ar intra in regiunea critica de cod, ignorand complet codul de autorizare (functia authenticated_user ).

Folosirea register_globals este insistent descurajata.

(detalii la: http://www.php.net/register_globals)


Uploadarea fisierelor


In exemplul de mai jos, avem un formular pentru uploadul fisierelor. El contine elemente in plus fata de formularul standard (prezentat mai sus).

<form enctype="multipart/form-data" action="script.php" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="100000" /> Choose a file to upload: <input name="uploadedfile" type="file" /><br /> <input type="submit" value="Upload File" /> </form> 

Elementele noi sunt:


Continutul script.php:


$target_path = "uploads/"; $target_path = $target_path . basename( $_FILES['uploadedfile']['name']); if( move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { echo "Fisierul ". basename( $_FILES['uploadedfile']['name']). " a fost uploadat"; } else { echo "Eroare la uploadarea fisierului!"; } 

Explicatii:


Pentru detalii consultati descrierea functiilor in PHP.net si cititi urmatorul tutorial:

http://www.tizag.com/phpT/fileupload.php


Task-uri


Folosind clasa UserCollection scrisa la laboratorul anterior (sau resursa atasata acestui laborator), creati o pagina index.php care afiseaza o lista de utilizatori. In plus, implementati link-uri care modifica afisarea (sau continutul) listei.

Implementati o optiune de sortare (ascendenta si descendenta), si o optiune de "restrictionare" a listei la anumite valori (puteti folosi un combo-box). (Alegeti voi un camp care sa fie sortat, si altul care sa fie "restrictionat").


7p


Adaugati listei si link-uri pentru a naviga pe pagini;


3p


Bonus:


Implementati o facilitate de upload fisiere. Alegeti voi maniera de implementare. Bonusul se va acorda daca fisierul este uploadat corect intr-un director specificat.


4p