Dezvoltare Aplicatii Web

27
DEZVOLTAREA APLICAŢIILOR WEB Bogdan Pătruţ

description

Scris de Patrut Bogdan, de la Universitatea din Bacau

Transcript of Dezvoltare Aplicatii Web

Page 1: Dezvoltare Aplicatii Web

DEZVOLTAREA APLICAŢIILOR

WEB

Bogdan Pătruţ

Page 2: Dezvoltare Aplicatii Web

Laborator 1. Introducere

a) Ce inseamna o pagina web dinamica, care sunt diferentele fata de una statica? La o pagina statica te uiti, la o pagina dinamica interactionezi in ambele sensuri. b) Cum putem realiza o pagina web dinamica? Folosind un mediu de programare web adecvat: Medii de programare web: PHP/MySQL, ASP .NET, Flash – ActionScript, VB Script, JavaScript etc. c) Ce presupune sa realizezi o pagina web sau un site dinamic? Un calculator pe care sunt instalate urmatoarele 3 servere: server web (ca sa recunoasca adrese gen http://....), un server PHP (ca sa poate interpreta programele PHP) si un server pentru baze de date MySQL (pentru a putea accesa si prelucra tabelele din bazele de date) d) Cum putem sa instalam toate acestea? Exista kitul all-in-one EasyPHP sau PHP Triad care le cuprinde pe toate trei. Le cautam pe web cu Google si le descarcam si instalam pe calculatorul propriu. e) OK, fac pagina web dinamica pe calculatorul meu, cum pot sa fac sa o vada

oricine? Trebuie sa iti cumperi un domeniu (de exemplu www.exemplu.ro, de la www.rotld.ro sau www.hostdomain.ro sau altii) sau sa inchiriezi unul de la cei care ofera gratis (www.xhost.ro, www.3x.ro etc.) sau pe bani (www.vodafone.ro etc). Apoi, vei plati lunar o taxa (in jur de 5 euro) si vei putea sa-ti depozitezi acolo site-ul tau si baza ta de date (folosind protocolul FTP din programul Total Commander, de exemplu). f) Un prim program PHP care va aduna doua numere Vom crea doua fisiere: “index.html” si “suma.php” In “index.html” vom avea un formular continand doua casete de text pentru cele doua numere:

Descrierea sa in format HTML este:

<html> <head> <title>Suma a doua numere</title> </head> <body> <p>Suma a doua numere:</p> <form method="POST" action="suma.php"> <p>Primul numar: <input type="text" size="5" name="x"> Al doilea numar: <input type="text" size="5" name="y"> </p><p><input type="submit" name="B1" value="Suma"></p> </form> </body> </html>

Page 3: Dezvoltare Aplicatii Web

Asadar, atunci când se actioneaza butonul de subscriere "Suma" se lanseaza in executie programul aflat in fisierul SUMA.PHP. Un program PHP este capabil sa genereze cod HTML, folosind functia “echo” sau functia “printf”. Iata continutul fisierul “suma.php”. <?php $suma=$x+$y; echo("Suma este: $suma"); ?> Ambele fisiere vor fi realizate folosind un editor de texte, de exemplu Notepad. Putem descarca de pe web un mediu de editare – compilare – executie mai performant (IDE). Observatii: exista doua metode de a trimite variabile de la fisierul HTML catre programul PHP: POST si GET.

• Daca folositi metoda POST, atunci programul PHP recunoaste automat variabilele din formularul HTML, dar variabilele din PHP se scriu cu simbolul “$” in fata. De exemplu x din formular devine $x in PHP, y din formular devine $y in PHP. Securitatea datelor este mai mica, variabilele pot fi preluate si de alte programe rau intentionate.

• Daca folositi metoda GET, atunci puteti prelua in programul PHP variabilele din formularul HTML, folosind $_GET[‘x’] si $_GET[‘y’]. Securitatea este mai buna.

Programul PHP va genera un simplu fisier text, in care va afisa “Suma este: “ si suma. Daca vrem ca sa generam o intreaga pagina web avem doua variante:

• Generare din cod PHP, folosind functia echo: <?php echo(“<html><head><title>Suma</title></head><body>”); $suma=$x+$y; echo("<p>Suma este: $suma"); echo(“</p></body></html>”); ?>

• Inserarea codului HTML static, pe langa codul PHP pentru calcule: <html><head><title>Suma</title></head><body> <p>Suma este: <?php $suma=$x+$y; echo($suma); ?> </p></body></html> Atentie! Si acest fisier se salveaza cu extensia PHP, chiar daca are elemente HTML in el. O alta varianta este crearea unui singur fisier “index.php”, care sa cuprinda atat formularul pentru introducerea operanzilor, cat si codul PHP pentru calculat suma si apoi se va reimprospata pagina respectiva. Exercitii:

Page 4: Dezvoltare Aplicatii Web

1) Descarcati de la www.php.net si de la www.mysql.com documentatiile (in limba romana) ale celor doua produse (PHP, respectiv MySQL). Daca nu v-ati prins, functia este “sqrt”. Cum se foloseste? 2) Cautati in documentatia PHP online sau in cea descarcata functia matematica pentru a calcula radacina patrata a unui numar real pozitiv. 3) Realizati un formular HTML si un program PHP pentru a calcula

a) perimetrul unui triunghi b) aria unui triunghi

avand lungimile laturilor a, b si c. Folositi formula lui Heron pentru a calcula aria:

))()(( cpbpappAria −−−= , unde p este semiperimetrul: 2

cbap ++= .

4) Realizati un formular HTML si un program PHP pentru a calcula cel mai mic dintre doua numere: a) folosind functia predefinita “min”; b) folosind instructiunea de decizie “if”. Aceasta are forma ca in limbajul C. 5) Realizati un formular HTML si un program PHP pentru a calcula suma 1+2+3+...+n, unde n este citit din formular. Se va folosi, pe rand, oricare dintre instructiunile repetitive urmatoare: a) while b) do – while c) for Nu uitati ca fiecare variabila trebuie precedata de simbolul $.

Laboratorul 2. Utilizarea fisierelor text PHP este un mediu de programare server-side, spre deosebire de JavaScript, care este client-side. Cu alte cuvinte, programele PHP ruleaza pe serverul pe care va conectati, iar nu pe calculatoarele voastre de la care va conectati. Asadar, puteti lucra cu fisiere (text, de exemplu) de pe server, indiferent de la ce calculator va conectati. Exemplu: o persoana poate stoca o informatie intr-un fisier text de la un calculator, iar alta persoana poate accesa acea informatie de la alt calculator. Functiile de lucru cu fisiere text sunt identice celor din limbajul C. Vom exemplifica aceste functii, creand un cod PHP care sa contorizeze de cate ori e vizitata o pagina web.

