curs programare web
PHP cu Formulare Introducere Construcţia formularului Scrierea unui formular pentru a fi folosit cu un script PHP se face exact la fel ca şi în mod normal, în HTML. Cum acesta este un curs de PHP nu vom intra în detalii privind scrierea formularului, ci vom discuta trei dintre compunentele pe care trebuie să le ştiţi: <input type="text" name="caseta" value="Numele d-voastra"> va afişa o caseta pentru introducerea unui text, casetă în care apar scrise (la început) cuvintele Numele d-voastra. De fapt atributul value în această linie este opţional. Informaţia - textul atribuit atributului name va constitui numele acestei casete text, trebuind să fie unic în formular. <textarea name="mesaj"> Scrieţi aici mesajul d-voastră. </textarea> va afişa o casetă mare de text cuprinzând îndemnul 'Scrieţi aici mesajul d-voastră.'. Si de data aceasta, numele casetei este definit (mesaj) şi trebuie să fie unic. <input type="submit" value="Trimite"> această linie va crea un buton de trimitere în formularul respectiv. Desigur puteţi schimba/alege textul care apare pe buton modificând expresia atribuită lui value. Toate elementele formularului trebuie să fie cuprinse între tagurile <form> . Adică se folosesc cam aşa: <form action="prelucrare.php" method="post"> Elementele Formularului şi comenzile de formatare, etc. </form> action indica fisierul care prelucreaza datele introduse in formular cand este apasat butonul Trimite method indica modul in care datele sunt trimise spre prelucrare pe server si poate avea valorile: POST cand datele trimise nu sunt vizibile utilizatorului si GET cand datele sunt adaugate la adresa URL. Metoda POST permite trimiterea unei cantitati mai mari de date decat metoda GET. name este un atribut care identifica datele introduse in fiecare camp al formularului. Valoarea atribuită lui form action spune care este script-ul căruia i se transmit datele (în acest caz fişierul prelucrare.php). Aici putem avea chiar un URL complet (spre exemplu http://balonas/ Cursuri/ PHP-proc/prelucrare.php). Metoda method spune formularului cum să transmită datele sale. Cu opţiunea POST datele vor fi trimise scriptului într-un pachet (stream) atunci când acesta le cere. O altă opţiune este GET, caz în care datele din formular sunt trimise în forma unui url astfel că vor apare după un semn ? , precum în exemplul: http://balonas/Cursuri/PHP-proc/prelucrare.php?name=Angela Nu prea contează care metodă o folosiţi, dar este mai bine să folosiţi POST dacă-i vorba de informaţii delicate (parole, etc.) pentru ca acestea să nu poată fi văzute în bara de adrese a navigatorului. Obţinerea datelor din formular Pasul următor este să luăm, să extragem datele din formularul transmis script-ului, astfel încât să putem face ceva cu ele. Există două procedee diferite de extragere a datelor în PHP, care depind de modul în care datele au fost trimise (cu metoda GET sau cu POST). Diferenţa majoră dintre cele două constă în faptul că, folosind GET, variabilele şi datele vor fi vizibile în adresa paginii, în timp ce folosind POST acestea sunt invizibile. Cu GET, însă, putem transmite informaţii către script fără un formular, pur şi simplu editând URL-ul.
curs programare web Asta se poate face cam la fel cu transmiterea formularului folosind GET. Avantajul ar fi că, astfel se pot crea legături la script-uri care vor produce efecte diferite în funcţie de legătura selectată. Spre exemplu, putem construi un script care să ne arate diferite pagini Web, funcţie de legătura selectată: pagina.php?user=Kiki poate arăta pagina mea Web (a utilizatorului Kiki, iar: pagina.php?user=Riki poate arăta pagina utilizatorului Riki de pe server, folosind acelaşi script. Ba este posibil şi să transmitem script-ului mai mult decât o singură valoare a unui atribut folosind schema de mai sus şi separând elementele prin simbolul & : pagina.php?user=david&referrer=gowansnet&area=6 Aceste elemente vor putea fi accesate separat folosind variabilele GET: user, referrer şi area. Pentru a prelua o variabilă care a fost trimisă script-ului cu metoda POST trebuie să folosim un apel de forma: $nume_variabila=$_POST['variabila']; care preia, în fond, variabila de la POST (numele unui câmp din formular) şi o atribuie variabilei $nume_variabila. Similar, la folosirea metodei GET vom scrie: $nume_variabila=$_GET['variabila']; Iar asta se poate face şi trebuie făcut pentru fiecare variabilă pe care vrem să o folosim din formular (sau din URL). Formularul pentru script-ul e-mail In încheierea acestei secţiuni, să vedem cum aplicăm cele discutate mai sus şi cum realizăm un mecanism care să producă şi să ne transmită un mesaj e-mail cu comentariile unui utilizator. Mai întâi să pregătim formularul pentru a-l include în pagina HTML: <form action="mail.php" method="post"> Numele: <input type="text" name="nume"><br> Adresa E-mail: <input type="text" name = "email"><br><br> Comentarii<br> <textarea name="comentar"></textarea><br><br> <input type="submit" value="Trimite"> </form> Astfel avem un formular simplu în care utilizatorul poate introduce adresa sa e-mail, numele său şi comentariile dorite. Putem desigur să adăugăm şi alte părţi într-un asemenea formular, cu condiţia să actualizăm şi script-ul. Pentru cazul simplu de mai sus, scriem următorul script PHP: <? $numele=$_POST['nume']; $adresa=$_POST['email']; $comentariu=$_POST['comentar']; $catre="balonasul2000@yahoo.com"; $mesaj="$numele tocmai a transmis comentariile sale. Acolo spune:\n$comentariu\n\nAdresa sa e-mail a fost: $adresa"; if(mail($catre,"Comentarii din propriul Site",$mesaj,"From: $email\n")) { echo "Multumiri pentru comentariile d-voastra."; } else { echo "Exista o problema la transmiterea mesajului. Verificati, va rog, modul in care ati completat formularul."; } ?> Nu uitaţi să înlocuiţi adresa mea e-mail balonasul2000@yahoo.com cu propria voastră adresă e-mail. Acest script trebuie salvat ca fişier cu numele mail.php , iar ambele fişiere (acesta şi pagina Web în care a fost inclus formularul de mai sus) trebuie încărcate pe serverul Web în zona destinată documentelor accesibile (acolo de unde vor fi apelate). Tot ce a mai rămas atunci de făcut, este să verificăm completând formularul.
curs programare web Exemplu formular: - formular cu un câmp şi scriptul php de preluare a datelor <form action="exemplu5_1.php" method="POST"> Nume: <input type="text" name="nume"><br> <input type="submit" value="Trimite"> </form> /* urmeaza fisierul exemplu5_1.php */ <?php $nume=$_POST["nume"]; echo $nume; ?> Verificarea datelor introduse în formular Pentru a fi siguri că utilizatorul a completat câmpurile trebuie să adăugam scriptului partea de verificare. Exemplu: folosim acelaşi formular dar adăugam partea de verificare <?php $nume=$_POST["nume"]; if ($nume=="") { echo "Campul nume nu este completat"; } else { echo $nume; } ?> Partea de verificare poate avea mai multe condiţii simultane. Exemplu: acelaşi formular dar partea de verificare are două condiţii legate prin operatorul OR sau || <?php $nume=$_POST["nume"]; if (($nume=="") || (strlen($nume)<5)) { echo "Campul nume nu este completat corect"; } else { echo $nume; } ?> Folosind modelele anterioare puteţi prelua date şi face verificarea pentru toate câmpurile formularului. Datele preluate pot fi eventual introduse într-o bază de date sau prelucrate în vederea trimiterii prin email funcţie de cerinţele aplicaţiei. În afara preluării datelor putem folosi formularul şi pentru upload-ul fişierelor pe server dar cu măsurile de precauţie necesare pentru a evita eventualele upload-uri de fişiere nedorite pe server. Pentru upload formularul va conţine un câmp de tip input cu type="file" iar eticheta form va conţine în plus un argument enctype="multipart/form-data". Exemplu: formular pentru upload fişiere. Folderul în care se face upload trebuie sa permită operatia de scriere. Din motive de securitate acest exemplu nu este activ. <form method="post" action="exemplu5_4.php" enctype="multipart/form-data"> Fisier pentru upload: <input type="file" name="file"><br> <input type="submit" value="Trimite"> </form> /* urmeaza fisierul exemplu5_4.php */
curs programare web <?php $a=$_FILES["file"]["size"]; $b=$_FILES["file"]["name"]; $c=$_FILES["file"]["tmp_name"]; $d=$_FILES["file"]["type"]; if(($a<10000) && ($a>0)) { move_uploaded_file($c,$b); echo "Nume initial fisier: ".$b."<br>"; echo "Nume fisier incarcat: ".$c."<br>"; echo "Marime fisier: ".$a."<br>"; echo "Tip fisier: ".$d; } ?> Exemple: Cod: <form name="form1" method="post" action="pagina_de_test.php"> Data curenta: <input name="data" type="text" id="data" value=" <?php $data=date("d-h-Y",time());echo $data; ?> "> <br> <br> <input type="submit" name="Submit" value="Trimite"> </form> Rezultat cod: După cum observaţi, la valoarea câmpului "data" am introdus un mic script php care citeşte data curentă de pe server şi o timite browserului, acesta o afişează în câmpul de text corespunzător. Puteţi încerca şi voi să citiţi anumite date dintr-un fişier txt sau din baza de date şi să le afişaţi în formular. Dacă doriţi să apară un mesaj în interiorul câmpului dar să dispară când un utilizator vrea să introducă propriul lui text, codul ar fi cam aşa:
Cod: <form> <INPUT name=test id="test" onclick="this.value='';" value=”cauta” size=”15” maxLength=”30”> <INPUT name="submit" type=”submit” id="submit" value=”GO”> </form> Rezultat cod: Dacă cineva încearcă să scrie ceva, textul "caută" va dispare şi va fi înlocuit cu mesajul introdus de utilizator. Preluarea şi verificarea datelor dintr-un formular în aceeaşi pagină cu formularul Cod: <?php if (isset($_POST['Submit'])) #deoarece verificarea se face in aceeasi pagina cu formularulse verifica inainte daca a fost apasat butonul submit { #preluare variablile daca sunt trimise @$vot=$_POST['vot'];
curs programare web #verificare if($vot=="") #aici se verifica daca a fost selectat ceva { echo "<br>Nu ati votat. Incercati din nou."; } if ($vot=="vot_1") #daca e selectat vot 1 afiseaza si eventual trimite pe e-mail { echo "<br>Ati votat numarul 1."; } if ($vot=="vot_2") #daca e selectat vot 2 afiseaza si eventual trimite pe e-mail { echo "<br>Ati votat numarul 2."; } if ($vot=="vot_3") #daca e selectat vot 3 afiseaza si eventual trimite pe e-mail... { echo "<br>Ai votat numarul 3."; } #afisare continutul variabilei vot echo "<br>Continutul casutei de vot este: ".$vot; } ?> <html> <head> <title>Formular de vot</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <!-- aici incepe formularulde votare--> <form name="formular_vot" method="post" action="test_vot.php"> <p> <label> <input type="radio" name="vot" value="vot_1"> vot a</label> <br> <label> <input type="radio" name="vot" value="vot_2"> vot b</label> <br> <label> <input type="radio" name="vot" value="vot_3"> vot c</label> <br> <input type="submit" name="Submit" value="Voteaza"> <br> </p> </form> <!-- aici se incheie formularul de vot--> </body> </html>
După cum observaţi, scriptul este împărţit în 2 părţi. Prima parte este codul php care verifică dacă a fost apăsat butonul "Submit" şi dacă a fost apăsat se preia valoarea butonului radio şi se verifică. Dacă nu a fost apăsat butonul "Submit" se sare peste codul php şi se trece direct la partea html unde se afişează butoanele radio. Lucrând recent cu câteva formulare am întâmpinat unele dificultăţi pe care vreau să le descriu mai jos pentru a avea un punct de plecare în cazul în care mai am astfel de probleme. Pentru început o să explic cum se trimit şi cum se preiau datele din formular în aceeaşi pagină. Avem următorul formular:
curs programare web Cod: <?php #aici se verifica daca a fost trimis un camp din formular if (isset($_POST['camp1'])) # daca a fost trimis { # se preiau datele trimise $camp1=$_POST['camp1']; #se verifica daca a fost scris ceva if (empty($camp1)) { echo"<br>Nu a fost introdus nimic"; } else { echo"<br>A fost introdus:".$camp1; } } if (!isset($_POST['camp1'])) #daca nu a fost trimis { #se initializeaza variabilele $camp1=””; } ?> <form name="form1" method="post" action=" <?php $_SERVER['PHP_SELF']?>"> <div align="center"> <input name="camp1" type="text" id="camp1" value=" <?php echo $camp1;?> "> textfield<br> <input type="submit" name="Submit" value="Trimite"> </div> </form> Prima oară când se accesează pagina este logic că nu se trimite nici o valoare din formular. Dacă nu ar fi făcută verificarea de setare a unei valori din formular (rândul if(isset($_POST['camp1']) ) şi s-ar fi încercat preluarea direct a valorii (rândul $camp1 = $_POST['camp1']; ) ar fi dat o eroare (dacă aveţi configurat serverul să vă arate toate erorile) În schimb, aşa aţi evitat o eventuală eroare şi scriptul rulează corect indiferent de setările serverului... Observaţi că la preluarea variabilei trimise prin post se foloseşte un mic truc şi anume numele variabilei este acelaşi cu numele câmpului trimis prin POST. În cazul când serverul are setat register_global = off este mai sigur să folosiţi astfel preluarea variabilelor pentru a nu vâ da eroare. Puteţi lucra şi direct cu valoarea POST dar personal prefer să scriu mai puţin folosind de fiecare dată numele variabilei ( $camp1 ) nu tot şirul dat de valoarea POST ( $_POST['camp1'] ) E mai puţin de scris iar dacă folosesc variabila în alte locuri evit erorile generate de lipsa unei ghilimele (de genul echo 'ceva aici $_POST['camp1']; // aceasta comanda nu va merge pentru ca am uitat sa inchid ghilimelele pe cand asa echo '$camp1'; va merge intotdeauna). În continuare următorul rând verifică dacă valoarea preluata din formular conţine ceva sau nu. Dacă există ceva atunci afişeaza mesajul împreună cu ceea ce a fost introdus. Mai departe, în caz că se încarcă pagina prima data şi formularul încă nu a fost trimis se iniţializează valoarea variabilei pentru câmpul respectiv. În cazul în care nu se iniţializează valoarea şi se încearcă afisarea ei directă va apărea un mesaj de eroare (dacă serverul e setat să afişeze mesajele de eroare). Acum, dacă sunteţi lămuriţi ce se întâmplă acolo să trecem mai departe (iar dacă nu, atunci recitiţi articolul şi vedeţi încă odată sursa până înţelegeţi :-P ) Afişarea unui text într-un câmp în form care dispare în cazul în care se introduce ceva în acel câmp De multe ori, am un formular în care vreau să scriu ceva într-un anumit câmp iar dacă vizitatorul doreste să completeze acel câmp să nu stea să şteargă mesajul meu ci să dispară automat textul introdus de mine şi să rămână doar ce a introdus
curs programare web vizitatorul. Aşa ceva se poate face simplu cu o scurtă funcţie javascript: Sursa:
Exemplu:
<form name="form2" method="post" action="pagina.php"> <input name="textfield" type="text" value="acest text dispare" onmousedown=" this.value=''"> </form>
acest text dispare
Preluarea datelor dintr-un câmp cu select multiplu În cazul în care în formular trebuie să existe şi un textfield din care se pot selecta simultan mai multe câmpuri, preluarea datelor poate părea mai complicată, dar în realitate este la fel de simplu ca şi până acum, şi anume: Cod: <?php if (isset($_POST['select'])) { foreach ($_POST['select'] as $cheie => $valoare) { echo "<br>A fost selectata valoarea ".$valoare; } } ?> <form name="form3" method="post" action=" <?php $_SERVER['PHP_SELF']?> "> <div align="center"> <select name="select[]" size="5" multiple> <option value="1">valoarea1</option> <option value="2">valoarea2</option> <option value="3">valoarea3</option> <option value="4">valoarea4</option> <option value="5">valoarea5</option> </select> Selectati mai multe valori<br> <br> <input type="submit" name="Submit2" value="Submit"> </div> </form>
TEMĂ 1. 2. 3.
Să se creeze un script cu formular de tip “sondaj” sau “poll” după modelul întâlnit în acest curs. Puteţi alege ce domeniu doriţi pentru sondaj. Aspectul general să fie frumos, nu doar trântit sondajul acolo. Creaţi un formular pentru înscriere într-un sejur la mare şi verificaţi dacă, câmpurile au fost corect completate. Creaţi un script pentru trimis e-mail şi verificaţi corectitudinea cu care a fost completat.