1. MYSQL-prezentare generală
1.Introducere
Informatica, deși este o știință nouă, și-a făcut deja intrarea în toate domeniile vieții cotidiene. Impactul său asupra societății se manifestă prin multiplicarea sistemelor de calcul, a sistemelor informatice, a editoarelor de texte, a tuturor aplicațiilor care folosesc calculatoare mai productive și mai ușor de utilizat.
Deși trăim într-o societate în care rata de schimb a tehnologiei a ajuns să ne depășească, există domenii care se schimbă mult prea lent față de așteptările noastre. Să luăm de exemplu calculatoarele. Nu există zi în care să nu auzim de noutăți în ceea ce privește viteza, numărul de culori sau miniaturizarea. Nu există zi în care să nu auzim de noi aplicații și de noi domenii în care a fost introdusă informatica. Și totuși, nimic esențial nu s-a schimbat în partea de fundamente. Aceeași arhitectură numerică guvernează întreg spectrul de calculatoare aflate azi pe piață ca și acum jumătate de secol.
Dar informatica este înainte de toate o știință a abstractizării, prin crearea unui model pentru o problemă și alegerea unor tehnici automatizabile corespunzătoare pentru rezolvarea acesteia.
Toate celelalte științe consideră universul așa cum este el. De exemplu, activitatea unui fizician se derulează în sensul de a înțelege cum funcționează lumea și nu de a inventa o lume în care legile fizicii ar fi mai simple și deci mai ușor de respectat.
Informaticienii trebuie să creeze abstractizări ale lumii reale care ar putea fi reprezentate și manipulate într-un sistem de calcul.
Modelarea informațiilor din lumea reală presupune integrarea unor concepte matematice și informatice ceea ce constituie o apropiere între cele două domenii de importanță deosebită.
Apariția calculatoarelor a stimulat și dezvoltat un nou mod de gândire : gândirea algoritmică, ce permite sortarea, analiza și prelucrarea unui mare număr de posibilități, precum și alegerea celei mai potrivite care conduce la soluția problemei.
Rețelele de calculatoare au devenit populare când au început să furnizeze servicii la domiciliu pentru persoane particulare. Domeniile în care se utilizează cu precădere rețelele:
Accesul la informație poate avea diferite forme: accesul la instituții financiare, cumpărături de la domiciliu cu consultarea prealabilă a cataloagelor on-line, accesul la World Wide Web, biblioteci digitale, informații despre arte, politică, știință, sport. Acest tip de comunicație presupune o interacțiune dintre o persoană și o bază de date aflată la distanță.
Poșta electronică, mijloc flexibil de comunicație, este deja larg utilizat de către milioane de oameni. Deja există posibilitatea de a comunica în timp real, eventual folosindu-se chiar de sunete și imagini. Această tehnologie face posibilă întâlnirile virtuale, numite videoconferințe, între oameni aflați în locuri diferite pe glob.
Aplicația care se bucură de cel mai mare succes este video la cerere. În plus, filmele noi ar putea fi interactive, spectatorul poate decide asupra derulării acțiunii. După alte păreri jocurile interactive vor avea un impact și mai spectaculos. Jucătorii, aflați dealtfel la mare distanță între ei, cu ajutorul animației tridimensionale în timp real, vor avea senzația de realitate în timpul derulării jocului.
Aplicația de față își propune o ușoară incursiune în programarea web . Designerul ar trebui să urmăreasca nu atât pastrarea modelului, cât a facilitatilor pe care acesta le ofera: navigare rapida, impact vizual, informare completă.
Până la începutul anilor 1990 Internet-ul a fost utilizat mai ales cu cercetători din domeniul academic, guvernamental și industrial. aplicația WWW (World Wide Web), a schimbat toată situația și a adus în rețea milione de utilizatori care nu fac parte din mediul academic. WWW-ul cu aplicațiile specifice a reușit să pună la dispoziție un număr de pagini de informații conținând text, poze, sunet și chiar video, în fiecare pagină existând legături către alte pagini. Printr-un clic pe legătură, utilizatorul este transportat spre necunoscut…
Motto:
Daca s-ar construi asa cum se proiecteaza software, prima ciocanitoare care ar aparea ar distruge civilizatia…
(Mark Mullin)
1. MYSQL-prezentare generală
În acest capitol se vor prezenta câteva din facilitățile MYSQL-ului și nu se va face oprezentare generală a limbajului deoarece nu aceasta este tema principală a prezentei lucrări.
MYSQL este un server de date SQL foarte rapid, multi user, mulți thread și foarte robust. Este făcut să ruleze pe sisteme foarte încărcate și să folosească foarte puține resurse. Se poate folosi atât gratis sub licență GNU (GNU GENERAL PUBLIC LICENSE) sau se poate opta pentru ăchiziționarea unei versiuni comerciale de la MYSQL AB. Site-ul oficial este http://mysql.com unde se pot găsi multe informații utile, tutoriale, documentații sau diverse utilitare pentru gestionarea bazelor de date.Mysql este cel mai popular server de date SQL OPEN SOURCE, ceea ce înseamnă că se poate codul și modifica fără a fi nevoie să se plătească. MYSQL se bazează pe tehnologia client/server și este folosit pentru gestiunea bazelor de date relaționale
1.1 Principalele facilități ale mysql
În continuare vom prezenta câteva din calitățile acestui produs:
este scris în C și C++ și a fost testat pe mai multe compilatoare.
nu are probleme cu alocarea de memorie
se poate instala pe: AIX 4.x, Amiga, BSDI 2.x sau 3.0 sau 3.1 sau4.x, DEC UNIX 4.x, FreeBSD 2.x sau 3.x, HP UX 10.20 sau Linux 2.0+ ,Mac OS X Server, NetBSD1.3 sau 1.4, OpenBSD 2.5+, OS/2 Warp, SGI Irix 6.x, Solaris 2.5+, SunOS 4.x, SCO UnixWare 7.0.1,SCO OpenServer, Tru64 Unix, Win 9x, Win NT, Win 2000, Win XP.
folosește GNU Automake, Autoconf și Libtool pentru portabilitate.
conține funcții API pentru C, C++, Java, Perl, PHP, Phyton și Tcl.
este complet multi-thread; poate folosi cu ușurință mai multe procesoare.
folosește o structură de B-arbori pentru tabele de pe disc cu indecși comprimați.
procese rapide bazate pe alocarea memoriei de către sistem.
operațiuni de JOIN foarte rapide prin utilizarea unei operații optimizate de multi-join.
tabela hash este în memorie și este folosită ca și tabele temporare.
funcțiile SQL sunt implementate ca și niște librării foarte bine optimizate și ar trebui să fie foarte rapide.
tipurile de coloane sunt numeroare: întreg cu/fără semn pe 1,2,3,4 și 8 bytes, long, float, double, char, varchar, text, blob, date, time,timestamp, year, datetime, set și enum.
înregistrări de mărime fixă și variabilă.
toate coloanele au valori inițiale.
toate funcțiile și operatorii pot apărea intr-o instrucțiune SELECT …WHERE.
suport pentru clauzele GROUP BY și ORDER BY.
are diverse funcții ca și : COUNT(), COUNT( DISTINCT ..),AVG(), STD(), SUM(), MAX(),MIN() etc.
suportă LEFT OUTER JOIN și RIGHT OUTER JOIN din ANSI SQL și ODBC.
sunt permise alias-uri pentru tabele și coloane ca și în standardul SQL92.
funcțiile DELETE, INSERT, UPDATE, REPLACE returnează numărul de înregistrări ce au fost modificate sau numărul de înregistrări ce se potrivesc în funcție de setările făcute.
comanda SHOW poate fi folosită pentru a se obține informații despre bazele de date, tabele și indecși.
se pot face interogări pe tabele din baze de date diferite.
accesul la bazele de date MYSQL se face prin autentificarea cu utilizator și parolă. Parolele sunt criptate și în plus datele transmise între server și client sunt criptate.
suport pentru tranzacții.
MYSQL se descurcă cu baze de date mari. Este utilizat pentru baze de date ce conțin 50.000.000 de înregistrări sau 60.000 de tabele cu aproximatix 5.000.000.000 de înregistrări.Tabelele MYSQL pot fi pâna la 8 TB, dar acest lucru depinde cât demare poate fi un fișier într-un anumit sistemul de opare. Astfel în LINUX INTEL 32-bit tabelel pot fi de 2GB sau 4GB în funcție de versiunea de LINUX, în LINUX ALPHA 8 TB, SOLARIS 2.5.1 2GB sau 4GB (dacă se folosește un patch), SOLARIS 2.6 4GB, SOLARIS 2.7 INTEL 4GB și SOLARIS 2.7 UltraSPARC 512GB.
sunt permiși până la 32 de indecși pe tabelă și fiecare index poate conține pâna la 16 coloane sau părți de coloane.
clienții se pot conecta la server folosind socket-uri TCP/IP sau socket-uri UNIX sau NAMED PIPES (NT).
oferă suport pentru redirectarea intrării și ieșirii standard.
clientul MYSQL oferă parametrul –e prin care se permite executarea unei comenzi MYSQL din linie de comandă facilitate care poate fi folosită în fișiere de comenzi.
1.2 CONECTARE LA MYSQL
Să presupunem că am instalat un server MYSQL pe o anumit server LINUX și pe altul avem un client MYSQL. Intâi trebuie să facem setările la nivel de server. Prima dată vom stabili parola de administrator pe baza de date.Utilizatorul suprem este root-ul.. Prin comanda: mysqladmin password test/bd se stabilește că parola utilizatorului root este „test/bd”. Acum se pune problema conectării la serverul MYSQL.Urmă toarea secvență va arăta cum se vor putea crea baze de date și utilizatori:
shell>mysql –u root –p
Enter password:****
mysql>use mysql
mysql> CREATE database ovidiu;
mysql> GRANT ALL PRIVILEGES on ovidiu.* to ’ovidiu’@’localhost’ identified by
’parola’;
mysql>flush privileges;
Prin comanda use se schimbă baza de date, iar apoi se crează o bază de date la care se dă accesutilizatorului ovidiu care se va autentifica cu parolă Un nou utilizator se face prin inserarea in tabela user din baza de date mysql. Sintaxa acestei comenzi va fi prezentată in Prin flush privileges i se transmite serverului că s-au fă cut modificări și abia după această comandă modifică rile sunt permanente.
Începând cu versiunea 3.22 MYSQL își poate încarc opțiunile de pornire atât pentruserver cât și pentru client din fișierul /etc/my.cnf. Există un fișier echivalent și pentru utilizator de rând prin care acesta iși poate seta opțiunile pentru conectare. Acest fișier este păstrat în directorul utilizatorului și este denumit .my.cnf. Pentru exemplificare se dă un exemplu de fișier
.my.cnf:
[client]
host=localhost
user=ovidiu
password=parola_mea
Dacă în directorul propriu există fișierul .my.cnf informațiile de autorizare se citesc direct din
acest fișier și astfel pentru conectare se poate da doar comanda mysql bazaădate. Acest fișier
poate fi foarte util în aplicații ce utilizează bazele de date MYSQL.
1.3 Securitate si privilegii mysql
Când se discută despre securitate în general se vorbește de securitate la nivel de server nu de securitate la nivel de server MYSQL sau APACHE pentru că în primul rând trebuie securizat serverul împotriva diverselor atacuri. Cea mai folosită metodă în acest sens este folosirea firewall-ului care este cea mai bună metodă de securizare. Prin fireewall se asigură că la serverul MYSQL se pot realiza conexiuni numai de la stațiile de la care se dorește și de la restul nu se vor permite conexiuni pe portul TCP 3306, port ce este folosit în general de serverul MYSQL. Pentru crearea unui firewall la ora actuală se recomandă folosirea comenzii iptables care este mult mai recentă și oferă o serie de avantaje.
MYSQL folosește un mecanism de securitate bazat pe ACL-uri (Access Control List) pentru a permite ca un anumit utilizator de pe o anumită stație să aibă permisiunea de a se conecta la serverul MYSQL folosind bineînțeles parole criptate. Nu trebuie să se uite de fișierul hosts.allow unde trebuie să se specifice ce stații au dreptul să se conecteze la MYSQL.La nivel de MYSQL trebuie asigurate unele lucruri pentru a fi siguri că nu se vor pierde date stocate în bazele de date. Pentru siguranța datelor ar trebui luate în considerare următoarele:
la tabela user din baza de date mysql nu ar trebui să aibă nimeni acces în afară de utilizatorul root din mysql deoarece aici sunt ținute parolele criptate ale tuturor utilizatorilor serverului de date și având aceste date și posibilitate de acces la serverul MYSQL se poate loga dMYSQL trebuie asigurate unele lucruri pentru a fi siguri că nu se vor pierde date stocate în bazele de date. Pentru siguranța datelor ar trebui luate în considerare următoarele:
la tabela user din baza de date mysql nu ar trebui să aibă nimeni acces în afară de utilizatorul root din mysql deoarece aici sunt ținute parolele criptate ale tuturor utilizatorilor serverului de date și având aceste date și posibilitate de acces la serverul MYSQL se poate loga destul de ușor folosind un cont din cele existente.
trebuie învățat sistemul de privilegii MYSQL, sistem ce va fi prezentat în partea a doua a cestuio subcapitol.
nu trebuie date unui utilizator mai multe privilegii de câte are acesta nevoie
dacă prin comanda mysql –u root mysql se realizează conexiunea la serverul MYSQL atunci nu este setată parola și orice utilizator de pe acea stație poate avea acces total la bazele de date MYSQL. Pentru a evita acest inconvenient primul lucru care s-a prezentat în acest capitol a fost o modalitate de a seta o nouă parolă pentru accesul la resursele vitale MYSQL. Dacă prin mysql –u root –h DNSNAME mysql se realizează o conexiune la MYSQL, atunci va trebui modificată parola și pentru acest utilizator pentru că și acesta are drepturi absolute pe bazele de date MYSQL. Prin DNSNAME se precizează numele serverului de exemplu ucv.ro. De exemplu prin comanda : select Host, User, Password from user vom obține utilizatorii ce se pot conecta la serverul MYSQL.Dacă nu s-au făcut modificări asupra bazelor de date atunci rezultatul interogării va fi:
+––––––––––+––-+–––––-+
| Host | User | Password |
+––––––––––+––-+–––––-+
| localhost | root | |
| ucv.ro | root | |
| localhost | | |
| ucv.ro | | |
+––––––––––+––-+–––––-+
se pot șterge fără probleme cele două înregistrări ce verifică Host =’ucv.ro și se recomandă setarea unor parole pentru celelate conturi.în tabele de date MYSQL nu se recomandă a se păstra parole sub formă de text deoarece dacă cineva reușește să spargă serverul poate apoi folosi acele parole. Se recomandă folosirea unor metote de criptare ca și MD5().Parolele nu tebuie să fie alese după dicționare și ar trebui să fie destul de lungi.
se recomandă folosirea unui firewall riguros pentru a proteja serverul de atacuri. Prin firewall se poate permite accesul numai de la anumite stații care sunt considerate de „încredere”.
nu este recomandată transmiterea datelor necriptate prin INTERNET, deoarece oricine are timp și abilitate poate captura acest trafic și poate folosi datele în scopuri proprii. Se recomandă folosirea protocoalelor SSH și SSL. Pentru a vedea dacă datele transmise sunt sau nu criptate se poate folosi următoarea comandă: shell> tcpdump -l -i eth0 -w – src or dst port 3306 | strings. Dacă nu se văd date aceasta nu înseamnă intotdeauna că ele sunt criptate. Se recomandă consultarea unui specialist în securitate dacă este necesară securitate maximă. Se recomandă ca serverul MYSQL să nu fie pornit ca si root deoarece orice utilizator MYSQL cu privilegiul FILE PRIVILEGES poate să creeze fișiere ca și root. Dacă de exemplu un server MYSQL este compromis restul sitemului poate rămâne neatins pentru că serverul MYSQL rulează cu ID-ul utilizatorului UNIX mysql care nu are drepturi speciale asupra sitemului UNIX în general La nivel de server MYSQL există un sistem de privilegii. Crearea unui utilizator este echivalentă cu inserarea unei înregistrări în tabela user din baza de date mysql. De obicei se stabilește numai numele, stația și parola pentru noul utilizator, restul câmpurilor lasându-se cu valorile implicite. Pentru identificarea unui utilizator aceste trei câmpuri sunt importante. După logarea la serverul MYSQl utilizatorului i se dau privilegiile de care beneficiază. Acestea sunt specificate tot în același tabel și ele pot fi: Select_priv, Insert_priv, Update_priv, Delete_priv, Index_priv, Alter_priv, Create_priv, Drop_priv, Grant_priv, References_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv. Aceste privilegii pot fi acordate sau retrase unui utilizator. Numele privilegiilor sunt alese sugestiv încât nu se va face o expunere amănunțită și se va prezenta foarte pe scurt când este nevoie de privilegiul File_priv. Si presupunem că se dorește salvarea într-un fișier a rezultatelor unei nterogări; acest lucru se poate realiza prin comanda SELECT … INTO OUTFILE …, dar pentru acestă comandă este necesar privilegiul FILE. Tot același privilegiu este necesar și pentru incărcarea datelor într-o bază de date ce sepoate realiza prin LOAD DATA INFILE …. Datele salvate într-un fișier pot fi citite de toată lumea și acest lucru poate fi un dezavantaj în anumite cazuri. In tabela db din baza de date mysql sunt precizate drepturile utilizatorilor asupra unora din bazele de date MYSQL. Un utilizator este identificat prin ser și Host, iar baza de date prin db și privilegiile pot fi următoarele: Select_priv, Insert_priv, Update_priv, Delete_priv, Index_priv, Alter_priv, Create_priv, Drop_priv, Grant_priv MYSQL-ul mai oferă o gestiune și asupra stațiilor cu un sistem de privilegii supra bazelor de date.Aceste informașii sunt ținute în tabelul host și un client este identificat prin Host și Db, iar privilegiile posibile sunt: Select_priv, Insert_priv, Update_priv, Delete_priv, Index_priv, Alter_priv, Create_priv, Drop_priv, Grant_priv. MYSQL-ul mai pune la dispozitie două tabele tables_priv _i columns_priv pentrugestinea tabelelor și coloanelor la care utilizatorul are acces.
1.4 Comenzi de manipulare a datelor
In acest capitol se vor prezenta foarte pe scurt principalele comenzi de gestiune a
datelor: INSERT, UPDATE, SELECT, DELETE, CREATE, DROP, ALTER, USE și
DESCRIBE.
Tipurile coloanelor din tabele MYSQL pot fi: TINYINT, BIT, BOOL, SMALLINT, MEDIUMINT, INT, INTEGER, BIGINT, FLOAT, DOUBLE, DOUBLE PRECIZION, REAL, DECIMAL, DEC, NUMERIC, DATE, DATETIME, TIMESTAMP, TIME, YEAR, CHAR,VARCHAR, TINYBLOB, TINYTEXT, BLOB, TEXT, MEDIUMBLOB, EDIUMTEXT, LONGBLOB, LONGTEXT, ENUM, SET.
In continuare se va prezenta sintaxa fiecărei comenzi din cele prezentate anterior și o scurt descriere a lor.
SELECT
Sintaxa:
SELECT [STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] [HIGH_PRIORITY]
[DISTINCT | DISTINCTROW | ALL]
expresie select,…
[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
[FROM tabele_referin__
[WHERE condi_ie_where]
[GROUP BY {unsigned_integer | col_name | formula} [ASC | DESC], …]
[HAVING condi_ie_having]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,…]
[LIMIT [m,] n]
[PROCEDURE procedur_]
[FOR UPDATE | LOCK IN SHARE MODE]]
Instrucțiunea SELECT este folosită pentru extragerea unor înregistrări ce îndeplinesc anumite condiții din diverse tabele. In expresie_select se pot folosi diverse funcții sau expresii. Înregistrările rezultate pot fi grupate sau/și sortate după anumite criterii sau chiar după diverse funcții și numărul lor poate fi limitat la primele n înregistrări sau la m înregistrări începând cu înregistrarea a n-a. Opțional rezultatul interogării poate fi salvat într-un fișier pe disc, fișier creat de utilizatorul mysql. Cu instrucțiunea SELECT se pot folosi și următoarele tipuri de JOIN: CROSS, INNER [OUTER], STRAIGHT_JOIN, LEFT [OUTER], NATURAL [LEFT [OUTER]], RIGHT [OUTER] și NATURAL [RIGHT [OUTER]] cu ajutorul cărora se pot combina informațiile din două tabele. Rezultatele mai multor instrucțiuni SELECT pot fi reunite folosindu-se UNION.
INSERT
Sintaxa:
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] nume_tabel_ [(nume_coloan_,…)]
VALUES (expresie,…),(…),…
sau:
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] nume_tabel_ [(nume_coloan_,…)]
SELECT …
sau:
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] nume_tabel_
SET nume_coloan_=expresie, nume_coloan_=expresie, …
Înstrucțiunea INSERT se foloesește pentru adăugarea de informații noi in tabele existente. Această intrucțiune are trei forme după cum se poate observă din sintaxa prezentată. În tabele se pot insera diverse valori pentru anumite coloane, celelate coloane urmând să fie inițializate cu valorile implicite specificate sau cu valori implicite generate de MYSQL în funcție de tipurile specificate. In prima formă a instrucțiunii INSERT se precizează valorile ce se vor adăuga, iar a doua forma arată ca se pot adăuga mai multe date din diferite tabele folosind intrucțiunea SELECT. Dacă se specifică LOW_PRIORITY inserarea se va face numai după ce nici un client nu mai citește din acea tabelă în contrast cu INSERT DELAYED. Dacă nu se specifică IGNORE, inserarea este anulată dacă există o inregistrare a cărei valori este duplicată.
UPDATE
Sintaxa:
UPDATE [LOW_PRIORITY] [IGNORE] nume_tabel
SET nume_coloan_1=expresie1 [, nume_coloan_2=expresi2, …]
[WHERE condi_ie_where]
[LIMIT n]
Cu ajutorul intrucțiunii UPDATE se actualizează înregistrări existente în tabelul specificat. Prin SET se stabilesc ce coloane se modifică și cu ce expresii, iar prin WHERE se specifică ce înregistrări se vor modifica. Dacă nu apare WHERE atunci toate înregistrările vor fi modificate. Prin LIMIT se precizează că numai primele n înregistrări vor fi reactualizate. Dacă se specifică LOW_PRIORITY modificarea datelor se face numai după ce nici un client nu mai citește din tabelui respectiv. Dacă se specifică IGNORE atunci execuția instrucțiunii UPDATE se continuă și după ce se întâlnesc erori de cheie duplicată. Inregistrările ce cauzează conflicte nu vor fi actualizate.
DELETE
Sintaxa:
DELETE [LOW_PRIORITY | QUICK] FROM nume_tabela
[WHERE conditie_where]
[ORDER BY …]
[LIMIT n]
sau:
DELETE [LOW_PRIORITY | QUICK] nume_tabela[.*] [,nume_tabela[.*] …]
FROM referinte-tabel
[WHERE conditie_where]e
sau:
DELETE [LOW_PRIORITY | QUICK]
FROM nume_tabela[.*], [nume_tabela[.*] …]
USING referinte-tabel
[WHERE conditie_where]
DELETE se folosește pentru ștergerea înregistrărilor ce verifică condiția specificată din tabelul specificat. Dacă se folosește LIMIT se vor șterge exact primele n inregistrări din tabel în funcție de ordinea alesă. Incepând cu versiunea 4.0.0 este posibilă ștergerea din mai multetabele [a doua formă DELETE]. și începând cu versiunea 4.0.2 este posibilă a treia formă DELETE. Astfel se pot șterge înregistrări numai din tabele precizate prin nume_tabela ce apar înaintea lui FROM sau USING. Altfel spus se pot șterge în același timp înregistrări din mai multe tabele, dar se pot folosi tabele suplimentare pentru căutarea înformațiilor ce se vor șterge. Dacă în instrucțiunea DELETE apare LOW_PRIORITY, atunci ștergerea se va face numai după ce nici un utilizator nu mai citește din tabelele precizate; dacă apare cuvântul QUICK atunci indecșii nu vor fi modificați cecea ce va putea mări viteza de ștergere.
TRUNCATE
Sintaxa:
TRUNCATE TABLE nume_tabela
Cu ajutorul acestei instrucțiuni se șterg toate informațiile dintr-o tabelă. Diferențele între TRUNCATE TABLE nume_tabelă și DELETE FROM nume_tabelă sunt:
-TRUNCATE va șterge baza de date și o recrează ceea ce este mult mai rapid decât ștergerea înregistrărilor una câte una.
-TRUNCATE nu returnează numărul înregistrărilor șterse
-Dacă o tranzacție proprie este acivă sau o tabelă este blocată se va genera o eroare.
-Dacă fișierul nume_tabelă.frm [fi_erul unde se păstreaz_ defini_ia tabelei] este valid tabela poate fi recreată chiar dacă fișierele cu datele sau indecși sunt corupte
REPLACE
Sintaxa:
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] nume_tabel [(nume_coloana,…)]
VALUES (expression,…),(…),…
sau:
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] nume_tabel [(nume_coloana,…)]
SELECT …
sau:
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] nume_tabel
SET nume_coloana=expression, nume_coloana=expression,…
Acestă instrucțiune se comportă exact ca și INSERT cu deosebirea că dacă există o înregistrare mai veche cu aceași valoare pentru o coloană ce este index unic, atunci înregistrarea mai veche este ștearsă înainte ca noua înregistrare să fie adăugată. Vechea înregistrare nu poate fi accesată prin comanda REPLACE. Când se foloșeste REPLACE mysql_affected_rows() returnează 2 dacă o înregistrare nouă va înlocui una veche deoarece înregistrarea nouă se adaugă și duplicatul celei vechi se șterge. Dacă valoare returnată este 1, atunci înregistrarea nouă nu înlocuiește una veche.
LOAD DATA INFILE
Sintaxa:
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'fisier.txt'
[REPLACE | IGNORE]
INTO TABLE nume_tabela
[FIELDS
[TERMINATED BY '\t']
[[OPTIONALLY] ENCLOSED BY '']
[ESCAPED BY '\\' ]
]
[LINES TERMINATED BY '\n']
[IGNORE n LINES]
[(nume_coloana,…)]
Cu ajutorul acestei comenzi se pot încărca date din fișiere text într-o tabelă cu viteză mare. Se pot încarca date numai pentru anumite coloane dacă acest lucru este specificat, iar restul coloanelor vor fi setate cu valorile implicite din definiția tabelului sau cele stabilite de MYSQL. Dacă se specifică LOCAL fișierul este căutat pe stația clientului și în caz contrar pe server. Evident că mai rapidă este încărcarea datelor dintr-un fișier de pe server. Pentru a putea încărca date este nevoie de privilegiul FILE_PRIV. Datele se mai pot încărca și folosind utilitarul mysqlimport care va trimite către serverul MYSQL comanda LOAD DATA LOCAL INFILE. Dacă apare cuvântul CONCURENT cu tabele MyISAM atunci toate procesele pot primi date de la acea tabelă chiar și când LOAD DATA se execută. Dacă se specifică REPLACE, atunci când se întâlnește o înregistrare ce are aceași valoare pe o cheie unică noua înregistrare o înlocuiește pe cea veche. Dacă se specifică IGNORE, atunci cea veche rămâne în baza de date. In schimb dacă nu se specifică nici una dintre opțiuni și se ajunge la o situație de genul celui prezentate mai sus, atunci MYSQL generează o eroare și restul fișierului este ignorat. Dacă apare IGNORE n LINES, atunci primele n linii din fișier sunt ignorate.
CREATE DATABASE
Sintaxa:
CREATE DATABASE [IF NOT EXISTS] nume_bd
Cu ajutorul acestei comenzi sunt create bazede date MYSQL. Bazele de date MYSQL sunt implementate ca și directoare ce conțin fișiere care corespund tabelelor bazei de date. Așadar, crearea unei baze de date este echivalentă cu crearea unui director în locul în directorul unde sunt ținute bazele de date. Crearea unei baze de date se poate face si cu ajutorul utilitarului mysqladmin. Dacă baza de date există și nu se specifică IF NOT EXIST , atunci se va genera o eroare.
DROP DATABASE
Sintaxa:
DROP DATABASE [IF EXISTS] nume_bd
DROP DATABSE șterge toate tabelele din baza de date specificată și apoi strege baza de date. La executarea acestei comenzi pe bazele de date legate simbolic sunt șterse și legăturile simboloce și bazele de date, deci se recomandă să se utilizeze forte atent această comandă. Comanda returnează numărul de fișiere ce au fost șterse din directorul bazei de date. De obicei acest număr este mai mare de trei ori decât numărul tabelelor din baza de date.pentru că în mod normal la fiecare tabelă corespund fișiere ‚ ’.MYD’, ’.MYT’ și ‚.frm’. Odată cu ștergerea bazei de date sunt șterse fișiere din directorul bazei de date ce au extensia: BAK, DAT, HSH, ISD, ISM, MRG, MYD, MYI, db, frm. Se poate utiliza IF EXISTS pentru a evita erorile generate la ștergerea unei baze ce nu există.
CREATE TABLE
Sintaxa:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] nume_tabel [(defini_ie_coloan_,…)]
[optiuni_tabel] [bloc_select]
defini_ie_coloan_:
nume_coloan_ tip_coloan_ [NOT NULL | NULL] [DEFAULT valoare_implicit_]
[AUTO_INCREMENT]
[PRIMARY KEY] [definire_referin_e] | PRIMARY KEY (index_col_nume,…) |KEY
[index_nume] (index_col_nume,…) | INDEX [index_nume] (index_col_nume,…) | UNIQUE
[INDEX] [index_nume] (index_col_nume,…) | FULLTEXT [INDEX] [index_nume]
(index_col_nume,…) | [CONSTRAINT symbol] FOREIGN KEY [index_nume]
(index_col_nume,…) [definire_referin_e] | CHECK (expresie)
tip_coloan_:
TINYINT[(lungime)] [UNSIGNED] [ZEROFILL] | SMALLINT[(lungime)]
[UNSIGNED] [ZEROFILL] | MEDIUMINT[(lungime)] [UNSIGNED] [ZEROFILL] |
INT[(lungime)] [UNSIGNED] [ZEROFILL] | INTEGER[(lungime)] [UNSIGNED]
[ZEROFILL] | BIGINT[(lungime)] [UNSIGNED] [ZEROFILL] |
REAL[(lungime,nr_zecimale)] [UNSIGNED] [ZEROFILL] | DOUBLE[(lungime,nr_zecimale)]
[UNSIGNED] [ZEROFILL] | FLOAT[(lungime,nr_zecimale)] [UNSIGNED] [ZEROFILL] |DECIMAL((lungime,nr_zecimale) [UNSIGNED] [ZEROFILL] |
NUMERIC(lungime,nr_zecimale) [UNSIGNED] [ZEROFILL] | CHAR(lungime) [BINARY] |
VARCHAR(lungime) [BINARY] | DATE | TIME | TIMESTAMP | DATETIME | TINYBLOB |
BLOB | MEDIUMBLOB | LONGBLOB | TINYTEXT | TEXT | MEDIUMTEXT | LONGTEXT |
ENUM(valoare1,valoare2,valoare3,…) | SET(valoare1,valoare2,valoare3,…)
index_col_nume:
col_name [(lungime)]
definire_referin_e:
REFERENCES tbl_nume [(index_col_nume,…)]
[MATCH FULL | MATCH PARTIAL]
[ON DELETE op_iuni_referin__]
[ON UPDATE op_iuni_referin__]
op_iuni_referin__:
RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
optiuni_tabel:
TYPE = {BDB | HEAP | ISAM | InnoDB | MERGE | MRG_MYISAM | MYISAM } |
AUTO_INCREMENT = # | AVG_ROW_LENGTH = # | CHECKSUM = {0 | 1} | COMMENT =
"string" | MAX_ROWS = # | MIN_ROWS = # | PACK_KEYS = {0 | 1 | DEFAULT} |
PASSWORD = "parol_" | DELAY_KEY_WRITE = {0 | 1} | ROW_FORMAT= { default |
dynamic | fixed | compressed } | RAID_TYPE= {1 | STRIPED | RAID0 } RAID_CHUNKS=#
RAID_CHUNKSIZE=# | UNION = (tabel_nume,[tabel_nume…]) | INSERT_METHOD= {NO |
FIRST | LAST } | DATA DIRECTORY="cale absoluta catre director" | INDEX
DIRECTORY="cale absoluta catre director"
bloc_select:
[IGNORE | REPLACE] SELECT … (instruc_iuni corecte ce se pot folosi în SELECT)
Prin CREATE TABLE se realizează definirea unei tabel în baza de date curentă, iar dacă se specifică baza_date.nume_tabel atunci se crează tabela în baza de date specificată. Dacă se precizează IF NOT EXISTS intr-o comandă CREATE TABLE și tabelul există, atunci nu se va genera o eroare și vechea definiție a tabelul rămâne, altfel se va genera o eroare pentru că tabelul există deja. Dacă se utilizează TEMPORARY atunci tabelul creat va fi activ până se șterge sau până când conexiunea la serverul MYSQL se termină. Numele tabelului temporar este pe conexiune și la conexiuni diferite pot exista tabele temporare cu același nume fără a fi generate conflicte. Aceste tabele sunt de fapt tabele ascunse. In cazul tabelelor MyISAM se generează trei fișiere: frm [fișier cu definirea tabelului], MYD [fișier ce conține datele], MYI [fișier ce conține indecșii tabelului]. Când se adaugă date intr-un tabel se poate opta pentru introducerea de valori numai pentru o parte din coloane și celelalte coloane din înregistrare se vor seta cu valorile implicite precizate în definiția tabelului, iar dacă aceste nu există atunci ele sunt generate automat de MYSQL în funcție de tipul de dată ales pentru coloana respectivă. Dacă nu se specifică NULL sau NOT NULL atunci coloana se comportă ca și când s-ar fi specificat NULL. Valoare NULL este suportată de toate tipurile de date din specificația coloanei, dar în cazul tipului TIMESTAMP nu se poate stoca textul NULL și coloana respectivă în cazul setării cu valoare NULL se setează automat cu data și timpul curent. Pentru o coloană de tipul INTREG se poate specifica AUTO_INCREMENT. Pentru un tabel poate există o singură coloana cu acest atribut și coloana trebuie să fie cheie. Dacă într-o astfel de coloană se încearcă inserarea valorii NULL sau 0, atunci pentru coloana respectivă se generează automat următoarea valoare disponibilă relativă la valoarea maximă existentă [valoare generata = valoare maximă existentă + 1]. Pentru tabele de tipul MyISAM sau DBD se poate specifica un AUTO_INCREMENT pentru o coloană secundară dintr-o cheie cheie pe mai multe coloane. Pentru a înțelege mai bine acest lucru se poate analiza exemplul:
CREATE TABLE animals (grp ENUM('fish','mammal','bird') NOT NULL,id
MEDIUMINT NOT NULL AUTO_INCREMENT PRIMARY KEY (grp,id));
INSERT INTO animals (grp,name) VALUES ("mammal","dog"), ("mammal","cat"),
("bird","penguin"), ("fish","lax"), ("mammal","whale");
SELECT * FROM animals ORDER BY grp,id;
va returna:
+––––-+–+––––+
| grp |id | name |
+––––-+–+––––+
| peste |1 | morun |
| mamifer |1 | caine |
| mamifer |2 | pisica |
| mamifer |3 | cal |
| pasare |1 | pinguin |
+––––-+–+––––+
La crearea unui tabel se poate specifica numărul minim sau maxim de înregistrări ce se planifică a fi stocate în tabelul creat. Folosind opțiunea RAID se împarte fișierul de date în fișiere mai mici; optiunea este utilă pe sisteme ce nu suportă fișiere mari [2Gb/4Gb]. Opțiunile FOREIGN KEY, CHECK, REFERENCES sunt folosite doar pentru compatibilitate codului cu alte servere SQL și să se poată rula aplicații ce crează tabele cu referințe. Ele nu fac absolut nimic.
ALTER TABLE
Sintaxa:
ALTER [IGNORE] TABLE tbl_nume alter_spec [, alter_spec …]
alter_specification:
ADD [COLUMN] create_definition [FIRST | AFTER column_nume ]
sau ADD [COLUMN] (create_definition, create_definition,…)
sau ADD INDEX [index_nume] (index_col_nume,…)
sau ADD PRIMARY KEY (index_col_nume,…)
sau ADD UNIQUE [index_nume] (index_col_nume,…)
sau ADD FULLTEXT [index_nume] (index_col_nume,…)
sau ADD [CONSTRAINT symbol] FOREIGN KEY index_nume (index_col_nume,…)
[reference_definition]
sau ALTER [COLUMN] col_nume {SET DEFAULT literal | DROP DEFAULT}
sau CHANGE [COLUMN] old_col_nume create_definition
[FIRST | AFTER column_nume]
sau MODIFY [COLUMN] create_definition [FIRST | AFTER column_nume]
sau DROP [COLUMN] col_nume
sau DROP PRIMARY KEY
sau DROP INDEX index_nume
sau DISABLE KEYS
sau ENABLE KEYS
sau RENAME [TO] new_tbl_nume
sau ORDER BY col
sau op_iuni_tabel
Folosinda comanda ALTER TABLE se poate modifica structura unui tabel prin adăugarea sau ștergerea de coloane, indecși, schimbarea tipurilor unor coloane, redenumirea coloanelor sau chiar a tabelei.Este posibil ca modificările făcute folosind acestă comandă să fie ignorate de MYSQL. Acest lucru se întâmplă de exemplu dacă se încercă modificarea tipului unei coloane din VARCHAR în CHAR; MYSQL va folosi tipul VARCHAR pentru coloana respectivă. ALTER TABLE folosește o copie temporară a tabelului original și modificările sunt făcute asupra copiei și abia apoi se șterge tabelul original și în locul său se folosește copia. In acest fel operațiune nu va esua! In timpul execuției operației tabelul original poate fi interogat de ceilalți utilizatori. Pentru execuția acestei comezi sunt necesare privilegiile: ALTER, INSERT, CREATE. Dacă se precizează IGNORE și sunt mai multe înregistrări ce au aceeași valoare pentru o coloană ce este cheie unică, atunci doar prima înregistrare este păstrată și restul șterse. Dacă am avea acceași situație și nu s-ar specifica IGNORE, atunci se întrerupe operațiunea și se păstrează tabelul original. Intr-o comandă ALTER TABLE se pot face mai multe modificări prin utilizarea mai multor clauze ADD, ALTER, DROP și CHANGE.
RENAME TABLE
Sintaxa:
RENAME TABLE tbl_nume TO new_tbl_nume[, tbl_nume2 TO new_tbl_nume2,…]
Redenumirea este făcută atutomat, ceea ce înseamnă că alt thread nu va putea să acceseze nici un tabel în timpul redenumirii. Redenumirea tabelelor se face de la stânga la dreapta. Când un utilizator execută RENAME nu poate avea tabele blocate sau tranzacții începute și pentru a executa acestă comandă are nevoie de privilegiile DROP și ALTER pe tabelul original și de CREATE și INSERT pe noul tabel. Dacă în timpul redenumirii mai multor tabele se întâlnește o eroare, atunci se va face o redenumire inversă pentru toate tabelel redenumite și se va ajunge la situația dinaintea comenzii RENAME. Se poate efectua o redenumire de tabel dintr-o bază de date în alta dacă cele două baze de date sunt pe același disc.
DROP TABLE
Sintaxa:
DROP TABLE [IF EXISTS] tbl_name [, tbl_name,…] [RESTRICT | CASCADE]
DROP TABLE șterge unul sau mai multe tabele și bineînțeles datele și definițiile acelor tabele sunt eliminate. Se recomandă utilizarea cu atenție a acestei comenzi. Se poate folosi IF EXISTS pentru a elimina erorile ce pot apărea la ștergerea unor tabele ce nu există. RESTRICT și CASCADE sunt folosite pentru portabilitate și momentan ele nu sunt folosite la nimic. DROP TABLE va comite toate tranzacțiile active.
CREATE INDEX
Sintaxa:
CREATE [UNIQUE|FULLTEXT] INDEX index_nume ON tbl_nume
(col_nume[(lungime)],… )
CREATE INDEX este o legătură simbolică către ATER TABLE pentru creare de indecși. In mod normal indecșii se crează în același când tabelul este creat cu comanda oipot crea indecși pe mai multe coloane prin concatenarea coloanelor respective. Pentru coloane de tipul CHAR, VARCHAR, TEXT sau BLOB se pot crea indecși doar cu primele lungime caractere din coloanele respective. Prin acest procedeu se reduce mărimea unui index. Dacă apare opțiunea FULLTEXT, atunci se pot crea indecși doar pe coloane de tipul VARCHAR sau TEXT și tabelele în care se crează indecși trebuie să fie de tipul MyISAM.
DROP INDEX
Sintaxa:
DROP INDEX index_nume ON tbl_nume
DROP INDEX șterge indexul cu numele index_nume din tabelul tbl_nume. Acestă comandă este mapată la o comandă ALTER TABLE care șterge indexul specificat.
USE
Sintaxa:
USE db_nume
Prin acestă comandă i se transmite MYSQL-ului să folosească baza db_nume ca și bază curentă pentru toate instrucțiunile ce se vor executa. Acestă bază rămâne baza curentă până la sfârșitul sesiunii sau până la următoare invocare a comenzii USE.
DESCRIBE
Sintaxa:
{DESCRIBE | DESC} tbl_nume {col_nume | wild}
DESCRIBE sau DESC este o legătură simbolică pentru SHOW COLUMNS FROM și returnează informații despre coloanele tabelului specificate. Se poate specifica o singură coloană prin col_nume. Coloanele despre care se doresc informații se pot specifica ca un string ce conține caracterele speciale ’%’ și ’_’. ’%’ însemnă orice și oricât de lung chiar și de lungime 0, iar ’_’ semnifică un caracter oricare ar fi el.
SHOW
Sintaxa:
SHOW DATABASES [LIKE wild]
sau
SHOW [OPEN] TABLES [FROM db_name] [LIKE wild]
sau
SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE wild]
sau
SHOW INDEX FROM tbl_name [FROM db_name]
sau
SHOW TABLE STATUS [FROM db_name] [LIKE wild]
sau
SHOW STATUS [LIKE wild]
sau
SHOW VARIABLES [LIKE wild]
sau
SHOW LOGS
sau
SHOW [FULL] PROCESSLIST
sau
SHOW GRANTS FOR user
sau
SHOW CREATE TABLE table_name
sau
SHOW MASTER STATUS
sau
SHOW MASTER LOGS
sau
SHOW SLAVE STATUS
1.5 Funcții API
Diferite limbaje de programare suport pentru conectarea și gestiunea bazelor de date MYSQL. Dintre aceste limbaje fac parte: PHP, C/C++, VISUAL C++, DELPHI, PERL, JAVA, PYTON, TCL.
În acest capitol se vor enumera funcțiile API oferite de PHP pentru MYSQL. În PHP sunt puse la dispoziție câteva variabile de configurare: mysql.allow_persistent, mysql.max_persistent, mysql.max_links, mysql.default_port, mysql.default_socket, mysql.default_host, mysql.default_user, mysql.default_password.
Funcțiile API din PHP pentru MYSQL sunt: mysql_affected_rows, mysql_change_user, mysql_character_set_name, mysql_close, mysql_connect, mysql_create_db, mysql_data_seek, mysql_db_name, mysql_db_query, mysql_drop_db, mysql_errno, mysql_error, mysql_escape_string, mysql_fetch_array, mysql_fetch_assoc, mysql_fetch_field, mysql_fetch_lengths, mysql_fetch_object, mysql_fetch_row, mysql_field_flags, mysql_field_len, mysql_field_name, mysql_field_seek, mysql_field_table, mysql_field_type, mysql_free_result, mysql_get_client_info, mysql_get_host_info, mysql_get_proto_info, mysql_get_server_info, mysql_info, mysql_insert_id, mysql_list_dbs, mysql_list_fields, mysql_list_processes, mysql_list_tables, mysql_num_fields, mysql_num_rows, mysql_pconnect, mysql_ping, mysql_query, mysql_real_escape_string, mysql_result, mysql_select_db, mysql_stat, mysql_tablename, mysql_thread_id, mysql_unbuffered_query.
3.PHP: Hypertext Prepocessor
PHP, cunoscut în versiunile mai vechi și sub numele de PHP/FI (Personal Homepage/Form Interpreter), inițial a fost gândit a fi o simplă aplicație CGI pentru interpretarea formularelor definte prin HTML și procesate de un program scris într-un limbaj Perl, script shell, executat pe server. În cazul interfeței CGI era necesară permisiunea de a rula programe pe server, ceea ce ducea la lacune în securitate și în plus la disocierea de documentul HTML a programului care procesa datele.
PHP (în versiunea curentă PHP 4.0) reprezintă un pachet puternic care oferă un limbaj de programare accesibil din cadrul fișierelor HTML, limbaj asemănător cu Perl sau C, plus suport pentru manipularea bazelor de date într-un dialect SQL (dBase, Informix, MySQL, mSQL, Oracle, PostgreSQL, Solid, Sybase, ODBC etc.) și acces la sisteme hipermedia precum Hyperwave. De asemeni, PHP suportă incărcarea fișierelor de pe calculatorul client: upload (standard propus de E. Nebel și L. Masinter de la Xerox, descris în RFC 1867) și oferă suport pentru cookies (mecanism de stocare a datelor în navigatorul client pentru identificarea utilizatorilor, propus de Netscape).
Această aplicație este disponibilă gratuit pe Internet, pentru medii Unix și mai nou pentru medii Windows (inclusiv sursele), integrându-se în popularul sever Apache.
Istoria PHP-ului începe la sfârșitul anului 1994, când Rasmus Lerdorf dezvoltă prima versiune, ca proiect personal. PHP-ul este făcut public în debutul anului 1995 sub denumirea de Personal Home Page Tools, fiind considerat un analizor simplist care interpreta câteva macrouri ce puteau fi incluse în cadrul documentelor HTML, permițând contorizarea accesului la paginile Web sau accesarea unei carți de oaspeți (guestbook). Analizorul a fost rescris la mijlocul aceluiași an și denumit PHP/FI 2.0, unde FI era o alta aplicație scrisă de Rasmus Lenford, un interpreter de formulare HTML. A fost adăugat și suportul pentru bazele de date mSQL și astfel PHP/FI a început să aibă succes, fiind disponibil gratuit pe Web. Se estimează că la sfârșitul lui 1996 cel puțin 15 mii de site-uri Web utilizau PHP/FI, iar în anul 1997 numărul acestora era de 50 de mii.
Programatorii Zeev Suraski și Andi Gutmans rescriu analizorul PHP și noua aplicație formează nucleul versiunii PHP 3.0 care include o parte din vechile surse PHP/FI 2.0. Relativ recent, la începutul anului 2000, a fost facută publică versiunea PHP 4.0, utilizând puternicul motor de scriptare Zend și oferind suport nu numai pentru servrul Apache ci și pentru alte servere Web. De asemeni, PHP 4.0 oferă posibilitatea accesării documentelor XML via DOM.
Se estimează că numărul site-urilor care folosesc în prezent PHP este de peste un milion. Deja, pe Web, exista o multitudine de aplicații și utilitare concepute în PHP, care se regăsesc grupate și în așa-numitul PEAR (PHP Extension and Add-on Repository).
Ce este PHP?
PHP este un limbaj de script care funcționează alături de un server Web.
Exemplu:
<html>
<head>
<title>Exemple</title>
</head>
<body>
<?php
echo "Salut, eu sunt un script PHP!";
?>
</body>
</html>
Este de notat diferența cu alte limbaje script CGI scrise în limbaje precum Perl sau C: în loc de a scrie un program cu o multitudine de linii de comanda afișate în final într-o pagină HTML, veți scrie o pagină HTML cu codul inclus pentru a realiza o acțiune precisă (în cazul nostru se va afișa un text).
Codul PHP este inclus între tag-urile speciale de început și de sfârșit care permit utilizatorului să treacă din "modul HTML" în "modul PHP".
Față de alte limbaje script, precum Javascript, la PHP codul se execută pe server. Dacă pe serverul Web se află un script similar, clientul nu va primi decât rezultatul execuției scriptului, fără a avea nici o posibilitate de acces la codul care a produs rezultatul. Vă puteți configura serverul de Web să prelucreze (analizeze) toate fișierele HTML ca fișiere PHP. Astfel nu există nici un mijloc de a distinge paginile care sunt produse dinamic de paginile statice.
Ce poate face PHP?
Limbajul PHP posedă aceleași funcții ca alte limbaje permițând să se scrie scripturi CGI, să colecteze date și să genereze dinamic pagini web sau să trimită și să primească cookies.
Marea calitate și cel mai mare avantaj al limbajului PHP este suportul cu un număr mare de baze de date. A realiza o pagină web dinamic cu o baza de date este extrem de simplu. Următoarele baze de date sunt suportate de către PHP:
Limbajul PHP are deasemenea suport pentru diverse servicii server utilizând protocoale precum IMAP, SNMP, NNTP, POP3 și HTTP.
3.1 Structura limbajului
Sintaxa fundamentală.
Trecerea de la HMTL la PHP
Există patru moduri pentru a trece de la HMTL la PHP.
Exemplu:
1. <? echo ( "Cea mai simpla cale de introducere…\n"); ?>
2. <?php echo ( "Daca vreti sa afisati documente XML sau XHTML faceti ca aici.\n"); ?>
3. <script language="php">
echo ( "Anumite editoare nu accepta tag-uri necunoscute (de exemplu FrontPage)");
</script>
4. <% echo ( "Puteti utiliza taguri in stil Asp."); %>
A doua metodă este cea mai utilizată, pentru că permite o implementare ușoara a PHP-ului cu generația urmatoare XHTML.
Separatori de instrucțiuni
Instrucțiunile sunt separate, ca în C sau ca în Perl, prin punct și virgulă la sfârșitul unei instrucțiuni. Semnele de sfârșit, '?>', implică sfârșitul instrucțiunii, deci implicit punct și vigulă.
Exemplu:
<?php
echo "Acesta este un test";
?>
<?php echo "Acesta este un alt test" ?>
Comentarii
Comentariile pot fi făcute în stilul celor din limbajele C, C++ și shell-urile UNIX (bash de exemplu).
echo "Acesta este un test"; // Acesta este un comentariu pe o linie in stil C++
/* Acesta este un comentariu pe mai multe linii;
inca o linie de comentariu */
echo "Acesta este un alt test";
echo "Ultimul test"; # Un comentariu in stil Unix
Stilul de comentariu pe o linie ține până la sfârșitul liniei sau al blocului curent al codului PHP.
Exemplu:
<h1>Acesta este un <? # echo "simplu"; ?> exemplu.</h1>
<p>Linia de mai sus va afisa: "Acesta este un exemplu."</p>
3.2 Tipuri de date
Numere întregi.
Numerele întregi se pot specifica în modul următor
$a = 1234; # Numar intreg in baza 10
$a = -123; # Numar intreg negativ
$a = 0123; # Numar intreg in baza 8, octal (echivalent cu 83 in baza 10)
$a = 0x12; # Numar intreg in baza 16, hexazecimal (echivalent cu 18 in baza 10)
Numere reprezentate în virgulă mobilă.
Numerele reprezentate în virgulă mobilă (double) pot fi utilizate în oricare din sintaxele următoare
$a = 1.234;
$a = 1.2e3;
Dimensiunea numerelor în virgulă mobilă este independentă de platformă. Precizia uzuală este de 14 cifre.
Observații:
de obicei fracțiile zecimale simple, precum 0.1 sau 0.7, sunt convertite intern cu o mică pierdere de precizie; aceasta poate să ducă la rezultate mai puțin exacte. De exemplu: floor( 0,1 + 0,7*10) întoarce de obicei 7 în loc de așteptatul 8, rezultatul reprezentării interne fiind de genul 7,9999999999; este imposibil să se exprime cu exactitate fracțiile zecimale cu număr infinit de cifre; de exemplu, 1/3 în formă zecimală devine 0,33333333…; dacă aveți nevoie de o precizie mai mare în compararea valorilor în virgulă mobilă trebuie să utilizați funcțiile matematice de precizie arbitrară.
Șiruri de caractere.
Șirurile de caractere pot fi delimitate de ghilimele sau apostrofuri, în ultimul caz inhibându-se evaluarea variabilelor din interiorul șirului respectiv (exact ca la bash).
Dacă șirul de caractere este delimitat de ghilimele atunci variabilele din interiorul șirului vor fi evaluate și înlocuite prin valoarea lor. Ca și în C sau Perl, caracterul backslash (\) este utilizat pentru a proteja un carcater special.
Orice caracter se poate transforma, teoretic, în secveță escape, dar se produce un avertisment la cel mai înalt nivel. A doua metodă încadrează șirurile între apostrofuri; în acest caz singurele secvențe escape înțelese sunt '\\' și '\'. Variabilele nu vor fi expandate într-un șir încadrat între apostrofuri.
/* Exemplu mai complex cu mai multe variabile */
class joc
{
var $joc;
var $bar;
function joc()
{
$this->joc = 'Joc';
$this->bar = array( 'Bar 1', 'Bar 2', 'Bar 3');
}
}
$joc = new joc();
$name = 'MyName';
Șirurile pot fi concatenate utilizând operatorul '.', operatorul '+' fiind impropriu pentru această operație.
/* Asignarea unui sir */
$str = "Aceasta este o serie";
/* Concatenarea sirului cu un text nou */
$str = $str . " Cu mai mult text";
/* Un alt mijloc de adaugare, folosind o secventa escape newline */
$str .= " si o nous linie la sfarsit.\n";
/* Variabilele dintr-un sir inclus intre apostrofuri se pot evalua */
$num = 9;
$str = '<p>Numar: $num</p>';
/* Obtine primul caracter al sirului */
$str = 'Un test.';
$first = $str[0];
/* Obtine ultimul caracter al sirului */
$str = 'Un alt test.';
$last = $str[ strlen( $str) – 1];
Conversia șirurilor
Când un șir este evaluat ca valoare numerică, valoarea și tipul rezultat sunt decise după cum urmează:
șirul va fi evaluat ca un double dacă conține unul din caracterele '.', 'e' sau 'E'. Altfel va fi evaluat ca un întreg;
valoarea este dată de începutul șirului. Dacă șirul începe cu o dată numerică validă, aceasta va fi valoarea utilizată. Altfel valoara va fi 0. O dată numerică validă este formată din semn (opțional), una sau mai multe cifre (opțional un puct zecimal), încheiate eventual cu un exponent. Acest exponent ('e' sau 'E') este urmat de una sau mai multe cifre. Când prima expresie este un șir tipul varibilei va depinde de a doua expresie.
$aaa = 1 + "10.5"; // $aaa este double (11.5)
$aaa = 1 + "-1.3e3"; // $aaa este double (-1299)
$aaa = 1 + "bob-1.3e3"; // $aaa este integer (1)
$aaa = 1 + "bob3"; // $aaa este integer (1)
$aaa = 1 + "10 Small Pigs"; // $aaa este integer (11)
$aaa = 1 + "10 Little Piggies"; // $aaa este integer (11)
$aaa = "10.0 pigs" + 1; // $aaa este double (11)
$aaa = "10.0 pigs" + 1.0; // $aaa este double (11)
Tablouri
În PHP tablourile se comportă și ca tablouri asociative (hash tables) și ca tablouri indexate (vectori).
Tablouri unidimensionale
PHP acceptă atât tablouri scalare cât și asociative. De fapt nu există nici o diferență între cele două. În PHP tabolurile se pot crea utilizând funcțiile list() și array() sau se poate seta explicit fiecare element din tablou.
Exemplul A:
$a[0] = "abc";
$a[1] = "def";
$b["aaa"] = 13;
Se poate de asemenea crea un tablou adăugându-i valori. De exemplu, putem extinde tabloul $a ca în exemplul de mai jos:
Exemplul B:
$a[] = "hello";
// $a[2] == "hello"
$a[] = "world";
// $a[3] == "world"
Vectorii pot fi sortați utilizând funcții specializate: asort(), arsort(), ksort(), rsort(), sort(), uasort(), usort(), și uksort().
Puteți număra elementele tabloului utilizând funcția count().
Puteți parcurge un tablou utilizând funcțiile next(), prev() și each().
Tablouri multidimensionale
Tablourile multidimensionale sunt în realitate tablouri simple. Pentru fiecare dimensiune a tabloului trebuie adăugată o altă dimensiune [dim] la final.
$a[1] = $f; // Tablou unidimensional
$a["aaa"] = $f; // Tablou unidimensional
$a[1][0] = $f; // Tablou bidimensional
$a["aaa"][2] = $f; // Indicii asociativi si numerici se pot combina
$3[3]["bar"] = $f; // Indicii numerici si asociativi se pot combina
$a["aaa"][4]["bar"][0] = $f; // Tablou cu patru dimensiuni
În PHP nu este posibilă referirea tablourilor multidimensionale direct într-un șir.
Exemplul următor nu va furniza rezulatul așteptat:
$a[3]['bar'] = 'Bob';
echo "Acesta nu merge: $a[3][bar]";
Exemplul de mai sus va afișa: Acesta nu merge: array[bar]. Operatorul de concatenare poate fi utilizat pentru a corecta acest lucru:
$a[3]['bar'] = 'Bob';
echo "Acesta nu merge: " . $a[3][bar];
În PHP 4.0 problema aceasta poate fi rezolvată incluzând referința la tabloul din interiorul șirului între acolade ca în exemplul de mai jos:
$a[3]['bar'] = 'Bob';
echo "Acesta nu merge: {$a[3][bar]}";
Puteți completa o matrice în multe moduri, dar important este să ințelegeți cum puteți să utilizați funcția array() pentru tablouri asociative.
Exemplul A:
$a["culoare"] = "rosu";
$a["aroma"] = "dulce";
$a["forma"] = "rotund";
$a["nume"] = "mar";
$a[3] = 4;
Exemplul B:
$a = array(
"culoare" => "rosu",
"aroma" => "dulce",
"forma" => "rotund",
"nume" => "mar",
3 => 4
);
Pentru tablouri asociative multidimensionale putem imbrica funcția array() ca în exemplul de mai jos:
$a = array(
"mar" => array(
"culoare" => "rosu",
"aroma" => "dulce",
"forma" => "rotund"
),
"portocala" => array(
"culoare" => "potocaliu",
"aroma" => "acru-amarui",
"forma" => "rotund"
),
"banana" => array(
"culoare" => "galben",
"aroma" => "placuta",
"forma" => "bananoida"
)
);
echo $a["mar"]["aroma"]; // Va afisa dulce
Conversia automată a tipurilor
PHP nu acceptă definirea explicită a tipului în definirea variabilelor, tipul unei variabile fiind determinat de contextul în care acea variabilă este utilizată. Acesta înseamnă că dacă atribuiți variabilei var un șir de caractere, var va deveni șir. Dacă îi atribuiți o valoare întregă, var va deveni un întreg.
Un exemplu de conversie automată a tipului apare la utilizarea operatorului '+'. Dacă vre-un operand este double, atunci toți operanzii sunt evaluați la double, și rezultatul va fi un double. Altfel, operanzii vor fi interpretați ca întregi și rezultatul va fi tot un întreg. Rețineți că acest mod de evaluare nu modifică tipul operanzilor care intervin în expresie, ci numai modul în care ei sunt evaluați.
Exemplu:
$bbb = "0"; // $bbb este sir de caractere (ASCII 48)
$bbb++; // $bbb este sirul de caractere "1" (ASCII 49)
$bbb += 1; // $bbb este acum de tip intreg (2)
$bbb = $bbb + 1.3; // $bbb este acum de tip double (3.3)
$bbb = 5 + "10 Little Piggies"; // $bbb este de tip intreg (15)
$bbb = 5 + "10 Small Pigs"; // $bbb este de tip intreg (15)
Observație: conversia automată de la un tip simplu la tipul tablou este uzual nedefinită.
$a = 1; // $a este un intreg
$a[0] = "f"; // $a devine un vector de forma "f"
Deși aparent variabila $a a fost transformată într-un tablou cu primul element f, exemplul următor nu oferă un rezultat la fel de clar:
$a = "1"; // $a este un sir
$a[0] = "f"; // Ce se intampla cu offset-ul sirului?
Conversia explicită a tipurilor
Conversia explicită a tipurilor (cast) se face în același mod ca în C: numele tipului dorit este scris în paranteze înaite de numele variabilei.
$a = 10; // $a este un intreg
$bar = (double) $a; // $bar este un double
Conversiile permise sunt:
(int), (integer) – conversia la întreg
(real), (double), (float) – conversie la double
(string) – conversie la șir
(array) – conversie la tablou
(object) – conversie la obiect
Observați că eticheta și spațiile sunt permise între paranteze, deci liniile următoare sunt echivalente:
$a = (int) $bar;
$a = ( int ) $bar;
$a = (int)$bar;
Este posibil ca rezultatul conversiei explicite între două tipuri să nu fie evident.
De exemplu convertind un scalar sau un șir de caractere la tipul array, respectiva variabilă va deveni primul element al tabloului ca în exemplul de mai jos:
$var = 'ciao';
$arr = (array) $var;
echo $arr[0]; // Afiseaza ciao
Când convertiți un scalar sau o variabilă de tip șir de caractere la un obiect, respectiva variabilă va deveni un atribut al obiectului, atribut numit scalar.
Exemplu:
$var = 'ciao';
$obj = (object) $var;
echo $obj->scalar; // Afiseaza ciao
3.3 Variabile
Reprezentarea varibilelor
Variabilele în PHP sunt reprezentate de semnul dolar, '$', în fața numelui variabilei. Numele variabilelor sunt formate după aceleași reguli ca alte etichete din PHP. Un nume de variabilă valid trebuie să înceapă printr-o literă sau liniuță de subliniere, '_', urmată de un șir de litere, cifre sau liniuțe de subliniere.
PHP este un limbaj case-senzitiv .
Exemplu:
$var = "Jean";
$Var = "Paul";
echo "$var, $Var"; // Afiseaza Jean, Paul
$4site = 'nu inca'; // Incorect: incepe printr-o cifra
$_4site = 'nu inca'; // Corect: incepe printr-o liniuta de subliniere
$maïs = 'jaune'; // Corect: 'ï' este ASCII 239
În PHP 3, variabilele sunt asignate întotdeauna prin valoare. Astfel, când atribuim unei variabile o expresie, întreaga valoare a expresiei este copiată în variabila destinație. Aceasta înseamnă, de exemplu, că atribuind unei variabile valoarea altei variabile, modificarea unei variabile nu va avea efect asupra celeilalte.
PHP 4 aferă și un alt mod pentru atribuirea de valori variabilelor: prin referință. Aceasta înseamnă că noua variabilă nu face decât să refere variabila originală (cu alte cuvinte, "devine un alias pentru" sau "pointeză la" variabila originală). În acest caz, cele două variabile sunt interdependente, modificarea uneia determinând modificarea celeilalte. Deoarece nu are loc copierea și actualizarea valorilor, asignarea prin referință este mai rapidă. Diferența devine notabilă în cazul execuțiilor repetate sau la asignarea tablourilor mari, respectiv a abiectelor.
Pentru a atribui prin referință, se introduce un ampersand, '&', în fața variabilei care este atribuită (variabila sursă). În exemplul următor, Numele meu este Pierre se va afișa de două ori):
$aaa = 'Pierre'; // Atribui valoarea Pierre lui $aaa
$bar = &$aaa; /* Atribuire prin referinta
$aaa si $bar refera aceeasi locatie de memorie */
$bar = "Numele meu este $bar"; // Modific $bar , deci inmplicit si $aaa
echo $aaa;
echo $bar;
Observație: numai variabilele pot fi asigante prin referință.
Exemplu:
$a = 25;
$bar = &$a; // Atribuire posibila
$bar = &( 24 * 7); // Atribuire eronata: referinta unei expresii fara nume
function test()
{
return 25;
}
$bar = &test(); // Incorect: functia returneaza o valoare, nu o variabila
Variabile predefinite
PHP furnizează un mare număr de variabile predefinite pentru fiecare script pe care îl rulează. Cele mai multe variabile predefinite depind de serverul pe care se lucrează, de versiunea și configurarea serverului sau de alți factori. Unele dintre aceste variabile nu vor fi disponibile când PHP rulează într-o linie de comandă.
Domeniul variabilelor
Domeniul variabilelor este contextul în care variabila este definită. Pentru marea parte a variabilelor, domeniul lor este unic. Acest domeniu se referă și la fișierele incluse într-un script.
Exemplu:
$a = 1;
include "b.inc";
Aici variabila $a va fi accesibilă în fișierul inclus b.inc. Implicit, toate variabilele utilizate într-o funcție sunt prin definiție locale.
Exemplu:
$a = 1; // Influenta globala
function test()
{
echo $a; // Influenta locala
}
test();
Scriptul nu afișează nimic pe ecran deoarece instrucțiunea echo utilizează variabila locală $a care nu a fost asignată în acest domeniu. Este o diferență între modul de stabilire a domeniului variabilelor globale în C și PHP: în absența unei referiri locale, variabilele globale din C sunt valabile în orice funcție a programului. Acest lucru nu este valabil și în PHP.
Exemplu:
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo $b;
Acest script va produce rezultatul 3. Declarând variabilele $a și $b globale în interiorul funcției Sum(), orice referire la acestea în domeniul funcției se va face la declarațiile globale. Numărul variabilelor globale care pot fi manipulate de către o funcție este nelimitat.
A doua modalitate de a accesa variabilele din domeniul global este prin utilizarea variabilei tablou din PHP, numită $GLOBALS. Exemplul anterior poate fi rescris astfel:
$a = 1;
$b = 2;
function Sum()
{
$GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];
}
Sum();
echo $b;
Variabila $GLOBALS este un tablou asociativ care are drept indice numele variabilelor globale și conținutul respectivelor variabile drept elemente.
Un alt aspect important legat de domeniul variabilelor se referă la variabilele statice.
O variabilă statică există numai în domeniul unei funcții dar nu își pierde valoarea când execuția programului părăsește acest domeniu.
function Test()
{
$a = 0;
echo $a;
$a++;
}
Această funcție este inutilă de vreme ce la fiecare apel variabila $a este setată la valoarea 0 care va fi tipărită. Deși în funcție există instrucțiunea $a++ care incrementeză valoarea variabilei, la încheierea execuției funcției această valoare se pierde, variabila $a având domeniu local. Pentru a păstra valoarea incrementată a variabilei $a între două execuții ale funcției, ea va fi declarată ca variabilă statică așa cum reiese din exemplul următor:
function Test()
{
static $a = 0;
echo $a;
$a++;
}
În acest caz la fiecare apel al funcției Test() va fi tipărită valoarea lui $a, apoi se va incrementa.
Variabilele statice oferă de asemeni posibilitatea de a implementa și funcțiile recursive. O funcție este recursivă dacă se autoapelează. Proiectarea funcțiilor recursive trebuie făcută cu atenție pentru a evita recursia infinită. Trebuie asigurată o modalitate adecvată de încheiere a apelurilor recursive. Următoarea funcție recursivă numără până la 10 folosind variabila statică $count pentru a sesiza încheierea autoapelurilor:
Exemplu:
function Test()
{
static $count = 0;
$count++;
echo $count;
if( $count < 10)
{
Test();
}
$count–;
}
Variabile variabile
Uneori este convenabil să lucrăm cu nume de variabile ce pot fi tratate în mod dinamic. O variabilă variabilă este un nume de variabilă care poate fi inițializată și utilizată în mod dinamic. O variabilă normală este setată printr-o instrucțiune de forma:
$a = "hello";
O variabilă variabilă primește valoarea unei alte variabile și o tratează ca și cum ar fi un nume de variabilă. În exemplul următor valoarea hello atribuită anterior poate fi tratată ca un nume de variabilă utilizând de două ori semnul dolar:
$$a = "world";
În acest moment două variabile au fost definite și memorate în tabela de simboluri PHP: $a conținând "hello" și $hello conținând șirul "world". Astfel instrucțiunea:
echo "$a $($a)";
produce aceeași ieșire ca și instrucțiunea:
echo "$a $hello";
adică șirul hello world.
Pentru a utiliza variabilele variabile cu tablouri, trebuie rezolvată o problemă de ambiguitate. Astfel, dacă scriem $$a[1], trebuie să precizăm dacă dorim să utilizăm $a[1] ca variabilă sau $$a și apoi să indexăm cu [1] această variabilă. Pentru a rezolva această ambiguitate vom folosi sintaxa ${$a[1]} pentru primul caz și ${$a}[1] pentru al doilea caz.
3.4 Constante
PHP definește o serie de constante și oferă un mecanism pentru definirea altora în timpul execuției. Constantele seamănă mult cu variabilele; sunt definite cu jutorul funcției define() și valoarea lor nu poate fi modificată ulterior.Constantele predefinite (disponibile întotdeauna) sunt
__FILE__
Se utilizează cu un fișier care a fost inclus sau solicitat, când numele fișierului inclus este dat;
__LINE__
Numărul liniei din scriptul curent care este analizat. Se utilizează împreună cu un fișier care a fost inclus sau solicitat, când poziția în fișierul inclus este dată;
PHP_VERSION
Un șir de caractere reprezentând versiunea PHP utilizată;
PHP_OS
Numele sistemului de operare în care rulează PHP;
TRUE
O valoare adevărată;
FALSE
O valoare falsă;
E_ERROR
Indică o eroare, alta decât o eroare de analizare, pentru care corectarea nu este posibilă;
E_WARNING
Indică o situație în care PHP știe că ceva este greșit, dar continuă oricum;
E_PARSE
Semnalează o sintaxă invalidă în fișierul script; corectarea nu este posibilă;
E_NOTICE
S-a întâmplat ceva care poate fi sau nu o eroare; execuția continuă. Spre exemplu am accesat o variabilă care nu a fost inițializată sau am folosit un șir neîncadrat între ghilimele ca index asociativ.
Puteți defini constante suplimentare utilizând funcția define(). Rețineți că aceste constante nu se comportă ca macro-urile C; numai datele scalare valide pot fi reprezentate printr-o constantă.
Exemplu:
(definirea constantelor):
define( "CONSTANT", "Hello world.");
echo CONSTANT; // Afiseaza Hello world.
Exemplu:
(utilizarea constantelor predefinite __FILE__ și __LINE__):
function repor_error( $file, $line, $message)
{
echo "An error occured in $file on line $line: $message.";
}
report_error( __FILE__, __LINE__, "Something went wrong!");
3.5 Expresii
Expresiile sunt cele mai importante construcții ale PHP; în PHP aproape orice scrieți este o expresie. Cea mai simplă și corectă modalitate de a defini o expresie este orice are o valoare. Cele mai simple expresii sunt constantele și variabilele.
Exemplu:
$a = 5;
În această construcție 5 este o expresie constantă. De asemeni, funcțiile sunt expresii deoarece returnează valoare.
Exemplu:
function f()
{
return 5;
}
Deoarece f() returnează valoarea 5, valoarea expresiei f() este 5. Bineînțeles, valorile nu trebuie să fie neapărat întregi . PHP acceptă 3 tipuri de valori scalare: valori întregi, valori în virgulă mobilă și valori tip șir de caractere (valorile scalare sunt acele valori indivizibile spre deosebire de valorile array, de exemplu). PHP acceptă de asemeni două tipuri compuse: array și object (tablouri și obiecte). Valorile de acest tip pot fi atribuite variabilelor sau returnate de către funcție.
PHP este un limbaj orientat pe expresii în sensul că aproape orice este o expresie. Operatorii de pre și postincrementare funcționează analog cu cei din C. Un tip uzual de expresii îl reprezintă expresiile de comparare. Aceste expresii sunt evaluate la 0 sau 1 reprezentând FALSE, respectiv TRUE.
PHP acceptă operatorii de comparație >, >=, ==, != (diferit), <, <=. Aceste expresii sunt utilizate uzual în construirea condițiilor. Ca și în C se pot folosi operatorii de atribuire compuși. În afară de faptul că utilizarea acestor operatori compuși duce la scurtarea codului, și execuția este mai rapidă. De asemeni, PHP acceptă operatorul ternar condițional '?', cu aceeași semnificație ca și în C.
Următoarele exemple ilustrează utilizarea operatorilor compuși și a celor de pre și postincrementare.
function double( $i)
{
return $i * 2;
}
$b = $a = 5; /* Atribuie valoarea 5 variabilelor $a si $b */
$c = $a++; /* Postincrementare: atribuie valoarea initiala a lui $a (5) variabilei $c */
$e = $d = ++$b; /* Preincrementare: atribuie valoarea incrementata a lui $b (6)variabilelor $d si $ */
/* In acest punct $d si $e sunt egale cu 6 */
$f = double( $d++); /* Atribuie ( valoarea lui $d inainte de incrementare) * 2,6 * 2 = 12, variabilei $f */
$g = double( ++$e); /* Atribuie ( valoarea lui $e dupa incrementare) * 2, 7 * 2 = 14, variabilei $g /
$h = $g += 10; /* $g este incrementat cu 10 si ia valoarea 24.
Aceasta valoare (24) este apoi atribuita variabilei $h, care va lua valoarea 24. */
Limbajul PHP nu dispune de un tip logic predefinit. Evaluarea valorii de adevăr a expresiilor PHP se face la fel ca în C și Perl: orice valoare numerică nenulă este TRUE, zero este FALSE. Un șir vid este FALSE, orice alt șir este TRUE. În cazul tablourilor și obiectelor orice valoare care nu conține elemente este considerată FALSE, altfel este considerată TRUE.
3.6 Operatori
Operatori aritmetici
Operatorul de împărțire ('/') întoarce o valoare întreagă (rezultatul împărțirii întregi) dacă cei doi operatori sunt întregi (sau dacă șirurile sunt convertite la întregi). Dacă unul din operatori este număr cu virgulă mobilă, sau rezultatul unei operații returnează o valoare care nu este întreagă, va fi returnată o valoare în virgulă mobilă.
Operatori de atribuire
Operatorul de atribuire simplă este '='. Are semnificația: valoarea expresiei din dreapta se atribuie variabilei din stânga (variabilă simplă sau structurată).
Putem spune că instrucțiunea de atribuire este formată din trei elemente: expresia care urmează să fie atribuită, operatorul de atribuire '=' și variabila destinatară.
Când este executată instrucțiunea de atribuire, este evaluată expresia și valoarea rezultată este depusă la destinația specificată.
Exemplu:
$a = ( $b = 4) + 5;
/* $a este egal cu 9 si $b cu 4 */
În operațiile aritmetice și pe șiruri de caractere se pot folosi și operatorii compuși, așa cum reiese din exemplul următor:
$a = 3;
$a += 5;
/* Atribuie 8 variabilei $a. Corespunde instructiunii $a = $a + 5; */
$a = "Buna";
$b .= " la toata lumea!";
/* Atribuie valoarea "Buna la toata lumea!" variabilei $b
(echivalent cu $b = $b . " la toata lumea!") */
De remarcat că atribuirea se face prin copiere, adică expresia din dreapta nu se modifică în urma atribuirii. PHP4 acceptă și atribuirea prin referință, utilizând sintaxa $var = &$othervar;, dar acest lucru nu este posibil în PHP3. Atribuirea prin referință înseamnă că cele două variabile referă aceeași locație de memorie și că modificarea uneia dintre ele o afectează și pe cealaltă.
Operatori pe biți
Operatorii pe biți vă permit să manipulați numerele întregi în reprezentare binară.
Operatori de comparație
Operatorii de comparație permit compararea a două valori.
Un alt operator condițional este operatorul ternar ('?:'), care funcționează ca în C.
( expr1) ? ( expr2) : ( expr3);
Această expresie returnează expresia expr2 dacă expr1 este adevarată și expresia expr3 dacă expresia expr1 este falsă.
Operatori de control al erorilor
PHP are un operator de control al erorilor și anume '@'. Când acest operator precede o expresie în PHP, orice eroare care poate fi generată va fi ignorată. Dacă opțiunea track_errors este activată, mesajele de eroare generate de expresie vor fi salvate în variabila globală $php_errormsg. Această variabilă va fi rescrisă la fiecare eroare, deci verificați-o la timp dacă doriți să o utilizați.
Exemplu:
/* Eroare SQL intentionata (apostrofuri suplimentare) */
$res = mysql_query( "select name, code from 'namelist") or
die( "Query failed: error was '$php_errormsg'.");
Operatori de execuție
PHP are un operator de execuție '„' (backticks). Este diferit de ghilimelele simple.
PHP va încerca să execute conținutul dintre aceste ghilimele oblice ca o comandă shell. Rezultatul va fi returnat (nu va fi descărcat pur și simplu, ci va putea fi atribuit unei variabile).
Exemplu:
$output = `ls -al`;
echo "<pre> $output </pre>";
Operatori de incrementare/decrementare
PHP dispune de operatori de incrementare/decrementare ca și limbajul C.
echo "<h3>Post-incrementare</h3>";
$a = 5;
echo "Obtin valoarea 5: " . $a++ . "<br>";
echo "Obtin valoarea 6: " . $a . "<br>";
echo "<h3>Pre-incrementare</h3>";
$a = 5;
echo "Obtin valoarea 6: " . ++$a . "<br>";
echo "Obtin valoarea 6:" . $a . "<br>";
echo "<h3>Post-decrementare</h3>";
$a = 5;
echo "Obtin valoarea 5: " . $a– . "<br>";
echo "Obtin valoarea 4: " . $a . "<br>";
echo "<h3>Pre-decrementare</h3>";
$a = 5;
echo "Obtin valoarea 4: " . –$a . "<br>";
echo "Obtin valoarea 4: " . $a . "<br>";
Operatori logici
Operatorii logici sunt:
Motivul pentru care există două tipuri de 'ȘI' și 'SAU' este că ele au priorități diferite.
Precedența operatorilor
Precedența operatorilor specifică ordinea în care se aplică operatorii. De exemplu, în expresia 1 + 5 * 3 rezultatul este 16 și nu 18, căci înmulțirea ('*') are prioritate superioară în raport cu adunarea ('+').
Tabelul următor conține operatorii disponibili în PHP în ordinea crescătoare a priorităților.
Operatori pentru șiruri de caractere
Există doi operatori pentru șiruri de caractere. Primul este operatorul de concatenare ('.'), care are ca rezultat concatenarea celor două argumente. Cel de-al doilea operator este operatorul de atribuire ('.='), care concatenează argumentul din partea dreaptă la argumentul din stângă.
$a = "Hello";
$b = $a . "World!"; // $b contine sirul Hello World!
$a = "Hello";
$a .= "World!"; // $a contine sirul Hello World!
3.7 Structuri de control
Toate scripturile PHP sunt o suită de instrucțiuni. O instrucțiune poate fi o atribuire, un apel de funcție, o instrucțiune condițională sau chiar o instrucțiune vidă. O instrucțiune se termină de obicei prin punct și virgulă, ';'. Instrucțiunile pot fi grupate în blocuri delimitate de acolade, '{}'. Un bloc este considerat ca o instrucțiune. Diferitele tipuri de instrucțiuni sunt descrise în capitolul următor.
Instrucțiunea if este importantă în toate limbajele, inclusiv în PHP. Ea permite execuția condiționată a unei părți de cod. Sintaxa instrucțiunii if este aceeași ca și în C:
if( expresie)
{
listă de instrucțiuni
}
Cum am văzut în paragraful care se referă la expresii, expresie este evaluată la o valoare de adevăr. Dacă expresia expresie este TRUE, PHP va executa instrucțiunile din lista de instrucțiuni, iar dacă ea este FALSE, instrucțiunile vor fi ignorate.
Exemplu:
if( $a > $b)
echo "$a este mai mare decat $b";
Dacă dorim ca un grup de instrucțiuni să fie executate condiționat, este suficient să închidem aceste instrucțiuni între acolade pentru a forma un bloc.
Exemplu:
if( $a > $b)
{
echo "$a este mai mare decat $b";
$b = $a;
}
Instrucțiunile if pot fi imbricate pe oricâte niveluri dorim obținându-se o structură condițională extrem de flexibilă.
Dacă dorim să executăm două instrucțiuni diferite în funcție de valoarea de adevăr a unei expresii vom folosi o instrucțiune if-else ca în exemplul următor:
if( $a > $b)
{
print "$a este mai mare decat $b";
}
else
{
print "$b este mai mare decat $a";
}
Instrucțiunile de după else sunt executate doar dacă expresia condițională este evaluată la FALSE.
Instrucțiunea elseif este o combinație a instrucțiunilor if și else. Ca și else, instrucțiunea elseif extinde o instrucțiune if pentru a executa alte instrucțiuni în cazul în care expresia condițională din if este FALSE. Spre deosebire de else, instrucțiunea alternativă va fi executată doar dacă expresia condițională din elseif este TRUE.
Spre exemplu, fragmentul următor de cod va afișa care este relația dintre $a și $b.
if( $a > $b)
{
print "$a este mai mare decat $b";
}
elseif( $a == $b)
{
print "$a este egal cu $b";
}
else
{
print "$b este mai mare decat $b";
}
Instrucțiunile elseif se pot imbrica pe mai multe niveluri, după un if inițial. Primul elseif care va fi evaluat la TRUE va fi executat. În PHP, instrucțiunea poate fi scrisă și în două cuvinte: else if. Comportamentul său va fi același.
Sintaxa alternativă
PHP propune o sintaxa alternativă pentru instrucțiunile de control if, while, for și switch. În fiecare caz principiul este de a înlocui acolada deschisă cu două puncte (':') și acolada închisă prin, respectiv endif;, endwhile;, endfor;, sau endswitch;.
if( $a == 5):
echo $a;
endif;
Această sintaxă funcționează de asemenea cu else și elseif. Exemplul următor prezintă o structură cu un if, un elseif și un else utilizat în această nouă sintaxă.
if( $a == 5):
print "$a este egal cu 5";
print "…";
elseif( $a == 6):
print "$a este egal cu 6";
print "!!!";
else:
print "$a este diferit de 5 si 6";
endif;
Bucla while este cea mai simplă implementare a unei bucle în PHP. Această buclă se comportă la fel ca în C. Sintaxa instrucțiunii while este:
while( expresie)
{
listă de instrucțiuni
}
Execuția unei bucle while este foarte simplă. PHP execută instrucțiunile din lista de instrucțiuni atât timp cât expresia buclei while, expresie, este evaluată la TRUE. Valoarea expresiei este verificată la fiecare început al buclei și, dacă valoarea se schimbă pe durata execuției instrucțiunilor, execuția nu se va sfârși decât la următoarea iterație (de fiecare dată când PHP execută instrucțiunile are loc o iterație). Dacă expresia buclei while este FALSE înaintea primei interații, instrucțiunea nu va fi niciodată executată.
Mai multe instrucțiuni pot fi executate într-o buclă while grupându-le între acolade pentru a forma un bloc sau utilizând sintaxa alternativă după modelul de mai jos:
while( expresie):
listă de instrucțiuni
endwhile;
Următoarele exemple sunt identice ca efect și afișează toate numerele de la 1 la 10:
/* Exemplul 1 */
$i = 1;
while( $i <= 10)
{
print $i++; /* Afiseaza valoarea lui $i inaintea incrementarii */
}
/* Exemplul 2 */
$i = 1;
while( $i <= 10):
print $i;
$i++;
endwhile;
Buclele do..while seamănă mult cu buclele while, dar expresia condițională este testată la sfârșitul fiecarei iterații și nu la început. Principala diferență față de bucla while este că prima iterație a buclei do..while este întotdeauna executată (expresia nu este testată decât la sfârșitul iterației). Nu există decât o sintaxă posibilă pentru buclele do..while:
do
{
listă de instrucțiuni
}while( expresie);
Exemplu:
$i = 0;
do
{
print $i;
}while( $i > 0);
Bucla de mai sus va fi executată doar o singură dată, pentru că la prima evaluare a expresiei obținem FALSE (deoarece variabila $i nu este mai mare decât 0) și execuția buclei se oprește.
Utilizatorii familiari cu C sunt obișnuiți să utilizeze în mod diferit buclele do..while, care permite oprirea execuției buclei, prin introducerea instrucțiunii break într-o buclă do..while. Codul următor demonstrează acest lucru:
do
{
if( $i < 5)
{
print "$i nu este suficient de mare";
break;
}
$i *= $factor;
if( $i < $minimum_limit)
{
break;
}
print "$i este bun";
}while( 0);
Buclele for sunt cele mai complexe bucle în PHP. Ele funcționează la fel ca buclele for din limbajul C.
Instrucțiunea are următoarea sintaxă:
for( expr1; expr2; expr3)
{
listă de instrucțiuni
}
Prima expresie (expr1) este evaluată (executată) o singură dată, necondiționat, la începutul buclei.
La începutul fiecărei iterații, expresia expr2 este evaluată. Dacă evaluarea devine TRUE, bucla continuă și instrucțiunile din lista de intrucțiuni sunt executate. Dacă evaluarea devine FALSE, execuția buclei se oprește.
La sfârșitul fiecărei iterații, expresia expr3 este evaluată (executată).
Expresiile pot fi eventual vide. Dacă expresia expr2 este vidă, înseamnă că bucla este infinită (PHP consideră implicit că expresia expr2 este TRUE, ca în C). Acest lucru poate fi util, mai ales când dorim să terminăm bucla cu instrucțiunea break.
În exemplele următoare vor fi afișate numerele de la 1 la 10:
/* Exemplul 1 */
for( $i = 1; $i <= 10; $i++)
{
print $i;
}
/* Exemplul 2 */
for( $i = 1;; $i++)
{
if( $i > 10)
{
break;
}
print $i;
}
/* Exemplul 3 */
$i = 1;
for( ;;)
{
if( $i > 10)
{
break;
}
print $i;
$i++;
}
/* Exemplul 3 */
for( $i = 1; $i <= 10; print $i, $i++) ;
Evident, primul exemplu (sau al patrulea) este cel mai simplu dintre toate, dar utilizarea unei expresii vide într-o buclă for poate fi utilă de multe ori.
De asemeni, PHP folosește următoarea sintaxă alternativă pentru buclele for:
for( expr1; expr2; expr3):
listă de instrucțiuni
endfor;
PHP4 (nu și PHP3) dispune de comanda foreach, ca Perl sau alte limbaje. Instrucțiunea oferă un mod simplu de a trece în revistă un tablou. Există două sintaxe posibile, a doua este o mică, dar utilă, extensie a celei dintâi :
foreach( array_expresion as $value)
{
listă de instrucțiuni
}
foreach( array_expresion as $key => $value)
{
listă de instrucțiuni
}
Prima formă trece în revistă tabloul array_expression. La fiecare iterație, valoarea elementului curent este atribuită lui $value și pointerul intern al tabloului este avansat cu un element (astfel, la următoarea iterație aveți acces la următorul element).
A doua formă face același lucru, dar cheia (indicele) elementului curent va fi atribuită variabilei $key la ficare iterație.
Notă:
când foreach începe să fie executat, pointerul intern al fișierului este automat repoziționat la primul element al tabloului. Acest lucru înseamnă că nu veți avea nevoie să faceți apel la reset() înainte de foreach. De asemeni, foreach lucrează cu o copie a tabloului astfel încât pointer-ul intern al tabloului nu este modificat ca în cazul utilizării constructorului each.
Următoarele două exemple funcționează în același mod:
reset( $arr);
while( list( , $value) = each( $arr))
{
echo "Valoare: $value<br>\n";
}
foreach( $arr as $value)
{
echo "Valoare: $value<br>\n";
}
Exemplele următoare funcționează, de asemeni, identic:
reset( $arr);
while( list( $key, $value) = each( $arr))
{
echo "Cheie: $key; Valoare: $value<br>\n";
}
foreach( $arr as $key => $value)
{
echo "Cheie: $key; Valoare: $value<br>\n";
}
Urmează 3 exemple de utilizare :
/* Exemplul 1: o singura valoare */
$a = array( 1, 2 3, 17);
foreach( $a as $v)
{
print "Valoarea curenta este \$a: $v.\n";
}
/* Exemplul 2: valoare (cu cheie asociata) */
$a = array( 1, 2 3, 17);
$i = 0; /* Numai pentru afisare */
foreach( $a as $v)
{
print "\$a[$i] => $k.\n";
}
/* Exemplul 3: valoarea si cheia */
$a = array(
"unu" => 1,
"doi" => 2,
"trei" => 3,
"saptesprezece" => 17
);
foreach( $a as $k => $v)
{
print "\$a[$k] => $v.\n";
}
Instrucțiunea break permite ieșirea dintr-o instrucțiune if, for, while sau switch. Instrucțiunea break acceptă un argument numeric opțional care va indica numărul de instrucțiuni imbricate care trebuiesc întrerupte.
Exemplu:
$arr = array( 'unu', 'doi', 'trei', 'patru', 'stop', 'cinci');
while( list( , $val) = each( $arr))
{
if( $val == 'stop')
break; /* Se poate scrie si "break 1;" */
echo "$val<br>\n";
}
/* Folosind un argument optional */
$i = 0;
while( ++$i)
{
switch( $i)
{
case 5:
echo "La 5<br>\n";
break 1; /* Se incheie doar instructinuea switch */
case 10:
echo "La 10 – iesire<br>\n";
break 2; /* Se incheie instructile switch si while */
default:
break;
}
}
Instrucțiunea continue este utilizată într-o buclă pentru a sări peste instrucțiunile de după continue și până la sfârșitul blocului; execuția iterației curente este întrerupă și se trece la execuția iterației următoare. Instrucțiunea continue acceptă un argument numeric opțional care va indica câte bucle imbricate vor fi ignorate.
Exemplu:
while( list( $key, $val) = each( $arr))
{
if( !( $key % 2)) // Evita elementele impare
continue;
executa_impar( $val);
}
$i = 0;
while( $i++ < 5)
{
echo "Exterior<br>\n";
while( 1)
{
echo "Mijloc<br>\n";
while( 1)
{
echo "Interior<br>\n";
continue 3;
}
echo "Aici nu afiseaza niciodata.<br>\n";
}
echo "Nu faceti niciodata asta.<br>\n";
}
Instrucțiunea switch este echivalentă cu o serie de instrucțiuni if. Cu numeroase ocazii, veți avea nevoie să comparați aceeași variabilă (sau expresie) cu mai multe valori diferite și să executați diferite parți din cod în funcție de valoarea obținută. Acesta este modul de execuție al instrucțiunii switch.
Următorul exemplu ilustrează două modalități diferite de a scrie același lucru, una utilizează o serie de if și alta utilizează instrucțiunea switch:
if( $i == 0)
print "$i este egal cu 0";
if( $i == 1)
print "$i este egal cu 1";
if( $i == 2)
print "$i este egal cu 2";
switch( $i)
{
case 0:
print "$i este egal cu 0";
break;
case 1:
print "$i este egal cu 1";
break;
case 2:
print "$i este egal cu 2";
break;
}
Este important să înțelegem modul de execuție al instrucțiunii switch pentru a evita apariția erorilor. Instrucțiunea switch se execută secvențial, linie după linie. La început nu este executat nici un cod. Numai când se gasește o valoare a selectorului identică cu o constantă case, PHP execută instrucțiunile corespunzătoare respectivei constante case. PHP continuă să execute instrucțiunile pâna la sfârșitul blocului de instrucțiuni switch sau până când întâlnește instrucțiunea break. Dacă nu utilizați instrucțiunea break la sfârșitul unui bloc case, PHP va continua să execute instrucțiunile din următorul bloc case:
switch( $i)
{
case 0:
print "$i este egal cu 0";
case 1:
print "$i este egal cu 1";
case 2:
print "$i este egal cu 2";
}
În acest exemplu, dacă $i este egal cu 0, PHP va executa toate instrucțiunile print. Dacă $i este egal cu 1, PHP va executa ultimele două instrucțiuni print și numai dacă $i este egal cu 2 veți obține rezultatul scontat, adică se va afișa $i este egal cu 2. Deci, imporatant este sa folosiți corect instrucțiunea break.
În comanda switch, condiția este evaluată o singură dată și rezultatul este comparat cu fiecare constantă case. Într-o instrucțiune elseif, condiția este reevaluată. Dacă condiția voastră este mai complicată decât o simplă comparație sau apare într-o buclă, instrucțiunea switch se poate dovedi mai rapidă.
Lista de instrucțiuni a unei constante case poate fi vidă; în acest caz PHP va utiliza lista de instrucțiuni din case-ul următor.
switch( $i)
{
case 0:
case 1:
case 2:
print "$i este mai mic decât 3, dar nu este negativ";
break;
case 3:
print "$i este egal cu 3";
}
Un caz special îl constituie expresia predefinită default. Această expresie indică orice expresie diferită de constantele case anterioare:
switch( $i)
{
case 0:
print "$i este egal cu 0";
break;
case 1:
print "$i este egal cu 1";
break;
case 2:
print "$i este egal cu 2";
break;
default:
print "$i nu este egal cu 0, 1 sau 2";
}
Observație: expresia predefinită default poate fi folosită oriunde în instrucțiunea switch.
Expresiile case pot fi orice expresie scalară de tip întreg, virgulă mobilă sau șir de caractere. Tablourile și obiectele pot fi folosite numai dacă sunt dereferențiate la un tip simplu.
Sintaxa alternativă pentru această structură de control este următoarea:
switch( $i):
case 0:
print "$i este egal cu 0";
break;
case 1:
print "$i este egal cu 1";
break;
case 2:
print "$i este egal cu 2";
break;
default:
print "$i nu este egal cu 0, 1 sau 2";
endswitch;
Funcția include() introduce și evaluează fișierul specificat în argument. Dacă URL fopen wrappers nu sunt disponibile în PHP (așa cum sunt în configurația implicită), puteți specifica fișierul care trebuie inclus utilizând un URL în locul unui pathname local. Pentru a evita utilizarea eronată a fișierului inclus, orice cod din fișierul destinație care trebuie executat ca un cod PHP trebuie încadrat de tag-uri de început și sfârșit valide în PHP. De asemeni, se poate folosi o instrucțiune include() într-o buclă pentru a include mai multe fișiere diferite, așa cum reiese din exemplul următor:
$files = array( 'unu.inc', 'doi.inc', 'trei.inc');
for( $i = 0; $i < count( $files); $i++)
{
include( $files[ $i]);
}
Instrucțiunea include() este reevaluată de fiecare dată când este întâlnită într-un cod PHP. Deoarece include() este o construcție specială a limbajului, trebuie să o includeți într-un bloc de instrucțiuni dacă ea apare într-un bloc condițional.
Exemplu:
/* Utilizarea este GRESITA si nu va functiona in modul dorit */
if( $condition)
include( $file);
else
include( $other);
/* Aceasta este CORECT */
if( $condition)
{
include( $file);
}
else
{
include( $other);}
În PHP4, cât și în PHP3, se poate executa o instrucțiune return în interiorul unui fișier inclus cu include(), execuția determinând încheierea procesului în respectivul fișier și revenirea în scriptul care l-a solicitat. De asemeni, PHP4 permite să returnați valori din fișierele incluse cu include(). Puteți folosi aceste valori ca și cum ar fi returnate de o funcție normală.
Exemplu:
/* Fisierul test.inc */
/* Se presupune ca fisierul test.inc exista in acelasi
director cu fisierul main.html */
echo "Inainte de return<br>\n";
if( 1)
{
return 27;
}
echo "Dupa return<br>\n";
/* … in fisierul main.html */
/* Presupunem ca fisierul main.html contine aceasta: */
$retval = include( 'test.inc');
echo "Fisierul returneaza: '$retval'<br>\n";
Atunci când main.html este apelat în PHP3, el va genera o eroare de analiză la linia 3 deoarece în PHP3 nu putem evalua valori returnate de include(). În PHP4 rezultatul va fi:
Inainte de return
Fisierul returneaza: '27'
Să presupunem acum că main.html a fost modificat și conține codul următor:
include( 'test.inc');
echo "Intoarcere in main.html<br>\n";
În PHP4 se va afișa:
Inainte de return
Intoarcere in main.html
Din contră, PHP3 afișează:
Inainte de return
27 Intoarcere in main.html
Parse error: parse error in main.html on line 5
Eroarea de analiză de mai sus este rezultatul faptului că instrucțiunea return este inclusă împreună cu test.inc în același bloc. Dacă instrucțiunea return este mutată în afara blocului, se afișează:
Inainte de return
27 Intoarcere in main.html
"27" arată că PHP3 nu suportă returnarea valorilor din fișiere în acest mod.
Este important de notat că atunci când un fișier este inclus cu include() codul pe care îl conține moștenește domeniul variabilelor corespunzator liniei pe care apare instrucțiunea include() în cod. Orice variabilă disponibilă pe respectiva linie va fi disponibilă și în fișierul inclus.
Instrucțiunea include_once include și evaluează fișierul specificat în timpul execuției scriptului. Comportamentul este similar cu cel al instrucțiunii include(), deosebirea majoră fiind aceea că dacă codul din fișier a fost deja inclus în script operația nu va fi repetată. Vom folosi această instrucțiune când un fișier ar putea fi inclus și evaluat de mai multe ori în execuția unui anumit script și dorim să ne asigurăm că includerea sa se va efectua numai odată pentru a evita problemele care pot să apară la redefinirea funcțiilor, reinițializarea variabilelor etc.
3.7 Funcții
Funcțiile definite de utilizator
O funcție poate fi definită de utilizator conform sintaxei următoare:
function nume_functie( $arg1, $arg2, …, $argN)
{
echo "Exemplu de functie.\n";
return $retval;
}
Într-o funcție poate să apară orice cod PHP valid, chiar alte funcții și definiții de clase.
În PHP3, funcțiile trebuie să fie definite înainte de a fi referențiate; în PHP4 nu există o asemenea restricție. PHP nu susține funcții de supraîncarcare, nu se poate anula definirea sau redefini o funcție declarată anterior.
PHP3 nu acceptă număr variabil de argumente în antetul funcțiilor, dar acceptă argumente implicite.
Argumentul funcțiilor
Informațiile pot fi transmise funcțiilor print-o listă de argumente. În această listă variabilele și/sau constantele sunt delimitate prin virgulă.
PHP acceptă transmiterea argumentelor prin valoare (implicit), prin referință și argumente cu valori implicite. Listele cu număr variabil de argumente sunt acceptate doar în versiunea PHP4. Un efect similar poate fi obținut în PHP3 transmițând funcției un tablou de argumente.
Exemplu:
function takes_array( $input)
{
echo "$input[0] + $input[1] = ", $input[0] + $input[1];
}
Transmiterea argumentelor prin referință
Implicit, argumentele funcțiilor sunt transmise prin valoare (în sensul că schimbarea valorii argumentului în interiorul funcției nu se reflectă și în afara funcției). Dacă doriți să permiteți unei funcții să modifice argumentele sale, acestea trebuie transmise prin referință.
Dacă vreți ca un argument al unei funcții să fie transmis prin referință, trebuie să precedați cu un '&' numele argumentului în definiția funcției, ca în exemplul de mai jos:
function add_some_extra( &$string)
{
$string .= 'and something extra.';
}
$str = 'This is a string, ';
add_some_extra( $str);
echo $str; // Se va afisa This is a string, and something extra.
Dacă vreți să transmiteți o variabilă prin referință unei funcții care nu face acest lucru în mod implicit, trebuie să precedați cu un '&' numele argumentului în apelul funcției :
function my_function( $string)
{
$string .= 'and something extra.';
}
$str = 'This is a string, ';
my_function( $str);
echo $str; // Se va afisa This is a string,
my_function( &$str);
echo $str; // Se va afisa This is a string, and something extra.
Valorile argumentelor implicite
O funcție poate defini valorile implicite ale argumentelor scalare în stilul C++, ca în exemplul de mai jos:
function makecoffee( $type = "cappucino")
{
return "Making a cup of $type.\n";
}
echo makecoffee ();
echo makecoffee ( "espresso");
Rezultatul acestui cod este:
Making a cup of cappucino.
Making a cup of espresso.
Valoarea implicită trebuie să fie o expresie constantă, nu o variabilă sau un membru de clasă. Observați că atunci când folosiți argumente implicite, orice astfel de argument trebuie să fie în lista argumentelor în dreapta orcărui argument neimplicit, altfel nu vom obține rezultatul așteptat.
Considerați exemplul următor:
function makeyogurt( $type = "acidophilus", $flavour)
{
return "Making a bowl of $type $flavour.\n";
}
echo makeyogurt( "raspberry"); // Nu merge!!!
Rezultatul acestui cod este:
Warning: Missing argument 2 in call to makeyogurt() in
/usr/local/etc/httpd/htdocs/php3test/functest.html on line 41
Making a bowl of raspberry.
Acum comparați cu acesta:
function makeyogurt( $flavour, $type = "acidophilus")
{
return "Making a bowl of $type $flavour.\n";
}
echo makeyogurt( "raspberry"); // Merge!!!
/* Afișează:
Making a bowl of acidophilus raspberry. */
Liste cu număr variabil de argumente
PHP4 acceptă liste cu număr variabil de argumente în funcțiile definite de utilizator. Acest lucru se obține ușor, utilizând funcțiile funct_num_args, funct_get_arg și funct_get_args.
Valorile returnate de funcții
Valorile sunt returnate folosind opțional instrucțiunea return. Poate fi returnat orice tip de rezultat, inclusiv tablouri și obiecte:
function square( $num)
{
return $num * $num;
}
echo square( 4); // Se afișează 16
Nu puteți returna valori multiple dintr-o funcție, dar rezultate asemănătoare pot fi obținute prin returnarea unui tablou:
function small_numbers()
{
return array( 0, 1, 2);
}
list( $zero, $one, $two) = small_numbers();
Pentru a returna o referință dintr-o funcție, trebuie folosit operatorul '&' atât în declarația funcției dar și când atribuiți valoarea returnată unei variabile, ca în exemplul de mai jos:
function &returns_reference()
{
return &$someref;
}
$newref = &returns_reference();
Funcții variabile
PHP susține conceptul de funcții variabile. Aceasta înseamnă că dacă numele unei variabile este urmat de paranteze, PHP va caută o funcție cu același nume și va încerca să o execute.
function fct()
{
echo "In fct()<br>\n";
}
function bar( $arg = '')
{
echo "In bar(): argument was '$arg'<br>\n";
}
$func = 'fct';
$func();
$func = 'bar';
$func( 'test');
2.8 Referințe
Ce sunt referințele?
În PHP referințele reprezintă posibilitatea de a referi conținutul unei variabile prin nume diferite. În PHP numele unei variabile diferă de conținutul variabilei, deci un anumit conținut poate fi identificat prin nume diferite.
Ce fac referințele?
Referințele PHP permit referirea aceluiași conținut prin două variabile diferite. Când scrieți:
$a = &$b;
înseamnă că $a și $b indică aceeași variabilă.
Al doilea lucru pe care îl realizează referințele este să transmită variabile prin referință. Acest lucru se realizează folosind variabila locală a funcției și variabila cu care se face apelul drept referințe către același conținut.
Exemplu:
function fct( &$var)
{
$var++;
}
$a = 5;
fct( $a);
Apelul de mai sus va duce la obținerea valorii 6 în variabila $a. Acest lucru se întâmplă deoarece în funcția fct() variabila $var referă același conținut ca și variabila $a.
Al treilea lucru pe care îl pot face referințele este întoarcerea unei valori prin referință.
Ce nu sunt referințele?
Referințele nu sunt pointeri. Astfel, următoarea construcție nu va întoarce rezultatul așteptat:
function fct( &$var)
{
$var = &$GLOBALS[ "baz"];
}
fct( &bar);
În momentul apelului $var va intra în corespondența cu $bar din apelator, dar va fi redirectată către $GLOBALS[ "baz"].
Întoarcerea referințelor
Întoarcerea prin referință este utilă când doriți să utilizați funcții pentru a găsi variabile care ar trebui legate cu acestea. Când returnați referințe folosiți sintaxa:
function &find_var( $param)
{
//… code…
return &$found_var;
}
$fnc = &find_var( $bar);
În acest exemplu proprietatea obiectului returnat de funcția find_var() trebuie setată, nu copia acesteia cum s-ar întâmpla dacă nu am utiliza sintaxa prin referință.
Observație:
-spre deosebire de transmiterea parametrilor, trebuie să utilizați '&' în ambele locuri pentru a indica ce întoarceți prin referințăa (și nu prin valoare cum este uzual) și pentru a spune cui i se atribuie respectiva referință.
Resetarea referințelor
Când resetați o referință rupeți practic legatura dintre numele și conținutul variabilei. Aceasta nu înseamnă ca acel conținut al variabilei va fi distrus.
Exemplu:
$a = 1;
$b = &$a;
unset( $a);
Secvența de cod de mai sus nu va reseta $b ci numai variabila $a.
Multe construcții sintactice în PHP sunt implementate prin mecanismul referințelor, deci modul lor de funcționare se poate aplica acestor construcții. Unele construcții, cum ar fi transmiterea și întoarcerea prin referință, au fost deja menționate. Alte construcții care folosesc referințele sunt referințele globale. Când declarați variabila $var ca variabilă globală creați defapt o referință la o variabilă globală. Semnificația este aceeași cu :
$var = &$GLOBALS[ "var"];
Aceasta înseamnă, spre exemplu, că, resetarea variabilei $var nu va reseta și variabila globală asociată.
$this
Într-o metodă obiectuală $this referă întotdeauna obiectul apelator.
3.9 Funcții pentru tablouri
Aceste funcții vă permit să gestionați tablourile în diferite moduri. Tablourile sunt esențiale pentru memorarea, gestionarea și operarea cu mulțimi de variabile. PHP permite folosirea tablourilor uni și multidimensionale.
Functia array are sintaxa: array array( [mixed… ])
Crează și întoarce un tablou de parametri.
Notă: array() este un constructor de limbaj utilizat pentru a reprezenta tablouri și nu o funcție obișnuită.
Sintaxa index => valori, separată prin virgulă, definește indexul și valorile. Indexul poate fi de tip șir sau numeric. Când indicele este omis, un index întreg este automat produs începând de la 0. Dacă indexul este un întreg, indexul următor produs va fi indexul întreg mai mare cu 1. Notați că atunci când se definesc doi indecși identici cu valori diferite, ultima valoare o suprascrie pe prima.
Următorul exemplu demonstrează cum se crează un tablou bidimensional, cum se specifică cheia pentru un tablou asociativ și cum sar și continuă indicii numerici din tablou:
$fruits = array(
"fruits" => array( "a" => "orange", "b" => "bannana", "c" => "apple"),
"numbers" => array( 1, 2, 3, 4, 5, 6),
"holes" => array( "first", 5 => "second", "third")
);
Suprascrierea indicilor:
$array = array( 1, 1, 1, 1, 1, 8 => 1, 4 => 1, 19, 3 => 13);
print( $array);
Conținutul este:
array( [0] => 1, [1] => 1, [2] => 1, [3] => 13, [4] => 1, [8] => 1, [9] => 19)
Notați că indicele 3 este definit de două ori și ține valoarea sa finală, 13. Indexul 4 este definit după indexul 8 și indexul următor devine 9 (pentru a estima 19), de vreme ce indicele cel mai mare era 8.
Următorul exemplu crează un tablou cu o bază pe 1.
$primele_3_luni = array( 1 => 'ianuarie', 'februarie', 'martie');
print_r( $primele_3_luni);
Tabloul $primele_3_luni va conține:
array( [1] => 'ianuarie', [2] => 'februarie', [3] => 'martie')
Functia array_count_values are sintaxa:
array array_count_values( array input)
Funcția returnează un tablou folosind valorile din tabloul de intrare, input, drept chei și frecvența lor drept valori.
Exemplu:
$array = array( 1, "salut", 1, "moneda", "salut");
array_count_values( array);
// Restitue array( 1 => 2, "salut" => 2, "moneda" => 1)
Functia array_diff are sintaxa:
array array_diff( array array1, array array2 [, array …])
Funcția returnează un tablou care conține toate valorile tabloului array1 care nu sunt prezente în nici unul din celelalte argumente; cheile sunt păstrate.
Exemplu:
$array1 = array( "a" => "green", "red", "blue");
$array2 = array( "b" => "green", "yellow", "red");
$result = array_diff( $array1, $array2);
// $result va reprezenta array( "blue")
Functia array_intersect are sintaxa:
array array_intersect( array array1, array array2 [, array …])
Funcția returnează un tablou conținând toate valorile lui array1 care sunt prezente în toate celelalte argumente; cheile sunt păstrate.
Exemplu:
$array1 = array( "a" = > "vert", "rouge", "bleu");
$array2 = array ( "b" = > "vert", "jaune", "rouge");
$result = array_intersect( $array1, $array2);
// $result va reprezenta array( "a" => "vert", "rouge");
Functie array_keys are sintaxa:
array array_keys( array input [, mixed search_value])
Funcția returnează cheile (numerice sau șiruri de caractere) ale tabloului input.
Dacă argumentul search_value este specificat, atunci doar cheile corespunzătoare acestei valori sunt restituite. Altfel se restituie toate cheile.
Exemplu:
$array = array( 0 => 100, "color" => "red");
array_keys ( $array); // Restitue array( 0, "color")
$array = array( "blue", "red", "green", "blue", "blue");
array_keys ( $array, "blue"); // Restitue array( 0, 3, 4)
Functia array_merge:are sintaxa:
array array_merge( array array1, array array2 [, array …])
Funcția concatenează elementele a două sau mai multe tablouri astfel încât elementele unui tablou se adaugă la sfârșitul tabloului precedent. Returnează tabloul obținut.
Dacă tablourile de intrare au aceleași chei tip șir de caractere, atunci ultima valoare a respectivei chei va fi scrisă peste cea precedentă. Dacă, tablourile au chei numerice identice, ultima valoare nu va suprascrie valoarea originală, dar va fi adaugată.
Exemplu:
$array1 = array ( "color" => "red", 2, 4);
$array2 = array ( "a", "b", "color" => "green", "shape" => "trapezoid", 4);
array_merge( $array1, $array2);
Tabloul obținut este:
array( "color" => "green", 2, 4, "a", "b", "shape" => "trapezoid", 4)
Functia array_multisort are sintaxa:
bool array_multisort( array ar1 [, mixed arg [, mixed … [, array …]]])
Funcția poate fi utilizată pentru a sorta mai multe tablouri odată sau un singur tablou multidimensional în funcție de una sau mai multe dimensiuni (criterii de sortare). Sortarea nu afectează cheile asociative.
Tablourile de intrare sunt tratate drept coloanele unui tabel care se sorteaza pe linii. Primul tablou reprezintă criteriul primar de sortare. Valorile din respectivul tablou (situate pe linii) se compară între ele și dacă sunt egale se sortează conform celui de al doilea tablou etc.
Structura argumentelor acestei funcții este puțin neobișnuită, dar flexibilă. Primul argument trebuie să fie obligatoriu un tablou. În continuare, fiecare argument este fie un tablou fie un criteriu de sortare.
Criterii de sortare după ordine:
SORT_ASC
Ordonare în ordine crescătoare;
SORT_DESC
Ordonare în ordine descrescătoare.
Criterii de sortare după tip:
SORT_REGULAR
Comparară valorile normal;
SORT_NUMERIC
Comparară valorile numeric;
SORT_STRING
Comparară valorile ca șiruri de caractere.
Nu se pot specifica două criterii de același tip după un argument. Funcția întoarce TRUE dacă sortarea a reușit și FALSE în caz contrar.
Exemplu (sortarea a mai multor tablouri):
$ar1 = array( "10", 100, 100, "a");
$ar2 = array( 1, 3, "2", 1);
array_multisort( $ar1, $ar2);
În acest exemplu, după sortare, primul tablou conține 10, "a", 100,100. Al doilea conține 1, 1, 2, "3". Intrarea în al doilea tablou corespunde intrărilor identice în primul tablou care au fost deasemenea ordonate.
Exemplu (sortarea tablourilor multidimensionale):
$ar = array( array( "10", 100, 100, "a"), array( 1, 3, "2", 1));
array_multisort( $ar[0], SORT_ASC, SORT_STRING,
$ar[1], SORT_NUMERIC, SORT_DESC);
În acest exemplu, după sortare, primul tablou va conține 10, 100, 100, "a" (a fost sortat ca șiruri de caractere în ordine crescătoare), iar al doilea va conține 1, 3, "2", 1 (sortat ca numere în ordine descrescătoare).
Functia array_pad are sintaxa:
array array_pad( array input, int pad_size, mixed pad_value)
Funcția returnează o copie a tabloului input având dimensiunea specificată prin pad_size și umplut cu valoarea pad_value. Daca argumentul pad_size este pozitiv tabloul este umplut la dreapta, iar dacă este negativ este umplut la stânga. Dacă valoarea absolută a argumentului pad_size este mai mică sau egală cu lungimea tabloului input umplerea nu are loc.
Exemplu:
$input = array( 12, 10, 9);
$result = array_pad( $input, 5, 0); // Tabloul $result conține (12, 10, 9, 0, 0)
$result = array_pad( $input, -7, -1); // Tabloul $result conține (-1, -1, -1, -1, 12, 10, 9)
$result = array_pad( $input, 2, "noop"); // Umplerea nu are loc
Functia array_pop are sintaxa:
mixed array_pop( array array)
Funcția extrage și returnează ultimul element din tabloul array și micșorează dimensiunea tabloului cu o unitate.
Exemplu:
$my_list = array( "orange", "apple", "raspberry");
$fruit = array_pop( $my_list);
/* În acest moment $my_list are doar 2 elemente: "orange" și "apple";
$fruit are "raspberry" */
Functia array_push: are sintaxa:
int array_push( array array, mixed var [, mixed …])
Funcția tratează tabloul ca pe o coadă și introduce valorile primite ca argumente la sfârșitul tabloului. Lungimea tabloului crește cu numărul de variabile introduse. Are același efect ca și instrucțiunea:
$array[] = $var;
repetată pentru fiecare $var.
Exemplu:
$queue = array( 1, 2);
array_push( $queue, "+", 3);
// Tabloul $queue va conține: 1, 2, "+" și 3
Funcția returnează noul număr de elemente din tablou.
Functia array_reverse are sintaxa:
array array_revers( array array [, bool preserve_keys])
Funcția returnează un nou tablou care conține elementele tabloului array în ordine inversă.
Exemplu:
$input = array( "php", 4.0, array( "green", "red"));
$result = array_reverse( $input);
// Tabloul $result va conține ( array( "green", "red"), 4.0, "php")
Notă: funcția nu modifiă cheile tabloului dacă argumentul preserve_key este TRUE.
Functia array_shift :are sintaxa:
mixed array_shift( array array)
Funcția extrage și returnează primul element din tabloul array, mută elementele cu o poziție spre stânga și reduce dimensiunea tabloului cu 1.
Exemplu:
$args = array( "-v", "-f");
$opt = array_shift( $args);
/* Tabloul $argc va conține elementul "-f";
variabila $opt va fi "-v" */
Functia array_slice are sintaxa:
array array_splice( array input, int offset [, int length [, array replacement]])
Funcția extrage o porțiune dintr-un tablou; returnează secvența elementelor din argumentul input specificată prin parametrii offset și length.
Dacă offset este pozitiv, secvența va începe la acea poziție din tablou. Dacă offsset este negativ, secvența va începe la aceea poziție față de sfârșitul tabloului.
Dacă length este precizat și este pozitiv, atunci secvența va avea length elemente. Dacă length este precizat și este negativ, atunci secvența se va opri la length elemente față de sfârșitul tabloului. Dacă length lipsește secvența va conține toate elementele începând de la poziția offset până la sfârșitul tabloului.
Exemplu:
$input = array( "a", "b", "c", "d", "e");
$output = array_slice( $input, 2); // Returnează "c", "d" și "e"
$output = array_slice( $input, 2, -1); // Returnează "c" și "d"
$output = array_slice( $input, -2, 1); // Returnează "d"
$output = array_slice( $input, 0, 3); // Returnează "a", "b" și "c"
Functia array_sum are sintaxa:
mixed array_sum( array arr)
Funcția calculează și returnează suma elementelor din tabloul arr ca un număr întreg sau float.
Functia array_unique are sintaxa:
array array_unique( array array)
Funcția elimină valorile duplicate din tablou; returnează un tablou nou care nu conține valori duplicate; cheile nu se modifică.
Exemplu:
$input = array( "a" => "green", "red", "b" => "green", "blue", "red");
$result = array_unique( $input);
// Tabloul $result conține ( "a" => "green", "red", "blue")
Functia array_unshift are sintaxa:
int array_unshift( array array, mixed var [, mixed …])
Funcția inserează valorile specificate în listă la începutul tabloului array în aceeași ordine. Valorile inițiale sunt deplasate spre dreapta și dimensiunea tabloului crește cu numărul valorilor introduse; returnează noua dimensiune a tabloului.
Exemplu:
$stack = array( "p1", "p3");
array_unshift( $stack, "p4", "p5", "p6");
// Tabloul $stack va conține: "p4", "p5", "p6", "p1" și "p3"
Functia array_values are sintaxa:
array array_values( array input)
Funcția returnează toate valorile din tabloul input.
Exemplu:
$tshirt = array( "size" => "XL", "color" => "gold");
array_values( $tshirt); // Returnează array( "XL", "gold")
Functia arsort are sintaxa:
void arsort( array array [, int sort_flags])
Funcția sortează descrescător tabloul array astfel încât legăturile dintre indicii asociativi și valorile indicate de către aceștia să se mențină. Veți folosi această funcție pentru a sorta tablouri asociative în care ordinea actuală a elementelor este importantă.
Exemplu:
$fruits = array( "d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
arsort( $fruits);
reset( $fruits);
while( list( $key, $val) = each( $fruits))
{
echo "$key = $val\n";
}
Se va obține:
fruits[a] = orange
fruits[d] = lemon
fruits[b] = banana
fruits[c] = apple
Fructele au fost sortate în ordine alfabetică descrescătoare păstrând legătura dintre indec7#351;ii asociativi și elemente.
Functia asort are sintaxa:
void asort( array array [, int sort_flags]))
Funcția sortează crescător tabloul array astfel încât legăturile dintre indicii asociativi și valorile indicate de către aceștia să se mențină. Veți folosi această funcție pentru a sorta tablouri asociative în care ordinea actuală a elementelor este importantă.
Exemplu:
$fruits = array( "d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
arsort( $fruits);
reset( $fruits);
while( list( $key, $val) = each( $fruits))
{
echo "$key = $val\n";
}
Fructele au fost aranjate în ordine alfabetică păstrând legătura dintre indec7#351;ii asociativi și elemente. Exemplul de mai sus va furniza rezultatul:
fruits[c] = apple
fruits[b] = banana
fruits[d] = lemon
fruits[a] = orange
Functia count are sintaxa:
int count( mixed var)
Funcția returnează numărul de elemente din argumentul var, care este de obicei un tablou. Întoarce 1 dacă variabila nu este un tablou și 0 dacă variabila nu a fost inițializată.
Exemplu:
$a [0] = 1;
$a [1] = 3;
$a [2] = 5;
$result = count( $a); // $result == 3
Functia each are sintaxa:
array each( array array)
Funcția returnează cheia curentă și valoarea corespunzătoare din tabloul array și avansează pointerul tabloului. Această pereche de valori este returnată într-un tablou cu 4 elemente, cu cheile 0, 1, key și value. Elementele 0 și key conțin numele elementului din tablou, iar 1 și value conțin valoarea.
Dacă s-a ajuns la sfârșitul tabloului funcția each() returnează FALSE.
Exemplu:
$my_list = array( "bob", "fred", "jussi", "jouni", "egon", "marliese");
$bar = each( $my_list);
Variabila $bar va conține conține următoarele perechi key/value:
0 => 0
1 => 'bob'
key => 0
value => 'bob'
$my_list = array( "Robert" => "Bob", "Seppo" => "Sepi");
$bar = each( $my_list);
Variabila $bar va conține conține următoarele perechi key/value:
0 => 'Robert'
1 => 'Bob'
key => 'Robert'
value => 'Bob'
Funcția each() este utilizată în conjuctură cu funcția list() pentru a traversa un tablou, de exemplu $HTTP_POST_VARS:
echo "Valorile trasmise via POST:<br>";
reset( $HTTP_POST_VARS);
while( list( $key, $val) = each( $HTTP_POST_VARS))
{
echo "$key => $val<br>";
}
Functia end are sintaxa:
end( array array)
Funcția poziționează poinerul intern al tabloului pe ultimul element.
Functia in_array are sintaxa:
bool in_array( mixed needle, array haystack)
Funcția caută valoarea needl în tabloul haystack și întoarce TRUE dacă o găsește și FALSE în caz contrar.
Exemplu:
$os = array( "Mac", "NT", "Linux", "OS/2");
if( in_array( "Linux", $os))
print "Got Linux";
Functia key are sintaxa:
mixed key( array array)
Funcția întoarce indicele elementului corespunzător poziției curente în tablou.
4.Aplicația-agendă telefonică online
Lucrarea practica priveste realizarea unui program care sa arate modul de interacționare a celor două materiale software prezentate mai sus, și anume o agenda telefonică ce ar putea fi înglobată într-un site, beneficiind de toate atributele server-ului MySql și ale limbajului Php.
Sunt gestionate trei baze date, din care una este folosită doar pentru detinerea denumirii județelor, ale prefixelor acestora.Datorita lipsei modificărilor nu este necesară actualizarea acesteia. Tabela poarta numele judet și are urmatoarea structura:
A doua tabela folosita este cea care conține abonații și aceasta beneficiază de moalități de actualizare, deasemenea este supusă la modalitați de cautare a abonaților. Se va considera, deși nu se specifică, numărul de telefon este cheie pentru abonat, neputînd exista doi abonați cu același număr de telefon.Are următoarea structură:
A treia tabela este cea care conține localitățile.Beneficiază de actualizări, se consideră codul poștal al localități ca fiind cheie. Are următoarea structură:
Toate operațiile se realizează foarte ușor avînd modalitatea de lansarea în execuție din butoane aflate in ferestre ale browser-ului, știindu-se interferența cu limbajul Html.
Prima pagina oferă legături spre toate operațiile principale care la rândul lor sunt și ele distribuite în fișiere apelabile.
Conectarea la baze se face în fișierul connect.php care va fi inclus în orice fișier ce necesită deschiderea tabelelor pentru eventuale operații.De aceea shimbarea server-ului este
realizabilă mult mai ușor pentru că modificările de user, parolă și bază sunt efectuate doar aici și vor fii aplicate peste tot unde este inclus fișierul.
<?
$mysql_host= "localhost"; //serverul mySql
$mysql_user= "nycky"; // utilizatorul
$mysql_pass= "eu"; // parola
$baza = "agenda"; //baza de date
mysql_connect($mysql_host,$mysql_user,$mysql_pass);
@mysql_select_db("$baza") or die("Nu pot sa selectez baza de date .");
?>
Începem cu prima operație din prima pagină și anume de căutare a abonatului. Acest se realizează prin următoarea interfață:
După cum reiese cautarea se va face după numele abonatului și numărul de telefon al acestuia, mai exact după caracterele introduse, minimul fiind de un caracter.Fișierul care realizează acest lucru, după ce în prealabil a preluat datele necesare cautării, are structura:
<HTML>
<HEAD>
<title>Cautare abonat</title>
</HEAD>
<body bgcolor="#B0C4DE" >
<BODY>
<center><H2>Cautare abonat dupa numar</H2></center>
<?
include("connect.php");
if (strlen($nn)>0){
$sql1="SELECT * FROM abonati,localitate where abonati.fix LIKE '"."$nn".'%'."' and localitate.codloc=abonati.codlocalitate" ;
$resursa1=mysql_query($sql1);
$nr1=mysql_num_rows($resursa1);
$s=$nn;
$perpage1=2;
if($nr1>$perpage1){
$nrpage1=$nr1/$perpage1;
print "<p><center><H2>Au fost gasite ".$nr1." inregistrari</H2></center>";
$j=0;$t=0;
for($i=0;$i<$nrpage1;$i++)
{$j=$i+1;
print "<br><p><center><strong><big><i><a href=cautanumar2.php?acata=".$t."&cate=2&numar=".$s.">".$j."</a></i></big></strong></center>";
$t=$t+$perpage1;
}
}
else{
if($nr1>0){
$sql2="SELECT * FROM abonati, localitate,judet WHERE abonati.fix LIKE '"."$nn".'%'."' and abonati.codlocalitate=localitate.codloc and localitate.judet=judet.den";
$resursa2=mysql_query($sql2);
print "<table rules=none>";
print "<tr><th bgcolor=#808080>Numele</th><th bgcolor=#808080>Prefix</th><th bgcolor=#808080>Numar</th><th bgcolor=#808080>Judet</th>
<th bgcolor=#808080>Localitate</th><th bgcolor=#808080>Strada</th><th bgcolor=#808080>Numar</th><th bgcolor=#808080>Bloc</th>
<th bgcolor=#808080>Scara</th><th bgcolor=#808080>Apartament</th><th bgcolor=#808080>Cod localitate</th>";
while($row1=mysql_fetch_array($resursa2)){
print "<tr><td bgcolor=#c0c0c0>".$row1['Nume']."</td><td bgcolor=#c0c0c0>".$row1['prefix']."</td><td bgcolor=#c0c0c0>"
.$row1['fix']."</td><td bgcolor=#c0c0c0>".$row1['judet']."</td><td bgcolor=#c0c0c0>".$row1['numeloc']."</td><td bgcolor=#c0c0c0>"
.$row1['Strada']."</td><td bgcolor=#c0c0c0>".$row1['Numarul']."</td><td bgcolor=#c0c0c0>".$row1['Bloc']."</td><td bgcolor=#c0c0c0>"
.$row1['Scara']."</td><td bgcolor=#c0c0c0>".$row1['Apartament']."</td><td bgcolor=#c0c0c0>".$row1['codloc']."</td>";
}}else{ print "<p><center><H2>Inregistrare nexistenta</H2></center>";}
print "</table>";}
}
else
print "Nu ati introdus numarul de telefon pentru cautare";
?>
<form>
<center><input type="button" value="Inapoi" onClick="history.go(-1)"></center>
</form>
</body>
</html>
Variabila $sql1 este un șir de caractere care cu ajutorul funcției mysql_query()este aplicată tabelei. Funcția mysql_num_rows() returnează numrul de înregistrări găsite.
Afișarea se va face pe mai multe pagini după cum urmează:
Se va face cautarea tuturor abonaților din localitate Vânju Mare din județul Mehedinți al căror nume începe cu grupul de caractere ‘buc’. Acest lucru este posibil prin apelarea interogări:
$sql1="SELECT * FROM abonati,localitate where abonati.nume LIKE '"."$nn".'%'."' and localitate.codloc=abonati.codlocalitate" ;
$resursa1=mysql_query($sql1);
Această interogare este adresată pentru cautarea după câmpul numelui. Dar în exemplu deasupra imaginii este prezentată căutarea după numărul de telefon. Afișarea rezultatului căutării este vizualizat pe mai multe pagini în funție de câte înregistrări se dorește(în cazul nostru două).
Vizualizarea înregistrărilor este:
Perpetuarea variabilelor spre un alt fișier care să realizeze afișarea pe pagini se face prin linia de program:
– print "<br><p><center><strong><big><i><a href=cautanumar2.php?acata=". $t . "&cate=2 &numar=".$s.">".$j."</a></i></big></strong></center>";
spre fișierul cautanumar2.php cu parametrii cate și acata și numar necesari pentru a asigura în totalitate necesarul unei noi interogări ce urmează a fi aplicate petru afișare.
În cazul localităților s-a considerat impropriu căutare lor după primele caractere ale denumirii acesteia ci doar după tot numele acesteia și județ, și de aceea nu se consideră necesară afișarea pe mai multe pagini, deasemenea căutarea ei este necesară doar in cazul efectuării de actualizări.
Actualizarea tabele de abonați este realizată și ea deasemenea printr-o suită de fișiere fiind necesară deasemenea validarea datelor care se introduc.Caseta cu valorile de adăugare arată astfel:
Câmpurile însemnate cu * nu pot fi vide. Interogarea care face posibilă adăugare este: $sql="INSERT INTO abonati VALUES ('$vcod', '$vnume' , '$vstr' ,'$vnr' , '$vbloc' , '$vsc','$vap','$vfix')";
Desigur are loc o verificare a existenței deja a noi înregistrări, în bază.
Modificarea și ștergerea se fac după o căutare în prealabil, identică cu cea prezentată mai de sus.
Interogările corespunzătoare sunt:
-pentru modificare:
$sql="UPDATE abonati set codlocalitate='$vcodm',nume='$vnumem', strada = '$vstrm' , numarul='$vnrm',bloc ='$vblocm', scara= '$vsc' , apartament = '$vapm',fix='$vfixm' where fix=".$fixx." ";
-pentru ștergere:
$sql="DELETE FROM abonati WHERE fix="."'$xx'";
Bibliografie
Stig Sæther, Bakken ,Alexander Aulbach, Egon Schmid, Jim Winstead,
Lars Torben Wilson ,Rasmus Lerdorf , Andrei Zmievski , Jouni Ahto
Manual Php
Jay Greenspan și Brad Bulger
MySql/Php Databases Applications
Oana Săulescu
Chip Special.
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: 1. MYSQL-prezentare generală (ID: 149311)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