Acest lucru - atât de popular - se poate realiza foarte usor in limbajul PHP in felul urmator. Vom crea mai intâi un fisier text (VIZ.TXT) care sa contina doar valoarea 0 scrisa in el, apoi, la fiecare incarcare a paginii web (care va fi denumita "index.php" si nu "index.html"!), programul PHP va citi valoarea aflata in fisier, o va incrementa (cu 1), o va afisa, iar apoi o va salva in fisier, in locul vechii valori. Atentie! Atat fisierul VIZ.TXT, cat si INDEX.PHP trebuie sa fie pe server!

Asadar, programul va arata astfel: <?php

Page 5: Dezvoltare Aplicatii Web

echo("<html><head><title>Salutare!</title></head>"); echo("<body bgcolor='fuschia'>"); // deschid fisierul nrvizit pentru citire $f = fopen("nrvizit","r"); // citesc nr. de vizitatori de acolo fscanf($f,"%d",$x); // fscanf(fisierul de unde citesc, tipul de data, // variabila citita). obs: %d - numar intreg $x = $x + 1; // am crescut cu 1 numarul de vizitatori echo("Esti vizitatorul nr. $x"); fclose($f); // am inchis fisierul $f = fopen("nrvizit","w"); // deschid din nou fisierul, de data asta pentru a scrie // in el // scrie un sir $x intr-un fisier $f, conversia // de la intreg la sir se face automat fputs($f,$x); fclose($f); // am inchis din nou fisierul ?>

Fisierul VIZ.TXT va contine un simplu 0 in el.

Programul contine apelurile functiilor fopen - deschidere fisier text. Primul argument este numele extern al fisierului, adica numele sau de pe disc, iar cel de al doilea argument este modul in care se deschide fisierul. Astfel "r" este pentru citire, "w" pentru rescriere, iar "a" pentru adaugare (append). O modalitate de a citi un numar intreg $x dintr-un fisier asociat variabile $f este:

fscanf($f,"%d",$x);

Inchiderea fisierului se realizeaza cu un apel simplu al lui fclose.

fclose($f); // am inchis fisierul

Pentru a scrie in fisier, am apelat la o functie speciala, numita fputs, care scrie intr-un fisier text un sir de caractere, dar conversia de la numar intreg la sir de caractere se realizeaza automat. De fapt, limbajul PHP este foarte puternic in privinta conversiei dintre date de diferite tipuri. Exercitii:

1) Scrieti un program PHP care preia dintr-un formular HTML urmatoarele date din CV-ul unei persoane (ex. numele, prenumele, adresa, numar de telefon, adresa de e-mail, sexul, educatie, locuri de munca, pasiuni etc.) si le salveaza intr-un fisier text.

Page 6: Dezvoltare Aplicatii Web

Laborator 3. Prelucrarea datelor dintr-un formular

a) Validarea datelor unui formular si salvarea lor intr-un fisier

In continuare, sa presupunem ca dorim sa salvam datele dintr-un formular intr-un fisier text. Pentru a exemplifica acest lucru, sa consideram ca dorim infiinaarea unui club de elevi, cu diferite preocupari. Am realizat, in acest sens, urmatorul formular de inscriere:

Acest formula este descris in cod HTML astfel: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Microsoft FrontPage Express 2.0"> <title>Formular de inscriere:</title> </head> <body> <p align="center"><font size="6"><strong>Clubul nostru - Formular de inscriere:</strong></font></p> <p align="center"><font size="2"><em>(campurile marcate cu steluta sunt obligatorii)</em></font></p> <form action="formular.php" method="POST" name="formular_inscriere"> <p align="left"><strong>*Numele si prenumele:</strong><input type="text" size="16" name="nume"><strong>&nbsp;&nbsp; *Adresa de e-mail:</strong><input type="text" size="16" name="email"></p> <p align="left"><strong>*Numar de telefon fix:</strong><input type="text" size="14" name="telefon"> &nbsp;&nbsp;&nbsp;<strong>Poate aveti si un mobil:</strong><input type="text" size="14" name="mobil"></p> <p><strong>Sexul: </strong><input type="radio" checked name="sex" value="masculin">masculin &nbsp;&nbsp;&nbsp;<input type="radio" name="sex" value="feminin">feminin <strong>Clasa:

Page 7: Dezvoltare Aplicatii Web

</strong><input type="radio" checked name="clasa" value="9">a IX-a &nbsp;&nbsp;<input type="radio" name="clasa" value="10">a X-a &nbsp;&nbsp;<input type="radio" name="clasa" value="11">a XI-a &nbsp;&nbsp;<input type="radio" name="clasa" value="12">a XII-a &nbsp;<select name="lclasa" size="1"> <option>A</option> <option>B</option> <option>C</option> <option>D</option> <option>E</option> <option>F</option> <option>G</option> <option>H</option> </select></p> <p><strong>Pasiunile dvs.: </strong><input type="checkbox" name="C1" value="ON">literatura &nbsp;&nbsp;<input type="checkbox" name="C2" value="ON">limbile straine &nbsp;&nbsp;<input type="checkbox" name="C3" value="ON">artele plastice, muzica&nbsp;<input type="checkbox" name="C4" value="ON">matematica &nbsp;&nbsp;<input type="checkbox" name="C5" value="ON">informatica &nbsp;&nbsp;<input type="checkbox" name="C6" value="ON">psihologia &nbsp;&nbsp;<input type="checkbox" name="C7" value="ON">fizica &nbsp;&nbsp;<input type="checkbox" name="C8" value="ON">chimia &nbsp;</p> <p><input type="checkbox" name="C9" value="ON">biologia &nbsp;&nbsp;<input type="checkbox" name="C10" value="ON">sportul &nbsp;&nbsp; <input type="checkbox" name="C11" value="ON">geografia &nbsp;&nbsp;<input type="checkbox" name="C12" value="ON">istoria &nbsp;&nbsp; <input type="checkbox" name="C13" value="ON">economia</p> <table border="0"> <tr> <td><strong>*Disponibilitatea dumneavoastra: &nbsp;&nbsp;&nbsp;</strong><p><select name="disponib" size="6"> <option>zilnica</option> <option>de doua ori pe saptamana</option> <option>o data pe saptamana</option> <option>in week-end</option> <option>o data pe luna</option> <option>la cerere</option> </select></p> </td> <td><strong>Sectiunile (programele) pentru care optati:</strong><p><em>(va recomandam sa alegeti maxim 2)</em></p> <p><input type="checkbox" name="PR1" value="ON"> Revista &nbsp; <input type="checkbox" name="PR3" value="ON"> Administrare retea &nbsp;&nbsp;&nbsp;<input type="checkbox" name="PR5" value="ON"> Poesis&nbsp;&nbsp;</p> <p><input type="checkbox" name="PR2" value="ON"> Thalia &nbsp;&nbsp; &nbsp;<input type="checkbox" name="PR4" value="ON">&nbsp;Apollo &nbsp;<input type="checkbox" name="PR6" value="ON">Muzicienii informaticieni</p> </td> </tr> </table>

Page 8: Dezvoltare Aplicatii Web

<p><strong>Sugestiile si comentariile dumneavoastra sunt binevenite:</strong></p> <p><textarea name="sugestii" rows="3" cols="56"></textarea> <input type="submit" name="butonok" value="OK, inregistrare" action="formular.php"> <input type="reset" name="butonnu" value="Reluare"></p> </form> </body> </html>

In continuare, vom prezenta programul (FORMULAR.PHP), care va scrie datele despre un elev care se inscrie in club.

Programul face simple verificari asupra datelor introduse, semnalând eroare in cazul in care lipsesc anumite câmpuri, declarate ca fiind obligatorii: numele, adresa de posta electronica, disponibilitatea si numarul de telefon. De asemenea, folosind functia PHP ereg se testeaza daca adresa de e-mail data ar putea fi reala (functia ereg este foarte puternica, ea lucrând cu expresii regulate, despre care puteti afla mai multe din Internet, chiar de la adresa www.php.net).

<?php if (!$nume || !$email || !$disponib || !$telefon) { echo("<html><title>Eroare</title><body background='fond.jpg'>"); echo("<br><br>"); echo("<center><font size=+2 color='blue'>"); echo("Campurile marcate cu steluta sunt "); echo("obligatorii!</font></center><br><br>"); echo("<p align='center'>"); echo("<a href='javascript:history.back()'>"); echo("<img src='previous.gif'></img></a></p>"); echo("</body></html>"); } else if (!ereg("^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+",$email)) { echo("<html><title>Eroare</title>"); echo(<body background='fond.jpg'>"); echo("<br><br>"); echo("<center><font size=+2 color='blue'>"); echo("Eroare la adresa de e-mail</font></center><br><br>"); echo("<p align='center'>"); echo("<a href='javascript:history.back()'>"); echo("<img src='previous.gif'></img></a></p>"); echo("</body></html>"); } else { // preiau datele si le stochez pe disc echo("<html><title>Inscriere</title>"); echo("<body background='fond.jpg'>"); echo("<br><br>"); echo("<center><font size=+2 color='blue'>"); echo("Datele introduse de dvs. sunt</font>"); echo("</center><br><br>"); echo("<p align='left'>"); echo("<ul>");

Page 9: Dezvoltare Aplicatii Web

echo("<li>Numele si prenumele: $nume</li>"); echo("<li>Adresa de e-mail: $email</li>"); echo("<li>Telefon fix: $telefon</li>"); echo("<li>Telefon mobil: $mobil</li>"); echo("<li>Sexul: "); if ($sex=="masculin") echo("baiat</li>"); else echo("fata</li>"); echo("<li>Clasa: "); if ($clasa==9) echo("a noua $lclasa"); if ($clasa==10) echo("a zecea $lclasa"); if ($clasa==11) echo("a unsprezecea $lclasa"); if ($clasa==12) echo("a douasprezecea $lclasa"); echo("<li>Pasiuni:<ol>"); if ($C1=="ON") echo("<li>literatura"); if ($C2=="ON") echo("<li>limbile straine"); if ($C3=="ON") echo("<li>arta"); if ($C4=="ON") echo("<li>matematica"); if ($C5=="ON") echo("<li>informatica"); if ($C6=="ON") echo("<li>psihologia"); if ($C7=="ON") echo("<li>fizica"); if ($C8=="ON") echo("<li>chimia"); if ($C9=="ON") echo("<li>biologia"); if ($C10=="ON") echo("<li>sportul"); if ($C11=="ON") echo("<li>geografia"); if ($C12=="ON") echo("<li>istoria"); if ($C13=="ON") echo("<li>economia"); echo("</li></ol>"); echo("<li>Disponibilitatea: $disponib"); echo("<li>Sectiuni (programe):<ol>"); if ($PR1=="ON") echo("<li>Revista"); if ($PR2=="ON") echo("<li>Cercul de teatru Thalia"); if ($PR3=="ON") echo("<li>Administrarea retelei de calculatoare"); if ($PR4=="ON") echo("<li>Cercul de arta Apollo"); if ($PR5=="ON") echo("<li>Cenaclul literar Poesis"); if ($PR6=="ON") echo("<li>Muzicienii informaticieni"); echo("</li></ol>"); echo("<li>Sugestii/comentarii: $sugestii</li></ul>"); echo("</p>"); echo("<p><center><font size=+2 color='blue'>"); echo("Va multumim pentru inscrierea dvs. in "); echo("<a href='clubul.html'>Clubul nostru</a>!"); echo("</font></center></p>"); echo("<p align='center'><a href='javascript:history.back()'> echo("<img src='previous.gif'></img></a></p>"); echo("</body></html>"); $f=fopen("formular.txt","a"); fwrite($f,"------------------------------\n"); fwrite($f,$nume); fwrite($f,"\n"); fwrite($f,$email); fwrite($f,"\n"); fwrite($f,$telefon); fwrite($f,"\n"); fwrite($f,$mobil); fwrite($f,"\n"); fwrite($f,$sex); fwrite($f,"\n"); fwrite($f,$clasa); fwrite($f,$lclasa); fwrite($f,"\n"); if ($C1=="ON") fwrite($f,"1-da\n"); else fwrite($f,"1-nu\n"); if ($C2=="ON") fwrite($f,"2-da\n"); else fwrite($f,"2-nu\n"); if ($C3=="ON") fwrite($f,"3-da\n"); else fwrite($f,"3-nu\n"); if ($C4=="ON") fwrite($f,"4-da\n"); else fwrite($f,"4-nu\n"); if ($C5=="ON") fwrite($f,"5-da\n"); else fwrite($f,"5-nu\n"); if ($C6=="ON") fwrite($f,"6-da\n"); else fwrite($f,"6-nu\n"); if ($C7=="ON") fwrite($f,"7-da\n"); else fwrite($f,"7-nu\n"); if ($C8=="ON") fwrite($f,"8-da\n"); else fwrite($f,"8-nu\n"); if ($C9=="ON") fwrite($f,"9-da\n"); else fwrite($f,"9-nu\n");

Page 10: Dezvoltare Aplicatii Web

if ($C10=="ON") fwrite($f,"10-da\n"); else fwrite($f,"10-nu\n"); if ($C11=="ON") fwrite($f,"11-da\n"); else fwrite($f,"11-nu\n"); if ($C12=="ON") fwrite($f,"12-da\n"); else fwrite($f,"12-nu\n"); if ($C13=="ON") fwrite($f,"13-da\n"); else fwrite($f,"13-nu\n"); fwrite($f,$disponib); fwrite($f,"\n"); if ($PR1=="ON") fwrite($f,"1-da\n"); else fwrite($f,"1-nu\n"); if ($PR2=="ON") fwrite($f,"2-da\n"); else fwrite($f,"2-nu\n"); if ($PR3=="ON") fwrite($f,"3-da\n"); else fwrite($f,"3-nu\n"); if ($PR4=="ON") fwrite($f,"4-da\n"); else fwrite($f,"4-nu\n"); if ($PR5=="ON") fwrite($f,"5-da\n"); else fwrite($f,"5-nu\n"); if ($PR6=="ON") fwrite($f,"6-da\n"); else fwrite($f,"6-nu\n"); fwrite($f,$sugestii); fwrite($f,"\n"); fclose($f); } ?>

Fisierul rezultat (FORMULAR.TXT) va arata cam asa: ------------------------------ Dragoi Daniel [email protected] 034/127347 094/885264 masculin 9E 1-nu 2-da 3-nu 4-nu 5-da 6-nu 7-nu 8-nu 9-nu 10-nu 11-nu 12-nu 13-nu o data pe saptamana 1-nu 2-nu 3-da 4-nu 5-nu 6-nu Sunteti grozavi! # ------------------------------ Ionescu Maria [email protected] 034/174396 092/189112 feminin

Page 11: Dezvoltare Aplicatii Web

10E 1-da 2-nu 3-da 4-da 5-da 6-nu 7-nu 8-nu 9-nu 10-nu 11-nu 12-nu 13-nu in week-end 1-nu 2-nu 3-nu 4-nu 5-da 6-da Ar fi bine sa existe si un cerc de limbi straine. #

b) Citirea si afisarea datelor dintr-un fisier

In continuare vom realiza programul PHP care sa citeasca si sa afiseze datele din fisierul FORMULAR.TXT din exemplul anterior. Fireste, nu este cel mai potrivit mod de a lucra cu date atât de complexe, de aceea vom apela la un sistem de gestiune a bazelor de date (SGBD), precum MySQL, care este foarte simplu de invatat si de utilizat, este liber si versiunile sale pentru Windows95/98 si Linux pot fi desc`rcate din web de la adresa http://www.mysql.com.

Dar pâna atunci, programul care realizeaza citirea si afisarea datelor despre persoanele incluse in club este cel de mai jos. Din punct de vedere didactic, acest program si cel de la punctul anterior au rolul de a prezenta utlizarea eficienta a instructiunii if-else, lucrul cu fisiere text, precum si crearea de pagini web in mod dinamic, direct din cod PHP.

Programul de mai jos prezinta si o utilizare interesanta a functiei de generare a numerelor aleatoare, care face ca de fiecare data când se va genera pagina web dinamica sa se obtina o alta imagine GIF in cadrul paginii. Daca imaginile GIF sunt si animate, efectul este foarte captivant.

<?php echo("<html><title>Persoane inscrise in club</title>"); echo("<body background='fond.jpg'>"); echo("<p align='center'>"); srand((double)microtime()*1000000); $r = rand(0,3); if ($r==0) { echo("<a href='formular.html'>"); echo("<img src='clubarta.gif'></a>\n")"); } else if ($r==1) { echo("<a href='formular.html'>"); echo("<img src='clubmuzica.gif'></a>\n");}

Page 12: Dezvoltare Aplicatii Web

else if ($r==2) { echo("<a href='formular.html'>"); echo("<img src='clubretea.gif'></a>\n");} else if ($r==3) { echo("<a href='veniti_cu_noi.html'>"); echo("<img src='veniticunoi.gif'></a>\n"); } echo("</p><br>"); echo("<img src='calv.gif'>\n"); echo("<center><font size=+2 color='blue'>"); echo("Persoanele inscrise in <b><a href='clubul.html'>"); echo("CLUBUL NOSTRU</a></b> sunt:</font></center><br><br>"); echo("<p align='right'>"); echo("<ol>"); $denumire[1]="Revista"; $denumire[2]="Thalia"; $denumire[3]="Retea"; $denumire[4]="Apollo"; $denumire[5]="Poesis"; $denumire[6]="Muzica"; $f=fopen("formular.txt","r"); $n=0; while (!feof ($f)) { $s = fgets($f, 4096); if ($s!="") { $numele = fgets($f, 4096); $n=$n+1; for ($i=3; $i<7; $i++) $s = fgets($f, 4096); $cl = fgets($f, 4096); for ($i=8; $i<22; $i++) $s = fgets($f, 4096); echo("<p>$n. <b>$numele</b>, <i>$cl</i>---> "); for ($i=22; $i<28; $i=$i+1) { $s = fgets($f, 4096); if ($s[2]=="d") { $y=$s[0]; echo("$denumire[$y]; "); } } $gata=0; while (!$gata) { $s = fgets($f, 4096); if ($s[0]=='#') $gata=1; } } echo("</p>"); } fclose ($f); echo("<p><br><b>Total: $n persoane.</b></p>"); ?>

In acest program am folosit functia fgets pentru a citi date dintr-un fisier text. PHP dispune de o mare varietate de functii de intrare-iesire a datelor din fisiere, asa ca ramâne la latitudinea fiecarui programator de a alege cea mai potrivita varianta, pentru o situatie data.

Page 13: Dezvoltare Aplicatii Web

Laboratorul 4. Utilizarea sistemului de baze de date MYSQL din linia de comanda

Ca si PHP, MySQL se gaseste liber pe Internet, la adresa http://www.mysql.com, de unde il puteti descarca si instala. Puteti testa programele sub Windows 95/98 si apoi sa le transferati sub mediul Linux, cu mici modificari legate de conectarea la serverul MySQL.

Crearea bazei de date.... Sa zicem ca se va numi “baza”. Cum se face? [SIMONA]

Interogarea MySQL

Limbajul SQL care sta la baza interogarilor bazelor de date relationale nu este foarte complicat, dar invatarea lui nu constituie obiectul acestui material. Totusi, câteva comenzi de baza si exemple de utilizare vom prezenta in continuare. Toate comenzile in MySQL trebuie sa se termine cu simbolul punct si virgula ";".

1) Conectarea utilizatorului la serverul MySQL se poate face cu:

connect;

Parametrii optionali pot fi baza de date si calculatorul gazd`.

Exemplu: mysql> connect Connection id: 5 Current database: baza

2) Dând comanda use baza; ne putem alege baza de date "baza" pentru a lucra in continuare cu ea (o deschidem).

Exemplu: mysql> use baza; Database changed

3) Comanda create table ne permite crearea unui nou tabel, cu o anumita structura, in cadrul bazei de date curente.

Exemplu: Vom crea tabelul agenda pentru gestionarea numelor si vârstelor unor persoane: mysql> create table agenda (nume char(30), varsta int(3)); Query OK, 0 rows affected (0.22 sec)

Creati tabela/tabelul marfuri cu urmatoarea structura. Ce tipuri de date ar fi potrivite pentru fiecare din aceste campuri? +------------+------+------+---------+ | denumire | pu | cant | valoare | +------------+------+------+---------+

Page 14: Dezvoltare Aplicatii Web

4) Comanda show tables ne da lista tuturor tabelelor existente in baza curenta:

Exemplu: mysql> show tables; +----------------+ | Tables_in_baza | +----------------+ | agenda | | marfuri | +----------------+ 2 rows in set (0.22 sec)

5) Pentru a introduce (adauga) o noua inregistrare in tabelul marfuri al bazei de date curente, putem folosi comanda insert, ca in exemplu urmator:

Exemplu: Adaugam in tabel un nou produs, numit 'CONOPIDA', precizându-i toate câmpurile si toate valorile corespunzatoare câmpurilor, apoi vizualizam tabelul rezultat dupa adaugare (scrieti cu litere mari CONOPIDA!). mysql> insert into marfuri(denumire, pu, cant, valoare) values('CONOPIDA',8,10,80) ; Query OK, 1 row affected (0.00 sec)

Sa mai adaugam in tabelul marfuri si urmatoarele inregistari (scrieti conopida, mazare, piersici etc. cu litere mici!) | conopida | 18 | 43 | 774 | | mazare | 35 | 3 | 105 | | piersici | 6 | 56 | 336 | | cartofi | 19 | 34 | 646 | | morcovi | 10 | 20 | 200 | | conopida | 16 | 7 | 112 | | castraveti | 8 | 10 | 80 | | pepene | 78 | 18 | 1404 |

Acum sa invatam cum puteam vedea ce avem in tabel.

6) Pentru a realiza o interogare a unui tabel din baza de date, deci pentru a selecta si afisa toate sau doar o parte din inregistrarile dintr-un tabel, se foloseste comanda select, care este cea mai complexa comanda SQL, iar descrierea ei in totalitate nu face subiectul acestui material. Revedeti cursul de Baze de date sau pe cel de Sisteme de gestiunea bazelor de date!

Exista, insa, o serie de manuale de baze de date sau despre limbajul SQL din care poti invata mult mai multe. Totusi, câteva exemple folosind comanda SQL vor fi date mai jos. Toate exemplele se refera la tabelul marfuri din baza de date curenta (baza).

Exemple:

a) Afisarea tuturor inregistrarilor din tabel: mysql> select * from marfuri;

Page 15: Dezvoltare Aplicatii Web

+------------+------+------+---------+ | denumire | pu | cant | valoare | +------------+------+------+---------+ | conopida | 18 | 43 | 774 | | mazare | 35 | 3 | 105 | | piersici | 6 | 56 | 336 | | cartofi | 19 | 34 | 646 | | morcovi | 10 | 20 | 200 | | conopida | 16 | 7 | 112 | | castraveti | 8 | 10 | 80 | | pepene | 78 | 18 | 1404 | | CONOPIDA | 8 | 10 | 80 | +------------+------+------+---------+ 9 rows in set (0.00 sec)

b) Afisarea doar a denumirilor si a valorii tuturor inregistrarilor din tabel: mysql> select denumire, valoare from marfuri; +------------+---------+ | denumire | valoare | +------------+---------+ | conopida | 774 | | mazare | 105 | | piersici | 336 | | cartofi | 646 | | morcovi | 200 | | conopida | 112 | | castraveti | 80 | | pepene | 1404 | +------------+---------+ 8 rows in set (0.05 sec)

c) Afisarea doar a produselor cu valoarea mai mare sau egala cu o valoare data (500): mysql> select * from marfuri where valoare>=500; +----------+------+------+---------+ | denumire | pu | cant | valoare | +----------+------+------+---------+ | conopida | 18 | 43 | 774 | | cartofi | 19 | 34 | 646 | | pepene | 78 | 18 | 1404 | +----------+------+------+---------+ 3 rows in set (0.06 sec)

d) Afisarea valorii produselor din tabel si a valorii cu tot cu TVA (se considera cota TVA ca fiind de 19%). Desi in structura tabelului nu exista câmpul val_tva, se va genera aceasta coloana prin comanda select de mai jos: mysql> select denumire, valoare, valoare*1.19 as val_tva from marfuri; +------------+---------+---------+ | denumire | valoare | val_tva | +------------+---------+---------+ | conopida | 774 | 921.06 | | mazare | 105 | 124.95 | | piersici | 336 | 399.84 | | cartofi | 646 | 768.74 | | morcovi | 200 | 238.00 | | conopida | 112 | 133.28 |

Page 16: Dezvoltare Aplicatii Web

| castraveti | 80 | 95.20 | | pepene | 1404 | 1670.76 | +------------+---------+---------+ 8 rows in set (0.00 sec)

e) Selectarea produselor din tabel cu preturi unitare intre doua valori date (de exemplu 10 si 40), in ordine alfabetica: mysql> select * from marfuri where pu between 10 and 40 order by denumire; +----------+------+------+---------+ | denumire | pu | cant | valoare | +----------+------+------+---------+ | cartofi | 19 | 34 | 646 | | conopida | 18 | 43 | 774 | | conopida | 16 | 7 | 112 | | mazare | 35 | 3 | 105 | | morcovi | 10 | 20 | 200 | +----------+------+------+---------+ 5 rows in set (0.00 sec)

7) Instruc\iunea SQL delete sterge una sau mai multe intregistrari dintr-un tabel al bazei de date. Se pot folosi, ca si la select, diferite criterii de stergere.

Exemplu: La tabelul de mai sus, daca aplicam urmatoarea instructiune delete, vom elimina din tabel rândurile ce contin atât denumirea 'conopida', cât si denumirea 'CONOPIDA". Acest lucru se datoreazaoperatorului special like, care nu deosebeste literele mari de cele mici.

mysql> delete from tabel where denumire like 'conopida'; Query OK, 3 rows affected (0.05 sec) mysql> select * from tabel; +------------+------+------+---------+ | denumire | pu | cant | valoare | +------------+------+------+---------+ | mazare | 35 | 3 | 105 | | piersici | 6 | 56 | 336 | | cartofi | 19 | 34 | 646 | | morcovi | 10 | 20 | 200 | | castraveti | 8 | 10 | 80 | | pepene | 78 | 18 | 1404 | +------------+------+------+---------+ 6 rows in set (0.16 sec)

8) In sfârsit, instructiunea update permite actualizarea unui articol din baza de date. Afla singur cum se foloseste!

Corespunzatoare tuturor acestor instructiuni SQL exista functiile PHP de lucru cu baze de date MySQL numite mysql_connect pentru conectarea la baza de date si mysql_query pentru realizarea de interogari SQL, deci pentru celelalte comenzi. Acestea vor fi exemplificate in continuare.

Page 17: Dezvoltare Aplicatii Web

Laboratorul 5. Lucrare de verificare cu diferite exercitii

In care se va constata care studenti au priceput si stiu ceva (Dragos, Florin, Doina, Corneliu, Vlad, Andrei) si care nu (ceilalti)

Laboratorul 6. Transmiterea datelor prin FTP (upload) si generarea automata de e-mail.

Funcţiile ftp_connect, ftp_login, ftp_put, ftp_quit, send_mail?

Exemplu: $con=ftp_connect("bogdan"); ftp_login($con,"bogdan","passw"); $nf=$den."_".$pret."_".$cantit; $p=strrpos($poza,"."); $extensie=substr($poza,$p+1); $fis_poza=$nf.".".$extensie; ftp_put($con,$fis_poza,$poza,FTP_BINARY); ftp_quit($con); echo "<html><head><title>Adaugare</title></head>"; echo "<body background='fond.jpg'>"; echo "<br>Am adaugat: <b>$den</b>, PU: $pret Cant: $cantit Val: $valoare"; $s=stripslashes($poza); echo ("<p align='center'><img src='$s'</p>"); echo("</body></html>"); }

Laboratoarele 7-12. Realizarea unei aplicatii practice in echipe de cate 1-3

Teme (pot fi si sugestii ale studentilor) • Depozit virtual • Magazin virtual • Blog • Forum de discutii • Site matrimoniale • Site anunturi • Site job-uri • Catalog online pentru biblioteci • Site cumparari/vanzari auto • Site de socializare

Laboratoarele 13 si 14. Prezentarea proiectului si notare

Page 18: Dezvoltare Aplicatii Web

Anexă

Exemplu de aplicate complexaPHP-MySQL

In continuare vom prezenta o aplicatie PHP cu o baza de date MySQL mai complexa, In care putem face adaugari, stergeri, vizualizari intr-un tabel MySQL, direct dintr-o pagina web, prin intermediul unor functii PHP.

Astfel, sa consider`m ca avem o baza de date numita chiar BAZA, ce contine un tabel numit chiar TABEL, acesta având urmatoarea structura:

denumire - caracter(20), pu - numeric(5), cant - numeric(5), valoare - numeric(10)

Baza de date se refera la produsele (m`rfurile) dintr-o magazie. Câmpul valoare este determinat ca fiind pu inmultit cu cant.

Vom crea o pagina web cu doua cadre: in cadrul din stânga vom avea un meniu de unde putem accesa diferite comenzi asupra tabelului, comenzi al caror efect se va vizualiza in cadrul din dreapta.

Iata cum va arata pagina web in cazul in care s-a actionat, de exemplu, comanda "Adaugare":

Practic, va trebui sa cream, pentru aplicatia noastra, urmatoarele fisiere:

• INDEX.HTML - pagina principala, cea care va fi accesata de catre utilizatorul aplicatiei; in aceasta pagina sunt descrise cadrele din stânga si din dreapta

Page 19: Dezvoltare Aplicatii Web

<html> <head> <title>Depozitul virtual</title> <frameset border="5" frameborder="5" cols="180,*"> <frame name="left" target="right" resizable src="meniu.html" scrolling="yes"> <frame name="right" resizable src="prezentare.html"> <noframes> </head> <body> Depozitul virtual. This page uses frames, but your browser doesn't support them. </body> </noframes> </frameset> </html>

• MENIU.HTML - pagina ce contine referinte catre paginile ce implementeaza comenzile de lucru cu tabelul TABEL din baza de date BAZA: PREZENTARE.HTML, ADAUGARE.HTML, STERGERE.HTML, MODIFICARE.HTML, VIZUALIZARE.HTML.

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Microsoft FrontPage Express 2.0"> <title>Meniu principal</title> </head> <body background="fond.jpg" bgcolor="#C0C0C0"> <p><font color="#800000" size="4"><strong>Depozitul virtual</strong></font></p> <p><a href="prezentare.html" target="right">Prezentare</a></p> <p><a href="adaugare.html" target="right">Adaugare</a></p> <p><a href="stergere.html" target="right">Stergere</a></p> <p><a href="modificare.html" target="right">Modificare</a></p> <p><a href="vizualizare.html" target="right">Vizualizare</a></p> <p>&nbsp;</p> </body> </html>

Fireste, vom avea cele cinci fisiere care sunt apelate din meniu. Fisierul MODIFICARE.HTML nu este creat; Iti propun drept exercirtiu implementarea comenzii de modificare a unui articol din baza de date. Vei folosi instructiunea UPDATE din SQL.

• PREZENTARE.HTML este incarcat imediat chiar din INDEX.HTML si contine o scurta descriere a aplicatiei noastre:

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Microsoft FrontPage Express 2.0"> <title>Prezentare</title> </head>

Page 20: Dezvoltare Aplicatii Web

<body background="fond.jpg" bgcolor="#FFFFFF"> <p><font color="#FF0000" size="5"><strong>Depozitul virtual:</strong></font></p> <p>Puteti adauga, sterge si vizualiza selectiv informatiile despre mai multe produse dintr-un depozit.</p> <p>Alegeti comenzile din maniul din partea stanga.</p> <p>(C) 2001 <strong>Bogdan Patrut</strong></p> </body> </html>

Sub forma grafica, aceasta pagina arata astfel:

• Urm`toarea pagina, ADAUGARE.HTML, contine un formular de adaugare, a carei actiune este in script-ul ADAUGARE.PHP:

<html> <head> <title>Adaugare</title> </head> <body background="fond.jpg" bgcolor="#FFFFFF"> <p><font color="#FF0000" size="5"> <strong>Adaugare produs:</strong></font></p> <p>Se adauga un produs nou in baza de date.</p> <form action="adaugare.php" method="POST"> <p>Denumire: <input type="text" size="20" name="den">&nbsp; Pret unitar: <input type="text" size="20" name="pret"></p> <p>Cantitate: <input type="text" size="20" name="cantit"> <p>Fisier cu poza: <input type="file" size="20" name="poza"> <p><input type="submit" name="butonOK" value="Adauga"> Parola de adaugare: <input type="password" size="8" name="parola"></p> </form> </body> </html>

Page 21: Dezvoltare Aplicatii Web

Grafic, aceasta pagina arata astfel:

• Pagina de stergere, STERGERE.HTML, contine un formular similar ce face apel la script-ul PHP descris in fisierul STERGERE.PHP.

<html> <head> <title>Stergere</title> </head> <body background="fond.jpg" bgcolor="#FFFFFF"> <p><font color="#FF0000" size="5"> <strong>Stergere produse:</strong></font></p> <p>Se sterg produse diin baza de date, dupa criterii:</p> <form action="stergere.php" method="POST"> <p>Denumire: <input type="text" size="20" name="den">&nbsp; Pret unitar: <input type="text" size="20" name="pret"></p> <p>Cantitate: <input type="text" size="20" name="cantit"><input type="submit" name="butonOK" value="Sterge"> Parola de stergere: <input type="password" size="9" name="parola"></p> </form> </body> </html>

In programul de navigare vom vedea aceasta pagina astfel:

Page 22: Dezvoltare Aplicatii Web

• In sfârsit, VIZUALIZARE.HTML contine un formular asemanator: <html> <head> <title>Vizualizare</title> </head> <body background="fond.jpg" bgcolor="#FFFFFF"> <p><font color="#FF0000" size="5"> <strong>Vizualizare produse:</strong></font></p> <p>Se listeaza produse din baza de date, dupa criterii:</p> <form action="vizualizare.php" method="POST"> <p>Denumire: <input type="text" size="20" name="den">&nbsp; Pret unitar: <input type="text" size="20" name="pret"></p> <p>Cantitate: <input type="text" size="20" name="cantit">&nbsp;<input type="submit" name="butonOK" value="Listeaza"></p> <p>Ordonare dupa: <input type="radio" checked name="R1" value="denumire"> denumire <input type="radio" name="R1" value="pu"> pret unitar <input type="radio" name="R1" value="cantitate">cantitate</p> </form> </body> </html> Aceast` descriere va aparea in pagina web astfel:

Page 23: Dezvoltare Aplicatii Web

Comanda de vizualizare poate avea urmatorul efect, daca se lasa libere toate câmpurile:

In continuare, vom prezenta cele trei script-uri care realizeaza operatiile de adaugare, stergere si respectiv vizualizare a unor inregistrari din tabelul bazei de date, pe baza formularelor descrise. Conventia la vizualizare este ca daca nu se introduce nici un câmp

Page 24: Dezvoltare Aplicatii Web

in formular, atunci se vor vizualiza toate inregistrarile din baza de date, dar fara fotografii (ci doar cu trimiteri la ele).

• Programul: ADAUGARE.PHP - adauga produsul cu datele din formular in baza de date. Formularul contine un câmp de parola, asa incât nu orice persoana poate adauga un articol in baza de date, ci doar cei ce cunosc parola (care este chiar textul "parola").

<?php if ($parola!="parola") { echo "<html><head><title>Stergere</title></head>"; echo "<body background='fond.jpg'>"; echo "<br>Adaugarea o poate face doar"; echo "administratorul!"; echo "<br>El cunoaste parola de stergere!"; echo "</body></html>"; } else { // bogdan=127.0.0.1 $con=mysql_connect("","bogdan","passw") or die("Nu ma pot conecta!"); mysql_select_db("baza",$con); $valoare=$cantit*$pret; mysql_query("insert into tabel(denumire,pu,cant,valoare) values(\"$den\", \"$pret\", \"$cantit\", \"$valoare\");", $con); mysql_close($con); $con=ftp_connect("bogdan"); ftp_login($con,"bogdan","passw"); $nf=$den."_".$pret."_".$cantit; $p=strrpos($poza,"."); $extensie=substr($poza,$p+1); $fis_poza=$nf.".".$extensie; ftp_put($con,$fis_poza,$poza,FTP_BINARY); ftp_quit($con); echo "<html><head><title>Adaugare</title></head>"; echo "<body background='fond.jpg'>"; echo "<br>Am adaugat: <b>$den</b>, PU: $pret Cant: $cantit Val: $valoare"; $s=stripslashes($poza); echo ("<p align='center'><img src='$s'</p>"); echo("</body></html>"); } ?>

Vei observa cu usurinta faptul ca in afara de a adauga datele unui produs in baza de date, are loc si un transfer al unui fisier binar continând imaginea produsului. Acest fisier se afla pe calculatorul client si este transferat pe calculatorul server (gazda), prin protocolul FTP, folosind chiar functii specializate pe "File transfer protocol" pe care le detine PHP. Daca ti se pare ca nu intelegi cum stau lucrurile cu transferul prin FTP sau ai o problema cu acest lucru, poti elimina liniile de program care fac referinta la transferul imaginii produsului.

• Programul STERGERE.PHP realizeaza eliminarea tuturor produselor din baza de date care se potrivesc modelului dat de felul in care este completat formularul din pagina STERGERE.HTML.

Page 25: Dezvoltare Aplicatii Web

<?php if ($parola!="parola") { echo "<html><head><title>Stergere</title></head>"; echo "<body background='fond.jpg'>"; echo "<br>Stergerea o poate face doar"; echo "administratorul!"; echo "<br>El cunoaste parola de stergere!"; echo "</body></html>"; } else { if (($den=="") && ($pret=="") && ($cantit=="")) { $con=mysql_connect("","bogdan","passw") or die("Nu ma pot conecta!"); mysql_select_db("baza",$con); $s="delete from tabel"; mysql_query($s,$con); mysql_close($con); echo "<html><head><title>Stergere</title></head>"; echo "<body background='fond.jpg'>"; echo "<br>S-au sters toate inregistrarile!"; echo "</body></html>"; } else { // server, cont, parola $con=mysql_connect("","bogdan","passw") or die("Nu ma pot conecta!"); mysql_select_db("baza",$con); $s="delete from tabel where "; if ($den!="") if (($pret!="") or ($cantit!="")) $s1="denumire like \"$den\" and "; else $s1="denumire like \"$den\""; else $s1=""; if ($pret!="") if ($cantit!="") $s2="pu=$pret and"; else $s2="pu=$pret"; else $s2=""; if ($cantit!="") $s3="cant=$cantit"; else $s3=""; $s=$s.$s1.$s2.$s3.";"; mysql_query($s,$con); mysql_close($con); echo "<html><head><title>Stergere</title></head>"; echo "<body background='fond.jpg'>"; echo "<br>Am sters toate produsele $s"; echo "</body></html>"; } } ?>

• Programul de vizualizare VIZUALIZARE.HTML este prezentat mai jos si ia in discutie mai multe modalitati de vizualizare a continutului bazei de date:

<?php if (($den=="") && ($pret=="") && ($cantit=="")) { $con=mysql_connect("","bogdan","passw") or die("Nu ma pot conecta!");

Page 26: Dezvoltare Aplicatii Web

mysql_select_db("baza",$con); echo "<html><head><title>Vizualizare</title></head>"; echo "<body background='fond.jpg'>"; echo "<br>Mai jos sunt listate toate produsele<p>"; echo "<table border=\"1\">"; echo "<tr>"; echo "<td><strong>Nr. crt.</strong></td>"; echo "<td><strong>Denumire</strong></td>"; echo "<td><strong>Pret unitar</strong></td>"; echo "<td><strong>Cantitate</strong></td>"; echo "<td><strong>Valoare</strong></td>"; echo "<td><strong>Imagine</strong></td></tr>"; $s="select * from tabel order by "; if ($R1=="denumire") $s=$s."denumire;"; else if ($R1=="pu") $s=$s."pu;"; else $s=$s."cant desc;"; echo ($s); $rez=mysql_query($s, $con); $conftp=ftp_connect("bogdan"); ftp_login($conftp,"bogdan","passw"); $i=0; while ($sir=mysql_fetch_array($rez)) { $i=$i+1; echo "<tr>"; echo "<td>$i</td>"; echo "<td>$sir[0]</td>"; echo "<td>$sir[1]</td>"; echo "<td>$sir[2]</td>"; echo "<td>$sir[3]</td>"; $nf=$sir[0]."_".$sir[1]."_".$sir[2].".jpg"; //!!! // ftp_get($conftp,"c:\\Windows\\Temp\\".$nf,$nf,FTP_BINARY); $poza = stripslashes($nf); // $ss="c:\\Windows\\Temp\\".$nf; $ss="ftp://bogdan//".$nf; echo "<td><a href=$ss>click aici pentru "; echo "foto</a></td>"; echo "</tr>"; } echo "</table>"; mysql_free_result($rez); ftp_quit($conftp); echo "</p></body></html>"; } else { $con=mysql_connect("","bogdan","passw") or die("Nu ma pot conecta!"); mysql_select_db("baza",$con); $s="select * from tabel where "; if ($den!="") if (($pret!="") or ($cantit!="")) $s1="denumire like \"$den\" and "; else $s1="denumire like \"$den\"";

Page 27: Dezvoltare Aplicatii Web

else $s1=""; if ($pret!="") if ($cantit!="") $s2="pu=$pret and"; else $s2="pu=$pret"; else $s2=""; if ($cantit!="") $s3="cant=$cantit"; else $s3=""; $s=$s.$s1.$s2.$s3.";"; echo "<html><head><title>Vizualizare</title></head>"; echo "<body background='fond.jpg'>"; echo "<br>Mai jos sunt listate toate produsele $s<p>"; echo "<table border=\"1\">"; echo "<tr>"; echo "<td><strong>Nr. crt.</strong></td>"; echo "<td><strong>Denumire</strong></td>"; echo "<td><strong>Pret unitar</strong></td>"; echo "<td><strong>Cantitate</strong></td>"; echo "<td><strong>Valoare</strong></td>"; echo "<td><strong>Imagine</strong></td></tr>"; $rez = mysql_query($s, $con); $conftp=ftp_connect("bogdan"); ftp_login($conftp,"bogdan","passw"); $i=0; while ($sir=mysql_fetch_array($rez)) { $i=$i+1; echo "<tr>"; echo "<td>$i</td>"; echo "<td>$sir[0]</td>"; echo "<td>$sir[1]</td>"; echo "<td>$sir[2]</td>"; echo "<td>$sir[3]</td>"; $nf=$sir[0]."_".$sir[1]."_".$sir[2].".jpg"; //!!! ftp_get($conftp,$nf,$nf,FTP_BINARY); $poza = stripslashes($nf); // echo "<td><a href='$poza'>click aici pentru "; // echo "foto</a></td>"; echo "<td><img src='$poza'></td>"; echo "</tr>"; } echo "</table>"; mysql_free_result($rez); ftp_quit($conftp); echo "</p></body></html>"; } ?>

Incearca acest exemplu, schimbând la nevoie numele serverului, numele utilizatorului si parola si apoi fa mici modificari, pentru a invata prin descoperire ce sta in spatele acestor programe. Apoi incearca singur sa obtii rezultate deosebite exploatând baze de date direct din paginile web.

Mult succes!