0% au considerat acest document util (0 voturi)
137 vizualizări

PHP MySQL

Documentul prezintă o introducere în utilizarea MySQL cu PHP. Explică tipurile de date MySQL și regulile de sintaxă, apoi prezintă modul de conectare la baza de date MySQL folosind extensia MySQLi din PHP.

Încărcat de

martaneli8557
Drepturi de autor
© © All Rights Reserved
Formate disponibile
Descărcați ca DOC, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
137 vizualizări

PHP MySQL

Documentul prezintă o introducere în utilizarea MySQL cu PHP. Explică tipurile de date MySQL și regulile de sintaxă, apoi prezintă modul de conectare la baza de date MySQL folosind extensia MySQLi din PHP.

Încărcat de

martaneli8557
Drepturi de autor
© © All Rights Reserved
Formate disponibile
Descărcați ca DOC, PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 89

PHP MySQL - Introducere si Tipuri de Date

MySQL este cea mai populara aplicatie open-source de baze de date folosita
cu PHP.
O baza de date de obicei contine una sau mai multe tabele, folosita pentru a
stoca informatii pe categori.
Tabelele contin coloane si inregistrari (randuri) cu date.
Mai jos este un exemplu de tabel folosit pentru a stoca informatiile
utilizatorului (nume, email, parola):

id name password email


1 Marius faith [email protected]
2 MarPlo peace [email protected]
3 I_AM love [email protected]
- Aceasta tabela contine trei inregistrari /randuri (unu pentru fiecare
persoana/utilizator) si patru coloane (id, name, password, email)
Reguli de sintaxa MySQL
Fiecare baza de date si fiecare tabela este indentificata printr-un nume.
Regulile de baza MySQL pentru nume de baze de date, tabele, si coloane
sunt:
Numele poate avea maxim 64 de caractere.
Poate contine numai litere, numere, si sublinia (indicat fara spatii).
Numele poate incepe cu un numar, dar nu poate contine numai numere.
O tabela nu poate avea doua coloane cu acelasi nume si o baza de date
nu poate avea doua tabele cu acelasi nume.
Numele tabelelor si coloanelor sunt case-sensitive ("Php" e diferit de
"php").

Tipuri de date MySQL


Cand se creaza un tabel in MySQL, trebuie definit tipul de date pe care fiecare
coloana il va contine. Exista trei tipuri principale: Text
(strings),Numere, Data si Ora; si doua tipuri secundare: Liste
predefinite si Date binare.
Tipul de date dicteaza ce informatie poate fi stocata si cum, acesta
influenteaza si performanta generala a bazei de date.
Tabelul de mai jos listeaza tipurile de date folosite pentru MySQL, cu o scurta
descriere si cat spatiu ocupa.

Marim
Tip Descriere
e
Diferenta dintre "Tipurile de date pentru text" consta in
numarul maxim de caractere ce poate fi stocat intr-un
Stocare text
camp individual, modul de tratare a spatiilor, si daca se
poate seta o valoare initiala.
Marim
Tip Descriere
e
lungime Un camp cu lungime fixa de la 0 la 255 de
CHAR(lungime)
bytes caractere. Accepta o valoare initiala.
lungime
VARCHAR(lungime Camp cu lungime variabila de la 0 la 65,535
+ 1 or 2
) caractere. Accepta o valoare initiala.
bytes
lungime
TINYTEXT +1 Un sir cu lungime maxima de 255 characters
bytes
lungime
Un sir cu o lungime maxima de 65,535 caractere.
TEXT +2
Nu poate defini o valoare initiala.
bytes
lungime
Un sir cu o lungime maxima de 16,777,215
MEDIUMTEXT +3
caractere
bytes
lungime
Un sir cu o lungime maxima de 4,294,967,295
LONGTEXT +4
caractere
bytes
Stocare numere Aceste tipuri de date reprezinta numere in diferite forme.
Interval de la 128 la 127. Sau de la 0 la 255
TINYINT(lungime) 1 byte
unsigned
SMALLINT(lungime Interval de la 32,768 la 32,767. Sau de la 0 la
2 bytes
) 65,535 unsigned
MEDIUMINT(lungi Interval de la 8,388,608 la 8,388,607. Sau de la
3 bytes
me) 0 la 16,777,215 unsigned
Interval de la 2,147,483,648 la 2,147,483,647.
INT(lungime) 4 bytes Daca coloana este declarata UNSIGNED, intervalul
este de la 0 la 4,294,967,295
Interval de la 9,223,372,036,854,775,808 la
BIGINT(lungime) 8 bytes 9,223,372,036,854,775,807. Sau de la 0 la
18,446,744,073,709,551,615 unsigned
Numar mic cu virgula (cu zecimale). Deoarece
FLOAT(lungime, PHP va formata numerele in functie de calcule, se
4 bytes
decimals) recomanda sa folosesti FLOAT fara parametri
optionali.
DOUBLE(lungime,
8 bytes Numar mare cu zecimale
decimals)
Un tip DOUBLE care permite un numar fix de
lungime
DECIMAL(lungime, zecimale. Inainte de MySQL 5.0.3, tipul de date
+ 1 or 2
decimals) DECIMAL a fost stocat ca un sir, ca sa nu poata fi
bytes
folosit cu functii SQL, cum ar fi SUM()
Marim
Tip Descriere
e
Stocare data si MySQL stocheaza data intr-un singur format: YYYY-MM-
timp DD
O data stocata ca YYYY-MM-DD. Intervalul este de
DATE 3 bytes
la 1000-01-01 la 9999-12-31
Data si ora, afisat in format YYYY-MM-DD
DATETIME 8 bytes
HH:MM:SS
Un timestamp (de obicei generat automat de
calculator). Poate contine valori ce reprezinta
TIMESTAMP 4 bytes date de la inceputul lui 1970 pana in Januarie
2038. Coloanele TIMESTAMP sunt afisate in
acelasi format ca si coloana DATETIME.
TIME 3 bytes Ora in format HH:MM:SS
MySQL te lasa sa stochezi doua tipuri de liste predefinite
Stocare liste
(pot fi vazute ca echivalente pentru radio butonul si caseta
predefite
de verificare).
Acest tip de coloana stocheaza o singura alegere
1 or 2
ENUM din lista predefinita, fiecare coloana poate avea
bytes
una din mai multe valori posibile
Aceast tip de coloana stocheaza zero sau mai
multe inregistrari din lista predefinita. Ca si
1, 2, 3, ENUM, cu exceptia ca fiecare coloana poate avea
SET 4, or 8 mai mult de o valoare din mai multe valori
bytes posibile, sau mai multe inregistrari dintr-o lista
predefinita. Lista poate contine cel mult 64 de
inregistrari.
Storing binary
Stocheaza date binare, ca imaginile.
data
TINYBLOB Pana la 255 bytes
BLOB Pana la 64kB
MEDIUMBLOB Pana la 16MB
LONGBLOB Pana la 4GB

- Parametri (lungime, decimal) sunt optionali, dar pentru motive de


performanta, ar trebui specificati pentru a restrictiona cata informatie sa fie
stocata in oricare din coloane. Bazele de date sunt de obicei mai rapide cand
lucreaza cu coloane care au marimea fixata.
- Foloseste VARCHAR pentru elemente de text scurte si TEXT pentru cele mai
lungi.
- Foloseste DECIMAL pentru a stoca valori pt. bani.
- Pentru data si ora, este indicat sa folositi TIMESTAMP daca doriti sa
inregistrati in acel camp un punct fix in timp (de exemplu data cand o
inregistrare a fost introdusa in baza de date). Folositi DATETIME daca data/ora
pot fi setate si schimbate arbitrar.
La tipul TIMESTAMP data si ora este setata automat cu timpul curent cand se
face INSERT sau UPDATE, daca nu se specifica o valoare pentru acel camp.
- Nu este o buna idee sa folosesti date binare. Solicita prea mult baza de
date, si nu se pot afisa imagini direct din baza de date.

Aceasta lectie e doar pentru o scurta introducere, si puteti reveni ca sa


verificati tipul de date care doriti sa fie folosit.
In tutorialul urmator puteti invata cum sa va conectati la serverul MySQL cu
PHP, sa creati o baza de date si tabele, utilizand interfata MySQLi (MySQL
Improved).

PHP MySQL - utilizare MySQLi


PHP are trei moduri diferite prin care se poate conecta si interactiona cu
baza de date MySQL : extensia MySQL originala (cu functii), MySQL
Improved (MySQLi, obiect-orientat), sau PHP Data Objects (PDO, obiect-
orientat).
Ele nu pot fi amestecate in acelasi script. Extensia originala MySQL nu mai
este activ dezvoltata si nu este recomandat pentru proiecte PHP-MySQL noi.
Documentatia PHP descrie MySQLi ca fiind optiunea preferata recomandata
de MySQL pentru proiecte noi.
Conectare la MySQL
Inainte de a putea accesa informatii din baza de date , trebuie creata o
conexiune cu serverul MySQL.
Pentru a va conecta la un server MySQL cu PHP si MySQLi, se creaza
o instanta de obiect mysqli, cu formula new mysqli(), la care se adauga
datele de conectare.
- Sintaxa:
$conn = new mysqli($servername, $username, $password, $database,
$port);

- $servername - Specifica serverul la care sa se conecteze. Daca adaugati


valoarea NULL sau un sir gol "", serverul va folosi valoarea standard:
"localhost".
- $username - Specifica numele de utilizator la baza de date MySQL.
- $password - Specifica parola utilizatorului pentru conectare.
- $database - Optional. Numele bazei de date care contine tabelele.
- $port - Optional. Specifica port-ul prin care se face conectarea la serverul
MySQL, standard este 3306
- Exemplu:
<?php
// conectare la server
$conn = new mysqli('localhost', 'root', 'pass', 'dbname');

// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
?>

- Aceast cod face conectarea la baza de date numita "dbname", si stocheaza


conexiunea in instanta de obiect $conn.
Daca exista erori la conexiune, mysqli_connect_errno() returneaza codul de
eroare.
Inchiderea unei conexiuni
Conexiunea va fi inchisa automat cand scriptul se termina. Se recomanda
totusi sa inchideti conexiunea mai devreme, cand scriptul nu o mai foloseste.
Acest lucru va elibera memoria folosita de conexiune. Pentru a inchide o
conexiune se foloseste metoda close() din clasa MySQLi.
- Exemplu:
<?php
// conectare la server
$conn = new mysqli('localhost', 'root', 'pass', 'dbname');

// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}

// ceva cod

$conn->close(); // termina conectarea

// alt cod PHP


?>

Creare baza de date cu MySQLi


Pentru a stoca informatii in MySQL, este nevoie de o baza de date.
Comanda CREATE DATABASE este folosita pentru a crea o baza de date in
MySQL.
- Sintaxa:
CREATE DATABASE database_name
Pentru a face un script PHP sa execute instructiunile SQL, mai intai trebuie sa
creati o instanta de obiect mysqli, care va contine conexiunea la server, apoi
folositi metoda query() din clasa MySQLi.
- Sintaxa:
mysqliObj->query($sql_query)
- mysqliObj - este instanta de obiect mysqli, creata cu new mysqli()
- $sql_query - este un sir cu instructiuni SQL.
Aceasta metoda trimite interogarea sau comanda la serverul MySQL, va
returna obiectul rezultat, sau TRUE la succes, FALSE in caz de eroare.

Exemplul urmator creaza o baza de date numita "tests":


<?php
// conectare la serverul MySQL
$conn = new mysqli('localhost', 'root', 'pass');

// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Conectare nereusita: '. mysqli_connect_error());
}

// interogare sql cu CREATE DATABASE


$sql = "CREATE DATABASE `tests` DEFAULT CHARACTER SET utf8 COLLATE
utf8_general_ci";

// executa interogarea $sql pe server pentru a crea baza de date


if ($conn->query($sql) === TRUE) {
echo 'Baza de date "tests" a fost creata';
}
else {
echo 'Error: '. $conn->error;
}

$conn->close();
?>

- Cand doriti sa creati o noua baza de date, se adauga doar primele trei
argumente la obiectul mysqli (servername, username si password). Dar daca
vreti sa folosesti un port specific, adaugati un sir gol "" pentru argumentul ce
reprezinta numele bazei de date :
Exemplu: new mysqli('localhost', 'root', 'pass', '', port)

- Instructiunea suplimentara: DEFAULT CHARACTER SET utf8 COLLATE


utf8_general_ci seteaza baza de date sa foloseasca UTF-8 charset pentru
codarea caracterelor.
Exemplul de mai sus creaza o baza de date numita "test", afisaza "Baza de
date "tests" a fost creata", sau un mesaj de eroare in caz de esec.
$conn->error (sau poate fi folosit mysqli_error($conn) ) returneaza un sir cu o
descriere a ultimei erori(daca exista).
Comenzile SQL sunt case-insensitive, astfel puteti folosi "CREATE DATABASE" sau "create
database". Dar numele tabelelor si coloanelor sunt case-sensitive.

Creare tabel in MySQL


Dupa ce ati realizat o conexiune la o baza de date, puteti crea tabele in ea.
Tabelele sunt elementele care stocheaza datele in baza de date.
Pentru a crea un tabel in MySQL, se foloseste comanda CREATE TABLE, apoi
se apeleaza metoda query().
- Sintaxa:
CREATE TABLE `table_name`
(
`nume_coloana1` tip_date,
`nume_coloana2` tip_date,
`nume_coloana3` tip_date,
....
)

- tip_date specifica tipul de date pe care o coloana le poate contine. Pentru o


lista cu tipurile de date MySQL, vedeti lectia precedenta: PHP MySQL -
Introducere si Tipuri de date.
Dupa "tip_date", se pot specifica si alte atribute optionale pentru fiecare
coloana:
NOT NULL - Fiecare rand trebuie sa contina o valoare in acea coloana,
valorile null nu sunt permise.
DEFAULT value - Seteaza o valoare initiala care este adaugata cand nici o
alta valoare nu este transferata
UNSIGNED - Poate fi folosit pentru numere, seteaza sa fie folosite doar
numere pozitive si zero.
AUTO INCREMENT - MySQL va mari automat valoarea din randul urmator
cu 1 de fiecare data cand o noua inregistrare este adaugata.
PRIMARY KEY - Este folosit pentru a identifica unic randurile dintr-un
tabel. Coloana cu setarea PRIMARY KEY este de obicei un ID numeric, si
in general folosita cu AUTO_INCREMENT

Fiecare tabel ar trebui sa aiba o coloana primary key. Valoarea ei trebuie sa


fie unica pentru fiecare inregistrare din tabel.

- Exemplu:
<?php
// conectare la serverul MySQL
$conn = new mysqli('localhost', 'root', 'pass', 'tests');

// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}

// interogare sql pentru CREATE TABLE


$sql = "CREATE TABLE `users` (
`id` INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(25) NOT NULL,
`pass` VARCHAR(18) NOT NULL,
`email` VARCHAR(45),
`reg_date` TIMESTAMP
) CHARACTER SET utf8 COLLATE utf8_general_ci";

// Executa interogarea $sql query pe server pentru a crea tabelul


if ($conn->query($sql) === TRUE) {
echo 'Table "users" successfully created';
}
else {
echo 'Error: '. $conn->error;
}

$conn->close();
?>

- Acest cod va crea un tabel numic "users" in baza de date "tests", cu


cinci coloane (id , name , pass , email si reg_date), seteaza coloana 'id'
ca campul primary key.
In imaginea de mai jos puteti vedea descrierea tabelului "users".

PHP MySQL - INSERT INTO


Dupa ce o baza de date si tabelele ei au fost create, puteti sa adaugati
informatii in ele.
Cateva reguli de sintaxa:
In PHP, interogarea SQL trebuie sa fie scrisa intre ghilimele.
Valorile de tip String (sir), din interogarea SQL, trebuie sa fie intotdeauna
intre ghilimele.
Valorile numerice si NULL nu trebuie adaugate intre ghilimele.

Introducere date in tabel MySQL


Pentru a adauga inregistrari noi intr-un tabel MySQL, se foloseste
comanda INSERT INTO.
Exista doua metode prin care o interogare INSERT poate fi scrisa:
1) Prima metoda nu specifica numele coloanelor unde datele for fi introduse,
ci doar valorile lor.
- Sintaxa:
INSERT INTO nume_tabel
VALUES (valoare1, valoare2, valoare3, ...)
In aceasta metoda, trebuie sa specificati o valoare pentru fiecare coloana,
chiar daca este NULL. Daca sunt cinci coloane in tabel, trebuie sa adaugati
cinci valori, separate prin virgula.

2) Pentru a doua metoda se specifica atat numele coloanei /coloanelor cat si


valorile care vor fi intoduse:
- Sintaxa:
INSERT INTO nume_tabel (coloana1, coloana2, coloana3,...)
VALUES (valoare1, valoare2, valoare3,...)
Aceasta este in general metoda preferata, deoarece puteti adauga doar
coloanele care vor primi valori. Orice coloana caruia nu ii este atribuita o
valoare va fi tratata ca NULL (sau ii va fi data valoarea default, daca aceasta
este definita).
Daca o coloana nu poate avea valoarea NULL (a fost definita ca NOT NULL) si
nu are o valoare default, nespecificand o valoare va genera eroare.
Daca o coloana este AUTO_INCREMENT sau TIMESTAMP, nu este nevoie sa fie
specificata in interogarea SQL, serverul MySQL va seta si adauga valoarea
automat.
Pentru ca PHP sa execute comenzile SQL, trebuie sa folosesti metoda
mysqli query() .

- Urmatorul exemplu adauga o noua inregistrare in tabelul "users" . Acest


exemplu foloseste tabelul "users" creat in lectia anterioara, cu cinci coloane
(id , name , pass , email si reg_date).
Campul "id" este AUTO_INCREMENT, deci nu trebuie specificat in interogarea
SQL, serverul MySQL va adauga automat valoare pentru el. La fel si pentru
"reg_date", care este setat TIMESTAMP.
<?php
// conectare la baza de date "tests"
$conn = new mysqli('localhost', 'root', 'pass', 'tests');

// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}

// interogare sql pentru users INSERT INTO


$sql = "INSERT INTO `users` (`name`, `pass`, `email`)
VALUES ('Marius', 'faith', '[email protected]')";

// Trimite interogarea $sql la MySQL pentru a introduce valorile


if ($conn->query($sql) === TRUE) {
echo 'Datele au fost adaugate';
}
else {
echo 'Error: '. $conn->error;
}

$conn->close();
?>

- Mai intai se creaza instanta de obiect mysql cu identificatorul de variabila


$conn. Apoi, se defineste sirul cu instructiunea SQL, salvat intr-o variabila
numita $sql. Apoi se apeleaza metoda query() , si in acelasi timp se verifica
valoarea returnata pentru a determina daca datele au fost adaugate.
Exemplul de mai sus adauga un rand in tabelul "users", cu valoarea "Marius"
in coloana "name", valoarea "faith" in campul "pass", si "[email protected]"
pentru "email". Valorile pentru celelalte coloane ("id" si "reg_date") sunt
adaugate automat de serverul MySQL.

MySQL permite INSERT cu mai multor randuri in acelasi timp, separate prin
virgula.
- Sintaxa:
INSERT INTO nume_tabel (coloana1, coloana2, coloana3,...)
VALUES (valoareA1, valoareA2, valoareA3,...),
(valoareB1, valoareB2, valoareB3,...),
(valoareC1, valoareC2, valoareC3,...)

Exemplu urmator adauga doua noi randuri in tabelul "users", cu o singura


interogare.
<?php
// conectare la baza de date "tests"
$conn = new mysqli('localhost', 'root', '', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}

// interogare sql pentru users, INSERT INTO (doua randuri)


$sql = "INSERT INTO `users` (`name`, `pass`, `email`)
VALUES ('MarPlo', 'peace', '[email protected]'),
('I_AM', 'love', '[email protected]')";

// Trimite interogarea $sql la MySQL pentru a introduce valorile


if ($conn->query($sql) === TRUE) {
echo 'Datele au fost adaugate';
}
else {
echo 'Error: '. $conn->error;
}

$conn->close();
?>

Obtinere ID, auto generat de INSERT


Daca aveti un tabel cu o coloana AUTO_INCREMENT care stocheaza un id
numeric, puteti folosi metoda insert_id() a obiectului mysqli pentru a prelua
ID-ul generat in ultima operatiune INSERT.
- Exemplu:
<?php
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', 'pass', 'tests');

// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}

// interogare sql pentru users, INSERT INTO


$sql = "INSERT INTO `users` (`name`, `pass`, `email`)
VALUES ('PloMar ', 'love_light', '[email protected]')";

// Executa interogarea $sql pentru a prelua ID auto-generat


if ($conn->query($sql) === TRUE) {
echo 'ID-ul este: '. $conn->insert_id;
}
else {
echo 'Error: '. $conn->error;
}

$conn->close();
?>

Returneaza:
ID-ul este 4
Daca tabelul nu are o coloana cu atributul AUTO_INCREMENT sau daca interogarea nu
este o comanda INSERT sau UPDATE, insert_id() va returna zero.

Adaugare date din formular in baza de date


Formularele HTML sunt de obicei folosite pentru a trimite date la un script pe
server. Aceste date pot fi adaugate si intr-o baza de date.
Pentru a introduce date dintr-un formular intr-o baza de date MySQL, trebuie
creat un formular HTML si un script PHP care receptioneaza date din formular.

Exemplu de formular HTML si un script PHP care poate fi folosit pentru a


adauga valorile din formular in tabelul "users".

Formularul HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Formular HTML pentru insert users</title>
</head>
<body>

<form action="insert.php" method="post">


Name: <input type="text" name="name" /><br />
Password: <input type="text" name="pass" /><br />
E-mail: <input type="text" name="email" /><br />
<input type="submit" valoare="Trimite" />
</form>

</body>
</html>
Cand un utilizator apasa pe butonul "Trimite", datele din formular sunt trimise
la scriptul din fisierul "insert.php".
Fisierul "insert.php":
- preia valorile din formular cu variabila $_POST,
- filtreaza aceste valori cu functii strip_tags() si trim() (pentru a sterge
posibile tag-uri si spatii goale de la inceput si sfarsit),
- foloseste un tipar RegExp si functia preg_match() pentru a verifica daca
valoarea de la "email" e o adresa de email corecta,
- daca toate datele sunt corecte, se face conectarea la o baza de date (cu
instanta mysqli), stocheaza valorile intr-un Array asociativ ($adds), si le
filtreaza cu metoda mysqli_real_escape_string(),
- seteaza comanda INSERT INTO , apoi, metoda query() trimite interogarea
SQL la serverul MySQL si o noua inregistrare va fi adaugata in tabelul "users".

Cod PHP in pagina "insert.php"


<?php
$erors = array(); // seteaza un array gol care va contine erorile
$regexp_mail = '/^([a-zA-Z0-9]+[a-zA-Z0-9._%-]*@([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,4})
$/'; // RegExp pt adresa de e-mail

// Verifica daca sunt primite date din formular


if (isset($_POST['name']) && isset($_POST['pass']) && isset($_POST['email'])) {
// sterge tag-urile si spatiile goale de la inceputul si sfarsitul valorilor
$_POST = array_map("strip_tags", $_POST);
$_POST = array_map("trim", $_POST);

// verifica daca toate campurile din formular sunt completate corect


// (adresa de email si numarul minim de caractere din "name" si "pass")
if (!preg_match($regexp_mail, $_POST['email'])) $erors[] = 'Adresa de e-mail
incorecta';
if (strlen($_POST['name'])<3) $erors[] = 'Numele trebuie sa contina minim 3
caracte';
if (strlen($_POST['pass'])<6) $erors[] = 'Parola trebuie sa contina minim 6 caracte';

// daca nu sunt erori ($error array gol)


if(count($erors)<1) {
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', '', 'tests');

// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}

// stocheaza valorile intr-un Array, filtrand caracterele speciale pt. a fi folosite in


comanda SQL
$adds['name'] = $conn->real_escape_string($_POST['name']);
$adds['pass'] = $conn->real_escape_string($_POST['pass']);
$adds['email'] = $conn->real_escape_string($_POST['email']);

// interogarea SQL pentru userr, INSERT INTO


$sql = "INSERT INTO `users` (`name`, `pass`, `email`) VALUES ('". $adds['name'].
"', '". $adds['pass']. "', '". $adds['email']. "')";

// Trimite interogarea $sql la MySQL pentru a introduce valorile


if ($conn->query($sql) === TRUE) {
echo 'Datele au fost adaugate';
}
else {
echo 'Error: '. $conn->error;
}

$conn->close();
}
else {
// altfel, daca au aparut erori erori, le adauga intr-un sir si le printeaza
echo implode('<br />', $erors);
}
}
else {
echo 'Nu sunt date de la formular';
}
?>

PHP MySQL - SELECT, ORDER BY


Cand baza de date are cateva inregistrari in ea, puteti prelua informatia
stocata, folosind comanda SELECT.
O interogare SELECT returneaza randuri selectate de la unul sau mai multe
tabele.
- Sintaxa:
SELECT nume_coloana/e FROM nume_tabel
- "nume_coloana/e" - este numele coloanei sau coloanelor care vor fi
selectate.

Pentru a selecta mai multe coloane, adaugatile separate prin virgula:


SELECT coloana1, coloana2, coloana3 FROM nume_tabel

Pentru a selecta toate coloanele, punti un asterisc (*):


SELECT * FROM nume_tabel

Ca sa fie trimisa comanda SQL la baza de date MySQL si pentru a prelua


datele selectate, se foloseste metoda query() a obiectului mysqli.
Cand este folosita cu interogari SELECT, aceasta metoda returneaza un obiect
care contine randurile de date, sau False in caz de eroare.
Pentru a parcurge datele returnate si sa obtineti cate un rand din ele, puteti
folosi metoda fetch_assoc.
Metoda fetch_assoc() returneaza un array asociativ ce contine randurile
preluate, cheile din array reprezinta numele coloanelor.
Cu o bucla while() puteti prelua informatiile din fiecare rand stocat in acel
array.
Pentru a afla numarul de randuri returnat de o interogare SELECT, se
foloseste proprietatea num_rows, aplicata la obiectul rezultat.

- Urmatorul exemplu selecteza si afiseaza datele stocate in coloanele "id",


"name" si"pass" din tabelul "users".
<?php
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', 'pass', 'tests');

// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}

// interogare sql SELECT


$sql = "SELECT `id`, `name`, `pass` FROM `users`";

// executa interogarea si retine datele returnate


$result = $conn->query($sql);

// daca $result contine cel putin un rand


if ($result->num_rows > 0) {
// afiseaza datele din fiecare rand din $result
while($row = $result->fetch_assoc()) {
echo '<br /> id: '. $row['id']. ' - name: '. $row['name']. ' - pass: '. $row['pass'];
}
}
else {
echo '0 rezultate';
}

$conn->close();
?>

- Acest exemplu stocheaza datele (obiectul rezultat) returnate de metoda


query() in variabila $result , foloseste proprietatea "num_rows" sa verifice
daca $result contine cel putin un rand. Apoi, cu bucla while() trece prin toate
inregistrarie din obiecul rezultat, folosind metoda "fetch_assoc()" pentru a
retine datele din fiecare rand intr-un Array in variabila $row.
Fiecare apelare a fetch_assoc() returneaza urmatorul rand in setul de
rezultate, pana cand nu mai sunt, si returneaza False.
Pentru a accesa valorile din fiecare rand, se foloseste variabila PHP $row si
cheia cu numele coloanei ($row['id'], ...).
Codul de mai sus va afisa:
id: 1 - name: Marius - pass: faith
id: 2 - name: MarPlo - pass: peace
id: 3 - name: I_AM - pass: love
id: 4 - name: PloMar - pass: love_light

Asterisc (*) poate fi folosit pentru a selecta toate coloanele: "SELECT * FROM
nume_tabel", dar este mai bine sa specificati doar coloanele care vreti sa fie selectate,
deoarece procesul de selectare poate fi mai rapid.

Optiunea LIMIT
Cu optiunea LIMIT puteti sa determinati numarul de inregistrari pe care
MySQL le va returna:
- Sintaxa:
SELECT nume_coloana/e FROM nume_tabel LIMIT skip_nr, ret_nr

"skip_nr" este optional, ii spune bazei de date cate randuri sa sara din
rezultate.
"ret_nr" seteaza numarul maxim de inregistrari ce vor fi returnate.
- Exemplu:
<?php
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', 'pass', 'tests');

// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}

// interogare sql SELECT


$sql = "SELECT `id`, `name`, `pass` FROM `users` LIMIT 2";

// executa interogarea si retine datele returnate


$result = $conn->query($sql);

// daca $result contine cel putin un rand


if ($result->num_rows > 0) {
// afiseaza datele din fiecare rand din $result
while($row = $result->fetch_assoc()) {
echo '<br /> id: '. $row['id']. ' - name: '. $row['name']. ' - pass: '. $row['pass'];
}
}
else {
echo '0 rezultate';
}

$conn->close();
?>

Optiunea "LIMIT 2" spune MySQL sa returneze primele 2 randuri din rezultat.
Acest exemplu va afisa:
id: 1 - name: Marius - pass: faith
id: 2 - name: MarPlo - pass: peace
ORDER BY
ORDER BY specifica ordinea de sortare a resultatelor.
- Sintaxa:
SELECT nume_coloana/e FROM nume_tabel ORDER BY nume_col ASC|DESC
"nume_col" poate fi o singura coloana, o lista de coloane separate prin
virgula, sau o expresie ca RAND(), pentru a obtine o ordine aleatorie.
Cand se ordoneaza dupa mai mult de o coloana, a doua coloana e folosita in
sortare doar daca valorile din prima coloana sunt egale.
Ordinea de sortare standard este ascendenta (ASC) (az, 09), iar optiunea
ASC poate fi omisa. DESC (descrescator) inverseaza ordinea.
- Exemplu:
<?php
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', 'pass', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}

// interogarea sql SELECT


$sql = "SELECT `id`, `name`, `pass` FROM `users` ORDER BY `name`";

// executa interogarea si retine rezultatul


$result = $conn->query($sql);

// daca $result contine cel putin un rand


if ($result->num_rows > 0) {
// afiseaza datele din fiecare rand din $result
while($row = $result->fetch_assoc()) {
echo '<br /> id: '. $row['id']. ' - name: '. $row['name']. ' - pass: '. $row['pass'];
}
}
else {
echo '0 results';
}

$conn->close();
?>

- Acest cod selecteaza toate datele stocate in tabelul "users" , si sorteaza


rezultatul in ordine alfabetica dupa coloana "name".
Exemplul de mai sus va afisa:
id: 3 - name: I_AM - pass: love
id: 1 - name: Marius - pass: faith
id: 2 - name: MarPlo - pass: peace
id: 4 - name: PloMar - pass: love_light

Puteti folosi ORDER BY cu optiunea LIMIT.


Exemplu: "SELECT `id`, `name`, `pass` FROM `users`
ORDER BY `name` LIMIT 2"

Daca vreti sa ignore randurile duplicate (care au aceleasi valori), se


foloseste optiunea DISTINCT:

SELECT DISTINCT nume_coloana/e FROM nume_tabel


- Se pot de asemenea selecta coloane din tabele diferite, in aceeasi
interogare SQL, vedeti tutorialul Select in doua tabele MySQL.

PHP MySQL - WHERE si LIKE


Utilizare WHERE si operatori pentru a cauta valori specifi ce
Pentru a cauta valori specifice, pentru a extrage doar acele inregistrari care
respecta anumite criterii, se adauga o clauza WHERE in interogarea SELECT.
Clauza WHERE este folosita pentru a filtra inregistrarile. Se adauga dupa
numele tabelului.
- Sintaxa:
SELECL nume_coloana/e FROM nume_tabel WHERE conditie

"conditie" - poate fi una sau mai multe expresii conditionale care specifica
criteriul de selectare. Aceste expresii conditionale pot folosi operatori de
comparatie, aritmetici si logici.

Tabelul urmator prezinta operatorii cei mai des folositi cu WHERE in


instructiunile MySQL:
Operator Semnificatie Exemplu
= Egal WHERE `id`=3
< Mai mic decat WHERE `id`<3
> Mai mare decat WHERE `id`>3
<= Mai mic sau egal cu WHERE `id`<=3
>= Mai mare sau egal cu WHERE `id`>=3
!= (also <>) Nu este egal cu WHERE `id`!=3
IS NOT NULL Are valoare WHERE `id` IS NOT NULL
IS NULL Nu are valoare WHERE `email` IS NULL
BETWEEN min AND Intr-un interval specific WHERE `id` BETWEEN 2
max (min si max) AND 4
NOT
Nu este in intervalul (min si WHERE `id` NOT
BETWEEN min AND
max) BETWEEN 2 AND 4
max
IN(val1, val2, val3) Se gaseste in lista de valori WHERE `id` IN(1, 3, 4)
Unde una din conditii este WHERE `id`>3 OR
OR
adevarata `name`='MarPlo'
Unde amandoua conditii WHERE `id`>3 AND
AND
sunt adevarate `name`='MarPlo'

- Exemplu (selecteaza toate randurile din tabelul "users" care au


"name=MarPlo" si afiseaza "id" si "email" din ele):
<?php
// conectare la baza de date "tests"
$conn = new mysqli('localhost', 'root', '', 'tests');

// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}

$name = 'Marplo'; // seteaza numele intr-o variabila

// Interogare sql SELECT


$sql = "SELECT `id`, `email` FROM `users` WHERE `name`='$name'";

// executa interogarea si retine rezultatele


$result = $conn->query($sql);

// daca $result contine cel putin un rand


if ($result->num_rows > 0) {
// afisaza datele pentru fiecare rand din $result
while($row = $result->fetch_assoc()) {
echo '<br /> id: '. $row['id']. ' - email: '. $row['email'];
}
}
else {
echo '0 results';
}

$conn->close();
?>

- Dupa cum observati, nu e necesar sa selectati coloana la care aplicati


conditia WHERE. Coloanele specificate dupa SELECT dicteaza ce coloane sa
returneze, iar coloanele adaugate dupa WHERE determina ce randuri vor fi
returnate.
- Nota, in interogarea $sql este folosita variabila ($name) care contine
numele, aceasta variabila este adaugata intre ghilimele simple in interogare
pentru ca MySQL sa preia valoarea ei ca tip sir (string).
Exemplul de mai sus va afisa:
id: 2 - email: [email protected]

Clauza WHERE poate fi folosita si cu optiunile ORDER BY si LIMIT pentru a


ordona si limita datele selectate.
Exemplu: $sql = "SELECT `name`, `pass` FROM `users`
WHERE `id`>2 ORDER BY `name` LIMIT 2";

In instructiunile SQL se pot adauga si expresii cu calcule matematice,


folosind caracterele adunare (+), scadere (-), inmultire (*), impartire (/), si
procent (%).
Exemplu: $sql = "SELECT `name`, `pass` FROM `users`
WHERE `id`=($x + $y)";
LIKE, NOT LIKE
LIKE si NOT LIKE sunt termeni folositi pentru identificare valori de tip sir, in
combinatie cu urmatoarele caractere:
% - reprezinta orice secventa de caractere sau niciuna.
_ (o sublinie), reprezinta exact un caracter.

Acesti termeni sunt folositi cu clauza WHERE, iar cautarea este case-
insensitive (fara diferenta intre litere mari si mici).

Exemple de interogari cu LIKE /NOT LIKE


<?php
// ...

#sql = "SELECT * FROM `nume_tabel` WHERE `name` LIKE 'mar%'";

// ...
?>

- Aceasta clauza WHERE se potriveste cu MarPlo, marius, Mars, si asa mai


departe, dar nu Omar.

<?php
// ...

#sql = "SELECT * FROM `nume_tabel` WHERE `name` NOT LIKE '%mar'";

// ...
?>

- Aceasta clauza WHERE se potriveste cu Mar, Omar, Romar, si asa mai


departe, dar nu cu Mars. ('%mar%' se potriveste cu Mars, Marius, Romars,
etc.).
<?php
// ...

#sql = "SELECT * FROM `nume_tabel` WHERE `name` NOT LIKE 'mar%'";

// ...
?>

- Aceasta interogare va returna toate randurile ale caror valoare "name" nu


incepe cu Mar.

<?php
// ...

#sql = "SELECT * FROM `nume_tabel` WHERE `name` LIKE 'mar_'";

// ...
?>

- Aceasta interogare va returna toate randurile ale caror valoare "name"


incepe cu Mar si are patru caractere (Mars, Mara, mar8, etc.).

Interogarile cu termeni LIKE sunt in general mai lente deoarece nu pot profita de indexi.
Pentru a cauta un simbol procent (%) sau o sublinie (_) in text, le precedati cu backslash, in
acest mod ( \% sau \_ ).
Sublinia poate fi folosita in combinatie cu ea insasi; (exemplu, LIKE '_ _' va cauta orice
combinatie de doua litere).
Cuvantul cheie LIKE trebuie sa fie intotdeauna urmat de un sir, chiar daca termenul cautat
este limitat la numere.

PHP MySQL - UPDATE


Dupa ce ati adaugat randuri in tabelul MySQL, puteti sa modificati datele
inregistrate, folosind comanda UPDATE.
Instructiunea UPDATE este folosita pentru a modifica sau actualiza
informatiile existente intr-un tabel.
- Sintaxa:
UPDATE nume_tabel
SET coloana1=valoare, coloana2=valoare2, ...
WHERE o_coloana=o_valoare

- Clauza WHERE este importanta intr-o interogare UPDATE , specifica


serverului MySQL care inregistrare sau inregistrari trebuie actualizate. Daca
omiteti clauza WHERE, vor fi afectate toate randurile!
- Comanda UPDATE este trimisa la serverul MySQL cu metoda query() a
obiectului mysqli.
- Exemplu
In lectiile anterioare a fost creat un tabel numita "users" si am adaugat
cateva randuri in el. Asa arata primele doua inregistrari.
i passwo
name email reg_date
d rd
Mariu name@domain. 2011-03-24
1 faith
s net 09:51:46
MarPl [email protected] 2011-03-24
2 peace
o om 10:10:27

In acest exemplu vom modifica adresa de email pentru utilizatorul cu "name"


MarPlo.
<?php
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', 'pass', 'tests');

// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}

// interogare sql UPDATE


$sql = "UPDATE `users` SET `email`='[email protected]' WHERE
`name`='MarPlo' AND `id`=2";

// executa interogarea si verifica pentru erori


if (!$conn->query($sql)) {
echo 'Error: '. $conn->error;
}

$conn->close();
?>

Dupa cum observati, clauza WHERE pune doua conditii cu operatorul "AND"
(WHERE `name`='MarPlo' AND `id`=2), ii spune serverului MySQL sa
actualizeze numai randurile care au "name='MarPlo'" si "id=2". Setand
aceste doua conditii, putem fi siguri ca numai acel rand va fi modificat, nu un
alt rand cu acelasi nume.
De asemenea, puteti sa aplicati optiunea LIMIT pentru a seta cate randuri sa
fie actualizate.
Exemplu:
$sql = "UPDATE `users` SET
`email`='[email protected]' WHERE `name`='MarPlo' AND `id`=2
LIMIT 1";

Dupa actualizare, primele doua randuri din tabelul "users" vor arata asa:
id name password email reg_date
1 Marius faith [email protected] 2011-03-24 09:51:46
2 MarPlo peace [email protected] 2011-03-27 10:20:58
- Deoarece "reg_date" este o coloana de tip TIMESTAMP (cu atribute: on
update CURRENT_TIMESTAMP ), serverul MySQL a modificat si valuarea ei,
actualizand-o cu data si ora curente (din momentul efectuarii UPDATE).
Daca vreti ca o instructiune UPDATE sa nu schimbe valoare coloanei
TIMESTAMP, cand creati tabelul trebuie sa nu adaugati atributul "on update" ,
ci doar DEFAULT ( `coloana_data` TIMESTAMP NOT NULL DEFAULT
CURRENT_TIMESTAMP ).

- Daca executati o interogare UPDATE care nu modifica nici o valoare


(deoarece conditia WHERE nu se potriveste nici unui rand), nu va returna
vreo eroare si nici nu va afecta vreun rand.
- Este indicat sa nu schimbati valoarea unei coloane de tip PRIMARY KEY (in
exemplul de mai sus, coloana "id").

PHP MySQL - DELETE


Comanda DELETE este folosita pentru a sterge randuri din tabel.
- Sintaxa:
DELETE FROM nume_tabel WHERE conditie

Clauza WHERE conditie este foarte importanta, ea specifica exact care rand
sau randuri trebuie sterse. Este important sa o folositi, deoarece randurile
sterse nu mai pot fi recuperate, decat daca aveti undeva salvata baza de
date.
Daca nu adaugati WHERE, serverul MySQL va sterge toate inregistrarile din
tabel, lasandu-l gol.
Instructiunea DELETE este trimisa la serverul MySQL cu metoda query() a
obiectului mysqli.

- Exemplu
In lectiile anterioare a fost creat un tabel "users" si am adaugat cateva date
in el. Aici puteti vedea cum arata primele 3 randuri.
passwor
id name email reg_date
d
2011-03-24
1 Marius faith [email protected]
09:51:46
[email protected] 2011-03-27
2 MarPlo peace
m 10:20:58
2011-03-24
3 I_AM love [email protected]
10:10:27
In acest exemplu vom sterge inregistrarile din tabel, care au name='MarPlo':
<?php
// Conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', 'pass', 'tests');

// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}

// interogare DELETE
$sql = "DELETE FROM `users` WHERE `name`='MarPlo'";

// executa interogarea si verifica daca exista erori


if (!$conn->query($sql)) {
echo 'Error: '. $conn->error;
}

$conn->close();
?>

- Acest cod va sterge toate randurile din tabelul "users" care au


name='MarPlo', astfel, daca in acest tabel sunt mai multi useri (inregistrari)
cu numele "MarPlo", MySQL le sterge pe toate.
Ca sa fiti sigur care inregistrare va fi stearsa, puteti sa adaugti inca o conditie
in clauza WHERE (cu operatorul AND), care impreuna cu prima specifica mai
exact ce rand sa fie sters.
De asemenea, se poate aplica optiunea LIMIT ca sa specificati cate randuri sa
fie sterse, din cele conform conditiei.
Example:
$sql = "DELETE FROM `users` WHERE `name`='MarPlo' AND
`id`=2 LIMIT 1";

Dupa stergere, primele trei randuri din tabelul "users" vor arata asa:
id name password email reg_date
1 Marius faith [email protected] 2011-03-24 09:51:46
3 I_AM love [email protected] 2011-03-24 10:10:27
4 PloMar love_light [email protected] 2011-03-24 14:39:49
- Dupa cum se observa, randul cu name='MarPlo' (id=2) a fost sters.
- Daca se executa o interogare DELETE care nu sterge nici o inregistrare
(deoarece conditia WHERE nu se potriveste cu nici un rand), nu veti primi nici
o eroare, si nu va fi afectat vreun rand.
Pentru a sterge complet un tabel, se foloseste DROP TABLE:
DROP TABLE nume_tabel

Pentru a sterge o intreaga baza de date, cu toate tabelele si informatiile din


ea, se foloseste DROP DATABASE:

MySQL Alias si functii


Alias
Un alias este creat folosing termenul AS urmat de un nume case-sensitive. Se
foloseste in interogari SELECT pentru a da unei coloane un nume diferit in
rezultatele returnate.
- Exemplu:
In exemplele din aceasta lectie se foloseste urmatorul tabel, denumit "sites":

id site nr reg_date
1 www.marplo.net 5 2011-03-28 07:56:53
2 www.coursesweb.net 8 2011-03-28 07:57:40

Acest exemplu selecteaza inregistrarile din coloana "site" si le returneaza intr-


un alias numit "st".
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', '', 'tests');

// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}

// interogare sql
$sql = "SELECT `site` AS st FROM `sites`";

// executa interogarea si retine rezultatele


$result = $conn->query($sql);

// daca $result contine cel putin un rand


if ($result->num_rows > 0) {
// afisaza datele din fiecare rand din $result
while($row = $result->fetch_assoc()) {
echo '<br />';
print_r($row);
}
}
else {
echo '0 rezultate';
}

$conn->close();
?>

In resultatele obtinute, valorile coloanei "site" vor fi returnate intr-un alt nume
de coloana, denumita 'st'.
Afiseaza:
Array ( [st] => www.marplo.net )
Array ( [st] => www.coursesweb.net )

Se pot folosi mai multe aliasuri intr-o interogare SELECT, cate unul pentru
fiecare coloana:
SELECT coloana1 AS nume1, coloana2 AS nume2 FROM
nume_tabel

Aliasurile sunt de obicei folosite cu functii, pentru a returna rezultatul unei


functii asociat cu un nume (dupa cum vedeti in exemplu de mai jos).
- In mod standard, SQL nu suporta folosirea de aliasuri in interogari care au
conditionala WHERE.
Functii MySQL
Cele mai multe din functiile MySQL sunt folosite cu interogarea SELECT
pentru a formata datele returnate, dar puteti folosi functii MySQL si cu alte
tipuri de interogari.
Pentru a aplica o functie intr-o instructiune SELECT, la valoarea unei
coloane, interogarea va arata astfel:
- Sintaxa:
SELECT coloana1, FUNCTIE(coloana2), coloana3 FROM nume_tabel
Nu trebuie sa lasati spatii intre numele functiei si parateza ei.
Functii pentru Text
Functiile pentru text sunt folosite cand se lucreaza cu siruri, pot fi aplicate
fie cu numele coloanelor fie cu valori specifice.
Tabelul de mai jos contine cateva din cele mai utilizate functii MySQL pentru
lucru cu text ("t", poate fi text sau numele unei coloane).

Functie Returneaza
CONCAT(t1,
Un nou sir de forma "t1t2".
t2, ...)
CONCAT_WS(S, Un nou sir de forma t1St2S... (ignora coloanele care nu
t1, t2, ...) au valori)
Functie Returneaza
LENGTH(t) Numarul de caractere din "t".
LEFT(t, y) Caracterul "y" cel mai aproape de partea stanga din "t".
RIGHT(t, x) Caracterul "x" cel mai aproape de partea deapta din "t".
TRIM(t) "t" cu spatiile de la capete sterse.
UPPER(t) "t" cu litere mari.
LOWER(t) "t" cu litere mici.
SUBSTRING(t, x, caracterele "y" din "t", incepand de la index "x" (indexat
y) de le 0).
expr REGEXP Executa o cautare in "expr", dupa o expresie regulata
patern specificata la "patern".

- In urmatorul exemplu vom folosi functia CONCAT() pentru a uni intr-un


singur sir valorile a doua coloane ("site" si "nr"), separate de o liniuta. Acest
sir va fi returnat cu un titlu de alias numit "str":
<?php
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', '', 'tests');

// verifica in caz de eroare la conectare


if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}

// interogare sql
$sql = "SELECT CONCAT(`site`, ' - ', `nr`) AS str FROM `sites`";

// executa interogarea si stocheaza rezultatele


$result = $conn->query($sql);

// daca $result contine cel putin un rand


if ($result->num_rows > 0) {
// afisaza datele pentru fiecare rand din $result
while($row = $result->fetch_assoc()) {
echo '<br />'. $row['str'];
}
}
else {
echo '0 rezultate';
}

$conn->close();
?>

Aliasul "str" este cheia in array ce contine valorile returnate.


Codul de mai sus va returna:
www.marplo.net - 5
www.coursesweb.net - 8

Pentru lista completa cu functiile MySQL pt. text, vedeti manualul


MySQL: Functii pentru siruri.
Functii numerice
Functiile numerice sunt folosite in lucrul cu numere, pentru a efectua
operatii matematice. Ca si celelalte functii, ele pot fi utilizate fie cu numele
coloanelor fie cu valori specifice.
In tabelul urmator sunt prezentate cateva din functiile numerice MySQL ("n",
poate fi un numar sau numele unei coloane).

Functia Returneaza
ABS(n) Valoarea absoluta a lui "n".
AVG(col) Valoarea mijlocie (medie) a coloanei specificate.
CEILING(n) Urmatorul cel mai mare numar intreag dupa "n".
FLOOR(n) Valoarea intreaga a lui "n".
FORMAT(n1 "n1" formatat ca un numar cu "n2" zecimale si cu virgula la
, n2) fiecare 3 spatii.
MIN(col) Valoarea minima din coloana specificata.
MAX(col) Valoarea maxima din coloana specificata.
MOD(n1, Resultatul impartirii lui "n1" la "n2". La fel ca si expresia cu
n2) simbolul procent (n1%n2)
POW(n1,
"n1" la puterea "n2"
n2)
RAND() Un numar aleatoriu intre 0 si 1.0
ROUND(n1,
"n1" rotunjit la "n2" zecimale.
n2)
SQRT(n) Radical din "n".
SUM(col) Suma valorilor din coloana specificata.

- In urmatorul exemplu vom selecta coloana "nr", cu functia POW() aplicata


ei, urmata de un alias care va contine valoarea returnata de functia POW():
<?php
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', '', 'tests');

// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}

// interogare sql
$sql = "SELECT `nr`, POW(`nr`, 3) AS pow3 FROM `sites` ORDER BY pow3";

// executa interogarea si stocheaza rezultatele


$result = $conn->query($sql);

// daca $result contine cel putin un rand


if ($result->num_rows > 0) {
// afiseaza datele din fiecare rand din $result
while($row = $result->fetch_assoc()) {
echo '<br /> POW('. $row['nr']. ', 3) - '. $row['pow3'];
}
}
else {
echo '0 rezultate';
}

$conn->close();
?>

Afiseaza:
POW(5, 3) - 125
POW(8, 3) - 512

- Functia RAND() poate fi folosita pentru a returna randurile intr-o ordine


aleatorie:
SELECT * FROM nume_tabel ORDER BY RAND()

Pentru lista completa cu functii numerice MySQL, vedeti manualul


MySQL: Functii numerice si operatori
Functii pentru Data si Ora
Coloanele specifice pt. Data si Ora din MySQL sunt destul de flexibile.
Daca vreti sa faceti calcule bazate pe o anume data sau sa returnati numai
numele zilei din saptamana, MySQL are o functie pentru aproape fiecare scop
de lucru cu Data si Ora.
Tabelul urmator contine cateva din cele mai utilizate functii MySQL pt. lucru
cu data si ora. Ele pot fi aplicate fie cu numele coloanelor, fie cu valori
specifice ("dt", poate fi o valoare sau numele unei coloane).

Functie Returneaza
HOUR(dt) Ora din "dt".
MINUTE(dt) Minutul din "dt".
SECOND(dt) Secundele din "dt".
DAYNAME(dt) Numele zilei din saptaana a datei din "dt".
DAYOFMONTH(d
Numarul zilei din luna a datei din "dt".
t)
MONTHNAME(dt
Numele lunii din an a datei din "dt".
)
MONTH(dt) Valoarea numerica a lunii din an, a datei din "dt".
YEAR(dt) Anul din "dt".
CURDATE() Data curenta.
CURTIME() Ora curent.
NOW() Data si ora curenta.
Timpul Unix (numarul de secunde trecute de la "1 Ianuarie
UNIX_TIMESTAM
1970 00:00:00 GMT" pana la momentul curent sau pana la
P(dt)
data specificata).

- Urmatorul exemplu afiseaza numele zilei din saptamana cand ultimul site a
fost inregistrat:
<?php
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', '', 'tests');

// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}

// interogare sql
$sql = "SELECT `id`, `site`, DAYNAME(`reg_date`) AS weekday FROM `sites` ORDER
BY `reg_date` DESC LIMIT 1";

// executa interogarea si stocheaza rezultatele


$result = $conn->query($sql);
// daca $result contine cel putin un rand
if ($result->num_rows > 0) {
// parcurge si afiseaza datele din fiecare rand din $result
while($row = $result->fetch_assoc()) {
echo 'Ultimul site web: '. $row['site']. ' , id: '. $row['id']. ' - a fost inregistrat intr-o zi
de '. $row['weekday'];
}
}
else {
echo '0 results';
}

$conn->close();
?>

Afiseaza:
Ultimul site web: www.coursesweb.net , id: 2 - a fost inregistrata intr-o zi de
luni

Daca doriti sa preluati timpul UNIX dintr-o coloana de tip "Data si Timp",
folositi urmatoarea formula:
SELECT UNIX_TIMESTAMP(coloana_data) AS nume_alias
FROM nume_tabel

Exista multe alte functii pt. data si ora, puteti vedea lista completa in
manualul MySQL: Functii pentru Data si Ora.

PHP PDO - Introducere si Conectari la Baze de


Date
PDO (PHP Data Objects) este o extensie PHP pentru accesare baze de date
in PHP.
PDO foloseste caracteristicile OOP (Programare Orientata pe Obiecte)
valabile incepand cu PHP 5.1.
Deoarece PDO lucreaza cu clase si obiecte, trebuie sa fiti familiarizati cu
modul de lucru al programarii orientate pe obiecte.
PDO poate lucra cu urmatoarele tipuri de baze de date:
MySQL
PostgreSQL
SQLite 2 & 3
Firebird
Informix (IBM Informix Dynamic Server)
ODBC
Oracle
DBLM: FreeTDS / Sybase / MS-SQL
IBM (IBM DB2)

- Unul din avantajele PDO este acela ca se folosesc functii similare pentru
interogarea si prelucrarea bazelor de date, indiferent de tipul lor (din cele
mentionate mai sus).
Script-urile care folosesc interfata PDO pentru conectare la baza de date
efectueaza in general urmatoarele operatii:
1. Conectare la serverul bazei de date, prin apelare new PDO(), obtinand
un obiect pentru lucru cu acea baza de date.
2. Aplicare functii specifice PDO pt. efectuarea interogarilor la baza de
date.
3. Retinerea si prelucrarea datelor returnate.
4. Deconectarea de la server.

- Pentru a vedea daca PDO este valabil pentru baza dv. de date, se poate
verifica cu phpinfo(), unde e o sectiune PDO, sau cu
metodaPDO::getAvailableDrivers()
foreach(PDO::getAvailableDrivers() as $driver) {
echo $driver.'
';
}

1. Conectare la baza de date


Orice interactiune cu o baza de date incepe prin conectarea la ea. In
functie de tipul bazei de date se face intai conectarea, prin crearea unei
instante de obiect cu new PDO(). Dupa conectare se aplica metodele PDO
pentru retinerea si prelucrarea datelor, care in mare parte sunt aceleasi,
indiferent de baza de date conectata. Iata cum se face conectarea la cateva
din acestea:

Conectare la MySQL
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'numebd';
$userdb = 'username';
$passdb = 'password';

// Afiseaza mesaj daca s-a reusit conectarea, altfel, retine eventuala eroare
try {
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
echo 'Connected to database';
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>

- In variabila $dbh se creaza obiectul PDO in care vor fi stocate datele


transmise de la serverul MySQL. La aceasta instanta de obiect vor fi aplicate
metodele pentru prelucrarea datelor.
Observati ca s-a folosit formula try() ... catch(), aceasta pentru a nu expune
datele de conectare in cazul vreunei erori.
- De exemplu, folosind aceasta tehnica, daca numele bazei de date este
incorect, returneaza ceva de genul:
SQLSTATE[42000] [1049] Unknown database 'numebd'
- Daca numele sau parola sunt gresite, afiseaza ceva similar cu:
SQLSTATE[28000] [1045] Access denied for user 'numele'@'localhost' (using
password: YES)
Dar, daca s-ar folosi direct:
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'numebd';
$userdb = 'username';
$passdb = 'password';

$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);


?>

- Mesajul de eroare ar expune mai multe date, inclusiv parola, dupa cum
se vede mai jos:
Fatal error: Uncaught exception 'PDOException' with message
'SQLSTATE[28000] [1045] Access denied for user 'numele'@'localhost' (using
password: YES)' in E:\server\www\zzz.php:14 Stack trace: #0
E:\server\www\zzz.php(14): PDO->__construct('mysql:host=loca...', 'numele',
'parola') #1 {main} thrown in E:\server\www\zzz.php on line 7
Deci, este indicata aplicarea formulei try() ... catch().

Conectare PostgreSQL
<?php
try {
$dbh = new PDO("pgsql:host=localhost port=5432 dbname=pdo", "username",
"password");
echo "PDO connection object created";
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>
Conectare la SQLite
Cand PDO e folosit cu SQLite, trebuie specificata doar calea catre fisierul cu
baza de date. Daca acesta nu exista, va incerca sa-l creeze.
<?php
try {
// connect to SQLite database
$dbh = new PDO("sqlite:/path/to/database.sdb");
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>

Conectare la Firebird
Firebird este o baza de date folosita pe Windows.
<?php
try {
$dbh = new PDO("firebird:dbname=localhost:C:\Programs\Firebird\DATABASE.FDB",
"SYSDBA", "masterkey");
}
catch (PDOException $e) {
echo $e->getMessage();
}
?>

Conectare la Informix
<?php
try {
$dbh = new PDO("informix:DSN=InformixDB", "username", "password");
}
catch (PDOException $e) {
echo $e->getMessage();
}
?>

Conectare la Oracle
<?php
try {
$dbh = new PDO("OCI:dbname=accounts;charset=UTF-8", "username",
"password")
}
catch (PDOException $e) {
echo $e->getMessage();
}
?>

Conectare la ODBC
Exista mai multe conexiuni ODBC care pot fi create. Iata conectarea la o baza
de date MS Access, numita "accounts".
<?php
try {
$dbh = new PDO("odbc:Driver={Microsoft Access Driver
(*.mdb)};Dbq=C:\accounts.mdb;Uid=Admin");
}
catch (PDOException $e) {
echo $e->getMessage();
}
?>

Conectare la DBLIB
O alta baza de date specifica Windows.
<?php
$hostdb = "localhost";
$port = 10060;
$namedb = "my_database";
$userdb = "username";
$passdb = "password";

try {
$dbh = new PDO ("dblib:host=$hostdb:
$port;dbname=$namedb","$userdb","$passdb");
}
catch (PDOException $e) {
echo $e->getMessage();
}
?>

Conectare la IBM
Urmatorul exemplu arata conectarea la o baza de date IBM DB2 numita
"accounts".
<?php
try {
$db = new PDO("ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=accounts;
HOSTNAME=1.2.3,4;PORT=56789;PROTOCOL=TCPIP;", "username", "password");
}
catch (PDOException $e) {
echo $e->getMessage();
}
?>

2. Inchiderea conexiunii cu baza de date


In mod normal, PHP inchide conexiunea la baza de date dupa ce a fost
executat tot scriptul. Dar deconectarea se poate face si intentionat,
atribuind valoare null la obiectul PDO, dupa cum e prezentat in exemplu de
mai jos.
Instanta la acel obiect va fi distrusa, prin urmare, aceasta metoda trebuie
adaugata dupa ce au fost scrise toate instructiunile care trebuie aplicate
obiectului PDO.
- Deconectarea prin aceasta metoda este utila deoarece elibereaza
memoria folosita.
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'numebd';
$userdb = 'username';
$passdb = 'password';

// Afiseaza mesaj daca s-a reusit conectarea, altfel, retine eventuala eroare
try {
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
echo 'Connected to database';
/* Instructiuni de lucru cu $dbh */

$dbh = null; // Inchidere conexiune


}
catch(PDOException $e) {
echo $e->getMessage();
}
?>

In tutorialul urmator e prezentat modul de creare si adaugare date in tabel


MySQL, INSERT, UPDATE si DELETE folosind metoda PDO exec().
PHP PDO - exec (INSERT, UPDATE, DELETE)
MySQL
Dupa ce se realizeaza cu succes conectarea la baza de date (aici MySQL)
si se creaza instanta de obiect PDO, poate fi utilizata pentru executia de
interogari SQL.
Interogarile SQL cu PDO pot fi facute in 2 moduri: direct (cu metodele
"exec()" si "query()"), sau cu declaratiile prepare() ... execute().
Prima varianta e mai simpla si in aceasta lectie va fi prezentata
metoda exec.

Comenzile care modifica randuri din tabel, dar nu returneaza un set de


rezultate cu randuri si coloane (INSERT, UPDATE), se transmit cu
metoda exec(), aceasta returneaza numarul de randuri afectate, sau FALSE
in caz de eroare.
$count = $dbh->exec("Comanda SQL");
Interogarile care selecteaza randuri (SELECT) si returneaza un set de
rezultate cu randuri si coloane se transmit cu metoda query(). In caz de
eroare da FALSE.
$res = $dbh->query("Interogare SQL");
Pentru a lucra cu baze de date in PHP trebuie cunoscute interogarile specifice SQL,
precum: CREATE TABLE, INSERT, SELECT, etc.
Cu PDO, PHP transmite aceste comenzi sub forma de sir la MySQL, daca nu le cunoasteti,
sunt prezentate in lectiile despre baze de date SQL, incepand cu Baze de date SQL.

1. Creare tabel MySQL


Crearea unui tabel MySQL folosind PDO se face prin metoda "exec()" si
instructiunea specifica SQL, "CREATE TABLE ...", sintaxa fiind:
$obiectPDO->exec("CREATE TABLE `nume_tabel`
(`coloana1` TIP, `coloana2` TIP, ...)");
- Toate aceste instructiuni se adauga dupa cea de creare a obiectului PDO si
conectare la MySQL.

In exemplu urmator se creaza in baza de date "teste" un tabel denumit


"sites", cu 4 coloane: "id", "nume", "categorie" si "adresa".
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8"); // Setare encoding caractere UTF-8
// Creare tabel
$sql = "CREATE TABLE `sites` (`id` int(8) NOT NULL AUTO_INCREMENT PRIMARY
KEY , `nume` varchar(70) NOT NULL DEFAULT '', `categorie` varchar(25), `adresa`
varchar(100)) CHARACTER SET utf8 COLLATE utf8_general_ci";
if($dbh->exec($sql) !== false) echo 'Tabelul sites e creat'; // Daca rezultatul e
diferit de false, afiseaza confirmare

$dbh = null; // Deconectare


}
catch(PDOException $e) {
echo $e->getMessage();
}
?>

- Daca tabelul e creat, afiseaza:


Tabelul sites e creat
- Prin "exec("SET CHARACTER SET utf8")" seteaza ca transferul de date dintre
PHP si serverul MySQL sa se faca in format de caractere UTF-8. Este indicata
adaugarea acestei instructiuni cand se lucreaza cu date ce contin diacritice si
caractere mai putin uzuale, dar in scriptul PHP trebuie aplicat si header-
ul header('Content-type: text/html; charset=utf-8');.

2. INSERT
Dupa ce tabelul MySQL este creat, se pot adauga randuri cu date in el.
Acest lucru se face cu instructiunea INSERT, prin metoda exec(). Sintaxa
generala este:
$obiectPDO->exec("INSERT INTO `nume_tabel` (`coloana1`,
`coloana2`, ...) VALUES ('valoare1', 'valoare2', ...));

Iata cum se aplica.


<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8"); // Setare encoding caractere UTF-8
// Adaugare date
$sql = "INSERT INTO `sites` (`nume`, `categorie`, `adresa`)
VALUES
('Cursuri - Tutoriale', 'educatie', 'www.marplo.net'),
('Curs PHP-MySQL', 'programare', 'www.marplo.net/php-mysql'),
('Cursuri Engleza', 'limbi straine', 'www.marplo.net/engleza')";
$count = $dbh->exec($sql);

$dbh = null; // Deconectare


}
catch(PDOException $e) {
echo $e->getMessage();
}

// Daca datele au fost adaugate ($coun nu e false) afiseaza nr. randuri adaugate
if($count !== false) echo 'Nr. randuri adaugate: '. $count;
?>

- Acest cod adauga 3 randuri in tabelul "sites". Variabila $count retine


numarul de randuri afectate (adaugate) si script-ul va afisa:
Nr. randuri adaugate: 3

Tabelul "sites" va arata astfel:


| id | | nume | | categorie | | adresa |
------------------------------------------------------------------------------------------------------------
| 1 | | Cursuri - Tutoriale | | educatie | | www.marplo.net |
| 2 | | Curs PHP-MySQL | | programare | | www.marplo.net/php-mysql |
| 3 | | Cursuri Engleza | | limbi straine | | www.marplo.net/engleza |

Pentru a obtine ultimul "id" adaugat cu INSERT intr-o coloana


AUTO_INCREMENT PRIMARY KEY, se foloseste metoda lastInsertId().
- Atentie, cand sunt adaugate mai multe randuri in aceeasi instructiune
INSERT, va returna id-ul primului rand adaugat (ca si cum se adauga un
singur rand).

UPDATE si DELETE sunt instructiuni SQL care modifica date din tabel, dar
nu returneaza un set de rezultate cu randuri si coloane, acestea (la fel ca
INSERT) pot fi executate in PDO cu metoda exec().
3. UPDATE
Dupa ce sunt adaugate date in tabelul MySQL, acestea pot fi modificate cu
instructiunea UPDATE. Formula generala aplicata cu PDO este:
$obiectPDO ->exec("UPDATE `nume_tabel` SET
`coloana1`='valoare1', `coloana2`='valoare2' WHERE conditie");

In urmatorul exemplu se modifica datele din coloanele "nume" si "adresa",


unde "id" are valoarea 3, din tabelul "sites", creat mai sus.
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8"); // Setare encoding caractere UTF-8

// Modificare date din coloanele "nume" si "adresa", unde id=3


$sql = "UPDATE `sites` SET `nume`='Cursuri Spaniola',
`adresa`='www.marplo.net/spaniola' WHERE `id`=3";
$count = $dbh->exec($sql);

$dbh = null; // Deconectare


}
catch(PDOException $e) {
echo $e->getMessage();
}

// Daca interogarea e facuta cu succes ($count diferit de false)


if($count !== false) echo 'Randuri afectate: '. $count; // Afiseaza nr. randuri
afectate
?>

- In browser va afisa:
Randuri afectate: 1

In unele situatii se poate ca UPDATE sa nu afecteze vreun rand si va returna 0. De aceea


este indicata verificarea prin conditia if($count !== false).
- E gresit if(!$count)

4. DELETE
Instructiunea DELETE sterge randuri din tabel. Formula generala aplicata
cu PDO este:
$obiectPDO ->exec("DELETE FROM `nume_tabel`
WHERE conditie");

In urmatorul exemplu se sterg toate randurile din tabelul "sites" care au


coloana "categorie" cu valoarea "educatie" sau "programare".
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8"); // Setare encoding caractere UTF-8

// Stergere randuri in functie de campul "categorie"


$sql = "DELETE FROM `sites` WHERE `categorie` IN('educatie', 'programare')";
$count = $dbh->exec($sql);

$dbh = null; // Deconectare


}
catch(PDOException $e) {
echo $e->getMessage();
}

// Daca interogarea e facuta cu succes ($count diferit de false)


if($count !== false) echo 'Randuri afectate: '. $count; // Afiseaza nr. randuri
afectate
?>

- In browser va afisa:
Randuri afectate: 2

- In lectia urmatoare sunt prezentate modul in care se poate selecta si prelua


date din tabelul MySQL cu metoda PDO query().

PHP PDO - Select, fetch


Pentru selectare date dintr-un tabel MySQL se foloseste instructiunea
SELECT, iar prin metode fetch specifice PDO datele cu randurile selectate
primite de la serverul MySQL pot fi preluate in mai multe moduri, cu metode
si constante FETCH.
1. Selectare date din tabel MySQL
Dupa ce tabelul MySQL este creat si are randuri adaugate, se aplica
interogarea SELECT pentru a obtine date din randurile tabelului. Se poate
folosi metoda query(), aceasta returneaza un set de rezultate cu datele
obtinute de la MySQL, sau FALSE in caz de eroare.
In exemplele prezentat aici se foloseste tabelul creat in lectia anterioara,
care arata astfel:
| id | | nume | | categorie | | adresa |
------------------------------------------------------------------------------------------------------------
| 1 | | Cursuri - Tutoriale | | educatie | | www.marplo.net |
| 2 | | Curs PHP-MySQL | | programare | | www.marplo.net/php-mysql |
| 3 | | Cursuri Engleza | | limbi straine | | www.marplo.net/engleza |

- In urmatorul exemplu vor fi selectate randurile in care "id" este 1 sau 3.


<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8"); // Setare encoding caractere UTF-8

// Selectare date
$sql = "SELECT * FROM `sites` WHERE `id` IN (1, 3)";
$datas = $dbh->query($sql);

// Daca select-ul e facut cu succes ($datas nu e false)


if($datas !== false) {
$cols = $datas->columnCount(); // Numar coloane returnate

echo 'Nr. coloane returnate: '. $cols. '<br />';

// Se parcurg si afiseaza datele selectate


foreach($datas as $row) {
echo $row['id']. ' - '. $row['nume']. ' - '. $row['categorie']. ' - '. $row['adresa'].
'<br />';
}
}

$dbh = null; // Deconectare


}
catch(PDOException $e) {
echo $e->getMessage();
}
?>

- Metoda "columnCount()" returneaza numarul de coloane din setul de


rezultate. Observati ca se aplica la instanta in care s-a executat interogarea
(aici variabila $datas).
- Parcurgerea datelor se poate face si cu WHILE, while($row=$datas-
>fetch()), in acest caz trebuie aplicata si metoda "fetch()" (este prezentata
mai jos).
- Scriptul de mai sus va afisa:
Nr. coloane returnate: 4
1 - Cursuri - Tutoriale - educatie - www.marplo.net
3 - Cursuri Engleza - limbi straine - www.marplo.net/engleza
2. Metoda fetch()
fetch() returneaza fiecare rand, unul dupa altul, sau FALSE cand nu mai
sunt randuri. Cu aceasta metoda se poate determina modul in care sunt
preluate datele.
fetch() poate primi optional un argument prin care se determina modul in
care valorile sunt returnate: Array, Obiect, Sir, .... Acest argument este o
constanta care se aplica cu sintaxa:
PDO::FETCH_MOD
In continuare sunt prezentate cateva din aceste moduri, cele mai comune:

FETCH_ASSOC
- Returneaza fiecare rand ca un Array in care cheile sunt numele coloanelor
(similar cu mysql_fetch_assoc).
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8"); // Setare encoding caractere UTF-8

// Selectare date din MySQL


$sql = "SELECT * FROM `sites`";
$datas = $dbh->query($sql);

// Se parcurg datele si le afiseaza


while($row = $datas->fetch(PDO::FETCH_ASSOC)) {
echo $row['id']. ' - '. $row['nume']. ' - '. $row['categorie']. ' - '. $row['adresa'].
'<br />';
}

$dbh = null; // Deconectare


}
catch(PDOException $e) {
echo $e->getMessage();
}
?>

- In browser apare:
1 - Cursuri - Tutoriale - educatie - www.marplo.net
2 - Curs PHP-MySQL - programare - www.marplo.net/php-mysql
3 - Cursuri Engleza - limbi straine - www.marplo.net/engleza

FETCH_NUM
- Returneaza fiecare rand ca un Array in care cheile sunt numere consecutive
(incepand de la 0), reprezentand ordinea coloanelor din setul de rezultate
(similar cu mysql_fetch_row).
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8"); // Setare encoding caractere UTF-8

// Selectare date din MySQL


$sql = "SELECT * FROM `sites`";
$datas = $dbh->query($sql);

// Se parcurg datele
while($row = $datas->fetch(PDO::FETCH_NUM)) {
echo $row[0]. '-'. $row[1]. '<br />'; // Afiseaza datele din prima si a doua
coloana
}

$dbh = null; // Deconectare


}
catch(PDOException $e) {
echo $e->getMessage();
}
?>

- In browser afiseaza:
1-Cursuri - Tutoriale
2-Curs PHP-MySQL
3-Cursuri Engleza

FETCH_BOTH
- Produce un Array cu ambele tipuri de chei, atat numele coloanelor cat si
numere consecutive reprezentand ordinea coloanelor din setul de rezultate.
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8"); // Setare encoding caractere UTF-8

// Selectare date din MySQL, unde "id" are valoarea 2


$sql = "SELECT `id`, `nume` FROM `sites` WHERE `id`=2";
$datas = $dbh->query($sql);

// Se parcurg datele
while($row = $datas->fetch(PDO::FETCH_BOTH)) {
echo $row['id']. '-'. $row['nume']. '<br />'; // Afiseaza datele din coloanele 'id'
si 'nume'
echo $row[0]. '-'. $row[1]. '<br />'; // Afiseaza din prima si a doua coloana
(aceleasi)
}

$dbh = null; // Deconectare


}
catch(PDOException $e) {
echo $e->getMessage();
}
?>

- In browser apare:
2-Curs PHP-MySQL
2-Curs PHP-MySQL

FETCH_OBJ
- Returneaza fiecare rand ca un obiect. Valorile coloanelor se acceseaza ca
proprietati ale obiectului, prin numele lor.
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8"); // Setare encoding caractere UTF-8

// Selectare date din MySQL, randuri cu "id" mai mic decat 3


$sql = "SELECT `id`, `nume` FROM `sites` WHERE `id`<3";
$datas = $dbh->query($sql);

// Se parcurg datele
while($row = $datas->fetch(PDO::FETCH_OBJ)) {
echo $row->id. '-'. $row->nume. '<br />'; // Afiseaza datele din coloanele 'id' si
'nume'
}
$dbh = null; // Deconectare
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>

- Va afisa:
1-Cursuri - Tutoriale
2-Curs PHP-MySQL

FETCH_CLASS
- Permite ca datele sa fie preluate intr-o clasa, creand o instanta de obiect la
acea clasa. Numele campurilor sunt folosite ca proprietati in acea clasa. Se
aplica cu metoda fetchALL().
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

// Definire clasa
class Sites {
// Definire proprietati
public $id;
public $categorie;

// Metoda a clasei
function makeString() {
// Returneaza un sir cu valorile proprietatilor, cu primul caracter din cuvinte
majuscula
return ucwords($this->id. ' - '. $this->categorie). '<br />';
}
}

try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8"); // Setare encoding caractere UTF-8
// Selectare date din MySQL, coloanele "id" si "categorie"
$sql = "SELECT `id`, `categorie` FROM `sites`";
$datas = $dbh->query($sql);
$obj = $datas->fetchALL(PDO::FETCH_CLASS, 'Sites'); // Aplicare FETCH_CLASS
la clasa Sites

// Parcurge datele din setul de rezultate, creaza instanta de clasa $insSites


foreach($obj as $insSites) {
echo $insSites->makeString(); // Apeleaza metoda makeString() la instanta
clasei
}

$dbh = null; // Deconectare


}
catch(PDOException $e) {
echo $e->getMessage();
}
?>

- Observati cum e aplicat FETCH_CLASS, la metoda "fetchALL()" si cu un


argument tip sir ce reprezinta numele clasei (aici "Sites").
- Acesta metoda e utila in cazul unor proiecte mai mari, definind intr-o clasa
instructiunile ce trebuie aplicate datelor primite de la baza de date se poate
reduce cantitatea de cod si se imbunatateste flexibilitatea scriptului.
- Script-ul va afisa:
1 - Educatie
2 - Programare
3 - Limbi Straine

O alternativa la FETCH_CLASS este metoda fetchObject(). Similar, si cu


aceasta datele din coloanele fiecarui rand din cele obtinute la "query()" sunt
preluate printr-o clasa care este adaugata ca argument la metoda.
Exemplu:
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

// Definire clasa
class Sites {
// Definire proprietati
public $id;
public $categorie;

// Metoda a clasei
function makeString() {
// Returneaza un sir cu valorile proprietatilor, primul caracter al cuvintelor
majuscula
return ucwords($this->id. ' - '. $this->categorie). '<br />';
}
}

try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8"); // Setare encoding caractere UTF-8

// Selectare date din MySQL, coloanele "id" si "categorie"


$sql = "SELECT `id`, `categorie` FROM `sites`";
$datas = $dbh->query($sql);

// Parcurgere instanta de obiect creata cu fetchObject() la clasa Sites


while($obj = $datas->fetchObject('Sites')) {
echo $obj->makeString(); // Afiseaza rezultatul apelarii metodei makeString()
}

$dbh = null; // Deconectare


}
catch(PDOException $e) {
echo $e->getMessage();
}
?>

- Numele coloanelor din fiecare rand sunt folosite ca proprietati ale clasei
apelate (aici Sites)
- In browser apare:
1 - Educatie
2 - Programare
3 - Limbi Straine
FETCH_FUNC
- O alta constanta FETCH_ care se aplica la metoda fetchALL() este
FETCH_FUNC. Returneaza un Array cu rezultatul apelarii unei functii, folosind
ca argumente coloanele fiecarui rand din setul de rezultate. Cheile din Array
sunt numere consecutive (de la 0), iar valoarea lor e rezultatul dat de functie
pt. fiecare rand.
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

// Definire functie
function test($id, $nume) {
// Returneaza un sir cu datele din parametri, cu majuscule
return strtoupper($id.'-'.$nume);
}

try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8"); // Setare encoding caractere UTF-8

// Selectare date din MySQL


$sql = "SELECT `id`, `nume` FROM `sites`";
$datas = $dbh->query($sql);
$ar_row = $datas->fetchALL(PDO::FETCH_FUNC, 'test'); // Aplicare FETCH_FUNC
la functia test()

var_export($ar_row); // Afiseaza structura Array-ului

$dbh = null; // Deconectare


}
catch(PDOException $e) {
echo $e->getMessage();
}
?>

- Acest mod este util cand se doreste aplicarea acelorasi instructiuni la mai
multe seturi de date obtinute din tabel MySQL, astfel, pot fi toate definite intr-
o functie.
- Rezultatul afisat este:
array ( 0 => '1-CURSURI - TUTORIALE', 1 => '2-CURS PHP-MYSQL', 2 => '3-
CURSURI ENGLEZA', )

Metoda query() accepta, dupa interogarea SQL, si un argument optional ce


reprezinta modul-fetch.
Exemplu:
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8"); // Setare encoding caractere UTF-8

// Selectare date din MySQL, unde "id" este 3


$sql = "SELECT `id`, `adresa` FROM `sites` WHERE `id`=3";
$datas = $dbh->query($sql, PDO::FETCH_OBJ); // Aplicare query() cu un mod-
fetch

// Se parcurg datele
while($row = $datas->fetch()) {
echo $row->id. '-'. $row->adresa. '<br />'; // Afiseaza datele din coloanele "id"
si "adresa"
}

$dbh = null; // Deconectare


}
catch(PDOException $e) {
echo $e->getMessage();
}
?>

- In browser apare:
3-www.marplo.net/engleza
Daca metoda fetch() este apelata fara argumente si la "query()" nu e specificat vreun tip
FETCH_, modul implicit (default) este PDO::FETCH_BOTH.
- O alta metoda prin care se poate seta modul FETCH_ default este setFetchMode().
Ex.:
$datas = $dbh->query($sql);
$datas->setFetchMode (PDO::FETCH_OBJ);
while($row = $datas->fetch()) { // ... }
- Mai multe detalii la pagina oficiala setFetchMode

In tutorialul urmator este prezentat modul de utilizare al metodelor prepare()


si execute().

PHP PDO - prepare si execute


Cu metodele exec() si query() se executa imediat comenzile SQL adaugate
in ele. Cu PDO e posibil sa fie pregatita o interogare SQL pentru executie
fara ca sa fie transmisa imediat, pentru aceasta se foloseste
metoda prepare().
prepare() preia ca argument o declaratie SQL si returneaza un obiect
PDOStatement. Acest obiect are o metoda execute() prin care se executa
declaratia SQL cand se doreste acest lucru, returneaza TRUE sau FALSE in
caz de eroare. Sintaxa generala de aplicare este:
$obj = $obiectPDO->prepare("Interogare SQL");
$obj->execute(Array);
- La "Interogare SQL" se poate aplica orice instructiune pt. SQL: INSERT,
SELECT, UPDATE, DELETE.
- Argumentul Array de la execute() e optional, acesta reprezinta un Array cu
parametri ce corespund declaratiei SQL de la prepare(), si valorile care vor fi
transmise la MySQL.

In exemplele prezentate in aceasta lectie se foloseste tabelul "sites", creat


si utilizat in lectiile anterioare, care arata astfel:
| id | | nume | | categorie | | adresa |
------------------------------------------------------------------------------------------------------------
| 1 | | Cursuri - Tutoriale | | educatie | | www.marplo.net |
| 2 | | Curs PHP-MySQL | | programare | | www.marplo.net/php-mysql |
| 3 | | Cursuri Engleza | | limbi straine | | www.marplo.net/engleza |

Iata explicat mai bine printr-un exemplu cum se aplica sintaxa de mai sus
intr-un script PHP cu PDO. Acesta va defini cu "prepare()" o comanda SQL prin
care va selecta din tabel randurile in functie de valorile adaugate prin
"execute()".
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8"); // Setare encoding caractere UTF-8

// Definire comanda SQL care va fi aplicata in metoda prepare()


$sql = "SELECT `nume`, `adresa` FROM `sites` WHERE `id`= :id OR
`categorie`= :categorie";
$prep = $dbh->prepare($sql); // Interogarea e pregatita si stocata in $prep

// Variabila Array cu valori ce trebuie adaugate in interogarea SQL pregatita (pt. ':id'
si ':categorie')
$ar_val = array('id'=>2, 'categorie'=>'educatie');

// Daca se executa cu succes interogarea, folosind execute() si valorile din $ar_val


if($prep->execute($ar_val)) {
// Parcurge si afiseaza randurile obtinute
while($row = $prep->fetch()) echo $row['nume'].' - '.$row['adresa'].'<br />';
}

/* Se executa inca o selectare, cu alte valori, aplicata aceleiasi declaratii SQL */


echo 'Select-ul 2<br />';

// Variabila Array cu valori ce trebuie adaugate in interogarea SQL pregatita (pt. ':id'
si ':categorie')
$ar_val = array('id'=>8, 'categorie'=>'limbi straine');

// Daca se executa interogarea, folosind execute() si valorile din $ar_val


if($prep->execute($ar_val)) {
// Parcurge si afiseaza randurile obtinute
while($row = $prep->fetch()) echo $row['nume'].' - '.$row['adresa'].'<br />';
}

$dbh = null; // Deconectare


}
catch(PDOException $e) {
echo $e->getMessage();
}
?>

- In expresia $sql = "SELECT `nume`, `adresa` FROM `sites` WHERE `id`= :id
OR `categorie`= :categorie";, ":id" si ":categorie" sunt parametri pentru
valorile care vor fi preluate din Array, de la elementele cu aceeasi denumire
la chei ('id' si 'categorie'). Datorita acestei notatii se poate folosi aceeasi
comanda SQL pregatita, cu valori diferite.
- Observati cat de usor se pot efectua mai multe interogari la baza de date,
folosind aceeasi declaratie SQL, doar prin apelarea lui "execute()" cu valorile
dorite.
Script-ul va afisa:
Cursuri - Tutoriale - www.marplo.net
Curs PHP-MySQL - www.marplo.net/php-mysql
Select-ul 2
Cursuri Engleza - www.marplo.net/engleza
In declaratia SQL pregatita, in loc de sintaxa :nume pentru locul valorilor se poate folosi
caracterul ?, dar in acest caz, Array-ul cu valorile trebuie sa fie secvential (adica cu chei
numere incepand de la 0), valorile vor fi preluate si adaugate la SQL in ordinea lor.
De exemplu:
$sql = "SELECT `nume`, `adresa` FROM `sites` WHERE `id`=? OR `categorie`=?";
$prep = $dbh->prepare($sql);
$prep->execute(array(2, 'programare'));

bindValue si bindParam
Un alt mod de a transmite valori la o interogare SQL pregatita cu
"prepare()" este utilizarea metodei bindValue() sau bindParam().
Utilizarea acestor metode in loc de Array are avantajul ca ofera un control
mai bun asupra valorilor transmise, putand fi specificate prin atributele lor
tipul de date si chiar numarul de caractere ce-l va avea valoarea transmisa.
Ele se aplica la obiectul PDOStatement obtinut cu "prepare()".
Diferenta dintre bindValue si bindParam este:

La bindValue se adauga direct valoarea si optional se poate specifica


numarul de caractere ce vor fi transmise. Sintaxa generala este:
bindValue(paramSQL, valoare, tip, nr_caractere)
- paramSQL este parametrul din declaratia SQL, specificat cu :nume, intre
ghilimele. Daca e folosit semnul-intrebarii ?, la paramSQL se adauga numarul
de ordine (incepand cu 1) al acelui parametru.
- tip e optional, la el se precifica o constanta prin care se defineste tipul de
date care trebuie transmis: PDO::PARAM_INT pt. numere intregi,
PDO::PARAM_STR pentru siruri.
- La nr_caractere se adauga, optional, numarul de caractere ce va fi transmis.
De exemplu:
$sql = "SELECT `nume`, `adresa` FROM `sites` WHERE `id`= :id OR `categorie`=
:categorie";
$prep = $dbh->prepare($sql);

$prep->bindValue(':id', 2, PDO::PARAM_INT); // Transmite valoarea 2 la coloana


"id"
$prep->bindValue(':categorie', 'programare', PDO::PARAM_STR, 10); //
Transmite valoarea "programare" la coloana "categorie"

$prep->execute();

La bindParam se adauga valoarea prin variabile. Sintaxa generala este:


bindParam(paramSQL, $var_val, tip)
- paramSQL este parametrul din declaratia SQL, specificat cu :nume, intre
ghilimele. Daca e folosit semnul-intrebarii ?, la paramSQL se adauga numarul
de ordine (incepand cu 1) al acelui parametru.
- $var_val e o variabila in care e stocata valoarea.
- tip e optional, la el se precifica o constanta prin care se defineste tipul de
date care trebuie transmis: PDO::PARAM_INT pt. numere intregi,
PDO::PARAM_STR pentru siruri.
De exemplu:
$sql = "SELECT `nume`, `adresa` FROM `sites` WHERE `id`=? OR `categorie`=?";
$prep = $dbh->prepare($sql);

$id = 2;
$cat = 'programare';

$prep->bindParam(1, $id, PDO::PARAM_INT); // Transmite valoarea din variabila


$id la coloana de la primul ? (adica "id")
$prep->bindParam(2, $cat, PDO::PARAM_STR); // Transmite valoarea din
variabila $cat la coloana de la al doilea ? (categorie)

$prep->execute();

Iata si un exemplu practic cu aceste doua metode, aplicat la tabelul "sites".


Se adauga doua randuri in tabel, unul dupa altul; primul folosindbindValue(),
iar al doilea cu bindParam()
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8"); // Setare encoding caractere UTF-8
// Definire comanda SQL care va fi aplicata in metoda prepare()
$sql = "INSERT INTO `sites` (`nume`, `categorie`, `adresa`) VALUES (:nume,
:categorie, :adresa)";
$prep = $dbh->prepare($sql); // Interogarea e pregatita si stocata in $prep

// Se adauga valori cu bindValue


$prep->bindValue(':nume', 'Curs Ajax', PDO::PARAM_STR);
$prep->bindValue(':categorie', 'programare', PDO::PARAM_STR);
$prep->bindValue(':adresa', 'www.marplo.net/ajax', PDO::PARAM_STR);

// Daca datele sunt adaugate cu succes, afiseaza confirmare cu id-ul randului


if($prep->execute()) echo 'A fost adaugat randul cu id='. $dbh->lastInsertId();

// Se definesc variabile cu valori ce vor fi incluse cu bindParam


$nume = 'Jocuri Flash';
$categorie = 'jocuri';
$adresa = 'www.marplo.net/jocuri';

// Se includ variabilele
$prep->bindParam(':nume', $nume, PDO::PARAM_STR);
$prep->bindParam(':categorie', $categorie, PDO::PARAM_STR);
$prep->bindParam(':adresa', $adresa, PDO::PARAM_STR);

// Daca datele sunt adaugate cu succes, afiseaza confirmare cu id-ul randului


if($prep->execute()) echo '<br />A fost adaugat randul cu id='. $dbh-
>lastInsertId();

$dbh = null; // Deconectare


}
catch(PDOException $e) {
echo $e->getMessage();
}
?>

- In browser va afisa:
A fost adaugat randul cu id=4
A fost adaugat randul cu id=5

Utilizarea combinatiei prepare() ... execute() este adesea mai rapida decat
query() / execute(). In plus, aceasta formula este utila cand trebuie folosita de
mai multe ori aceeasi declaratie SQL, cu parametri diferiti.
Un alt avantaj e acela ca datele ce trebuie transmise la serverul MySQL sunt
mai clar separate de comanda SQL, in plus sunt si filtrate. De exemplu, daca
se transmite cu o metoda "bind" sirul "a' b' c", PDO include sirul "a\' b\' c".

Daca interogarea SQL contine instructiunea LIKE cu un parametru,


caracterul '%' trebuie adaugat la valoarea transmisa.
De exemplu:
// incorect
$prep = $dbh->prepare("SELECT `coloana` FROM `tabel` WHERE `coloana` LIKE
%:cuvant%");
$prep->bindValue(':cuvant', 'valoare');

// E CORECT
$prep = $dbh->prepare("SELECT `coloana` FROM `tabel` WHERE `coloana` LIKE
:cuvant");
$prep->bindValue(':cuvant', '%valoare%');

- In lectia urmatoare va fi prezentat lucru cu metodele: setAttribute(),


beginTransaction() si commit().

PHP PDO - setAttribute si beginTransaction


Cand se creaza un obiect PDO cu o conexiune la o baza de date, daca
apare vreo eroare in transmiterea de comenzi la baza de date determina
lansarea PDOException. Daca eroarea nu e preluata cu try ... catch() PHP
va opri executia scriptului.
PDOException este o extensie a clasei PHP Exception, prin care pot fi
"prinse" erorile.
Cu formula try ... catch(), pe langa faptul ca eroarea e preluata iar scriptul
isi continua executia, se poate de asemenea si personaliza mesajul ce va fi
afisat. Sintaxa generala este:
try {
// ... Instructiuni PHP-PDO
}
catch(PDOException $e) {
echo 'Mesaj de eroare personalizat';
echo $e->getCode(). '-'. $e->getMessage(); // Afiseaza
codul si mesajul erorii dat de PHP
}

- Variabila $e reprezinta obiectul in care e stocata eroare detectata de PHP.


- Metoda getCode() returneaza codul erorii, iar getMessage() mesajul acelei
erori. Daca acestea nu sunt adaugate, apare doar mesajul personalizat.
1. setAttribute
Cu metoda PDO setAttribute() se pot seta diferite atribute la obiectul
PDO prin care se face conexiunea la baza de date, printre care si modul de
raportare a erorilor retinute cu "try ... catch()".
Formula generala de aplicare a acestei metode este:
$obiectPDO->setAttribute(ATRIBUT, OPTIUNE)
- ATTRIBUT reprezinta tipul atributului care va fi aplicat, iar OPTIUNE este
optiunea lui, cum ar fi:
PDO::ATTR_CASE - forteaza ca numele coloanelor sa fie returnate intr-un
mod specific, determinat cu una din urmatoarele optiuni:
o PDO::CASE_LOWER - denumirea coloanelor va fi returnata cu
litere mici.
o PDO::CASE_UPPER - numele coloanelor e retinut cu litere mari.
o PDO::CASE_NATURAL - lasa numele coloanelor asa cum sunt
returnate de baza de date
PDO::ATTR_ERRMODE - atribut folosit pentru specificarea modului de
raportare a erorillor, prin urmatoarele constante:
o PDO::ERRMODE_SILENT - determina ignorarea erorii, scriptul
trece mai departe fara sa returneze ceva legat de eroarea
respectiva.
o PDO::ERRMODE_WARNING - emite eroarea ca avertisment PHP
standard.
o PDO::ERRMODE_EXCEPTION - returneaza informatia despre
eroare, data de PDOException.

Iata cum se aplica si ce rezultate da metoda setAttribute(), va fi utilizat


acelasi tabel MySQL din lectiile precedente (denumit "sites").

- In urmatorul exemplu se foloseste atributul PDO::ATTR_CASE cu optiunea


PDO::CASE_UPPER.
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8"); // Setare encoding caractere UTF-8

// Seteaza ca numele coloanelor sa fie returnat cu majuscule


$dbh->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);

// Selecteaza primul rand


$sql = "SELECT * FROM `sites` LIMIT 1";
$datas = $dbh->query($sql)->fetch(PDO::FETCH_ASSOC); // Executa interogarea
si preia in modul FETCH_ASSOC

// Daca select-ul e facut cu succes ($datas nu e false)


if($datas !== false) {
// Se parcurg datele si afiseaza numele coloanelor
foreach($datas as $col=>$row) {
echo ' - '. $col;
}
}

$dbh = null; // Deconectare


}
catch(PDOException $e) {
echo $e->getMessage();
}

- Script-ul va afisa in browser numele coloanelor, cu majuscule:


- ID - NUME - CATEGORIE - ADRESA

- In exemplu urmator se foloseste metoda setAttribute() pentru a afisa in


caz de eroare modul standard returnat de PHP. Se aplica atributul
PDO::ATTR_ERRMODE cu optiunea PDO::ERRMODE_WARNING. Pentru a forta
generarea erorii, se face un SELECT la o coloana ce nu exista in tabelul
"sites".
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';

try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);

// Seteaza ca mod pt. erori cel standard PHP


$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$dbh->exec("SET CHARACTER SET utf8"); // Setare encoding caractere UTF-8

// Selecteaza primul rand


$sql = "SELECT `zzz` FROM `sites` LIMIT 1";
$datas = $dbh->query($sql); // Executa interogarea

// Se parcurg datele si afiseaza ce e in coloana 'zzz'


foreach($datas as $row) {
echo $row['zzz'];
}

$dbh = null; // Deconectare


}
catch(PDOException $e) {
echo $e->getMessage();
}

- Deoarece coloana "zzz" nu exista, va emite urmatoarea eroare:


Warning: PDO::query() [pdo.query]: SQLSTATE[42S22]: Column not found:
1054 Unknown column 'zzz' in 'field list' in E:\server\www\test.php on line 19
Warning: Invalid argument supplied for foreach() in E:\server\www\test.php on
line 22
- Daca la setAttribute, in loc de ERRMODE_WARNING se adauga
ERRMODE_EXCEPTION, informatia afisata despre eroare va fi:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'zzz' in 'field list'
2. beginTransaction
Metoda beginTransaction() se foloseste impreuna cu commit().
beginTransaction() opreste executia oricarei interogari la baza de date,
pana cand e apelata metoda commit(), in acel moment vor fi executate
declaratiile SQL adaugate intre aceste 2 metode.
Avantajul acestei tehnici consta in faptul ca pot fi scrise mai multe seturi de
interogari SQL, care "stau in asteptare", iar cand e apelata
metoda commit() sunt executate toate deodata.

In exemplu urmator se aplica beginTransaction() care permite scrierea de


instructiuni SQL fara ca acestea sa fie transmise la serverul MySQL. Se
adauga 3 comenzi: prima modifica datele din randul unde id=3 (cu UPDATE),
a doua (cu INSERT) adauga un nou rand, iar a treia comanda efectueaza un
SELECT, dar in functie de ultimul "id" creat prin INSERT-ul precedent. Toate
aceste instructiuni sunt executate cand e apelata metoda commit() (vedeti
si explicatiile din cod).
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';
try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //
Seteaza mod exception pt. erori
$dbh->exec("SET CHARACTER SET utf8"); // Setare encoding caractere UTF-8

$dbh->beginTransaction(); // Incepe inscrierea comenzilor

// 1. Modificare date din coloanele "nume" si "adresa", unde id=3


$dbh->exec("UPDATE `sites` SET `nume`='Cursuri Spaniola',
`adresa`='www.marplo.net/spaniola' WHERE `id`=3");
// 2. Adaugare date in rand nou
$dbh->exec("INSERT INTO `sites` (`nume`, `categorie`, `adresa`) VALUES
('JavaScript', 'programare', 'www.marplo.net/javascript')");
$last_id = $dbh->lastInsertId(); // Retine ultimul id adaugat
// 3. Selectare date din randurile anterioare celui adaugat inainte ("id" mai mic
decat $last_id)
$datas = $dbh->query("SELECT `nume`, `adresa` FROM `sites` WHERE
`id`<'$last_id'");

$dbh->commit(); // Determina transmiterea tuturor comenzilor la MySQL

// Daca select-ul e facut cu succes ($datas nu e false)


if($datas !== false) {
echo 'Ultimul id adaugat: '. $last_id. '<br />'; // Afiseaza ultimul id adaugat (la
comanda 2)

// Se parcurg si afiseaza datele selectate


foreach($datas as $row) {
echo $row['nume']. ' - '. $row['adresa']. '<br />';
}
}

$dbh = null; // Deconectare


}
catch(PDOException $e) {
echo $e->getMessage();
}
?>

- Dupa cum arata si exemplu, aceasta metoda este utila in cazul cand trebuie
efectuate mai multe interogari diferite la baza de date, in acelasi script. In
plus, imbunatateste si viteza de executie a scriptului, face mai eficient lucru
cu multiple interogari la baza de date. Intre comenzile SQL care "sunt in
asteptare" se pot adauga diferite instructiuni PHP care sa influenteze
urmatoarele comenzi (precum aici SELECT-ul a fost facut in functie de ultimul
"id" creat prin comanda precedenta).
- Dupa executie, scriptul afiseaza in browser urmatorul rezultat:
Ultimul id adaugat: 4
Cursuri - Tutoriale - www.marplo.net
Curs PHP-MySQL - www.marplo.net/php-mysql
Cursuri Spaniola - www.marplo.net/spaniola
Daca atributul setAttribute() e setat pe modul ERRMODE_WARNING si apare vreo eroare
la una din declaratiile SQL dintre beginTransaction() si commit(), cand acestea sunt
transmise la server, celelalte comenzi dupa cea care a determinat eroarea nu mai sunt
executate.
Dar daca nu e specificat modul de eroare ERRMODE_WARNING, scriptul continua executia si
la celelalte comenzi.

PHP Functii Anonime - Closures


Incepand cu versiunea 5.3, PHP a introdus Functii Anonime, cunoscute si cu
denumirea Closures.
Acest tip de functii sunt fara nume. Sunt utile mai ales in retuenarea unor
valori la apeluri in cadrul altor functii.

1. Exemplu, functie anonima folosita pentru returnarea unei valori intr-o


functie PHP.
<?php
$arr = array(' hello word ', ' Have <b>good day</b>');

// sterge tag-urile si spatiile exterioare din fin fiecare element din array
// Face majuscula prima litera a fiecarui cuvant
$arr = array_map(function($elm){
return ucwords(trim(strip_tags($elm)));
}, $arr);

var_export($arr); // array ( 0 => 'Hello Word', 1 => 'Have Good Day' )


?>

2. Closures pot fi utilizate si ca valori ale variabilelor (observati cum e apelata


functia, folosind numele variabilei, inclusiv caracterul $).
<?php
$website = function($name) {
return 'http://www.'. $name. '.net';
};

echo $website('coursesweb'); // http://www.coursesweb.net


echo $website('marplo'); // http://www.marplo.net
?>

3. Closures pot fi create si in interiorul altor functii. In urmatorul exemplu se


foloseste closures pt creare liste HTML, <li>.
<?php
// primeste un array cu elementele ce vor forma liste <li>
function ulList($ar_items) {
$li = function($item) {
return '<li>'. $item. '</li>';
};

// parcurge array-ul din parametru, apeleaza $li() ca sa creeze <ul><li>


$ul = '<ul>';
foreach($ar_items as $item) {
$ul .= $li($item);
}
$ul .= '<ul>';

return $ul;
}

$ar_items = array('li 1', 'li 2', 'li 3');


echo ulList($ar_items); // <ul><li>li 1</li><li>li 2</li><li>li 3</li><ul>
?>

- Un alt exemplu cu functie anonima in interiorul altei functii. Observati


utilizarea lui use() , pentru a putea folosi variabile din afara functiei anonime
in interiorul ei.
<?php
function test($a) {
$b = $a / 2;
$c = function($a) use($b) {
return $a + $b;
};
return $c($a);
}

echo test(10); // 15
?>

4. Closures pot fi un instrument util si in programarea orientata pe obiecte.


Incepand cu PHP 5.4 , expresia $this poate fi utilizata in functii anonime.
<?php
class A {
private $value = 1;
public function getVal() {
return function() { return $this->value * 2; };
}
}

$a = new A;
echo $a->getVal(); // 2
?>

Trimitere date la o adresa de e-mail


Part. 2

Invatati sa trimiteti mesaje si date dintr-un formular la o casuta de e-mail.

Este util sa avem pe o pagina din site un formular prin care vizitatorii sa
poata trimite mesaje la o adresa de e-mail.
Am putea lasa pe pagina doar adresa de e-mail la care vizitatorii sa ne
poata contacta, dar aceasta metoda (comoda pt. webmaster) nu este
indicata. In primul rand din cauza programelor bot care circula pe net si
colecteaza adresele de e-mail de pe site-uri pentru ca mai tarziu sa
transmita mail-uri spam. In al doilea rand este mai simplu si mai rapid
pentru vizitator sa trimita mesajul direct de pe site.

In cadrul acestei lectii este explicat un mod simplu de utilizare a limbajului


PHP pentru a expedia la o adresa de e-mail date sub forma de text, preluate
de la un formular HTML.
Pentru a putea expedia datele la adresa de mail, scripturile PHP trebuie sa
fie capabile de a obtine accesul la serviciile SMTP (Simple Mail Transfer
Protocol).
Daca folositi serviciile oferite de un "web hosting", majoritatea au
implementate aceste functii.
Daca folositi propriul sistem pentru gazduirea site-ului, sau pentru teste,
este nevoie sa aveti instalat si un server SMTP, acesta preia datele
prelucrate de modulul PHP si le trimite la adresa de e-mail.
Expedierea mesajelor de e-mail
Configuratia PHP standard accepta expedierea mesajelor de e-mail prin
intermediul SMTP (abreviere de la Simple Mail Transfer Protocol). Acesta este
protocolul standard folosit pentru transferul mesajelor de e-mail, prin
intermediul Internetului.
Mesajele de e-mail sunt alcatuite din doua parti: o serie de antete de mesaj
si un corp.
- Antetele de mesaj indica adresa destinatarului si subiectul mail-ului,
precum si alte informatii.
- Corpul contine mesajul in sine.

Pentru a trimite datele la o adresa de e-mail, se foloseste functia mail(), care


preia 3 argumente principale, avand urmatoarea forma:
mail($to, $subject, $message)

Unde, in ordinea argumentelor:


- primul argument, aici variabila "$to", va contine adresa de e-mail a
destinatarului (unde va fi trimis mesajul)
- al doilea argument, aici variabila "$subject", va contine subiect-ul mail-
ului
- al treilea argument, aici variabila "$message" va contine mesajul

Functia "mail()" poate contine si alte adrese de e-mail optionale, astfel un al


patrulea argument poate fi "From", care indica adresa de e-mail a
expeditorului (cel care trimite mesajul).
Functia ar avea astfel urmatoarea forma:
mail($to, $subject, $message, $from )

- Variabila "$from" trebuie sa contina in sir cuvantul "From: " inaintea adresei
de e-mail, adica asa:
$from="From: [email protected]";
- Daca argumentul "$from" nu este specificat, serverul va transmite automat
aceasta adresa (in functie de cum este configurat). Astfel, cand primim mail-
ul, pe langa subiect vom avea adresa expeditorului, si daca nu este
specificata, putem vedea ceva de genul "[email protected]"

Datele pentru aceste argumente, in special al treilea (aici "$message"), pot fi


preluate dintr-un formular HTML, folosind functia "$_POST".
Functia "mail()" returneaza TRUE daca mail-ul a fost acceptat pentru
expediere, in caz contrar returneaza FALSE.

Iata un script PHP simplu care va trimite mesaje la o adresa de e-mail:


<?php
// Verifica daca au fost trimise datele de la formular
if (isset($_POST['email']) && isset($_POST['mesaj'])) {
$to = '[email protected]'; // Adresa unde va fi trimis mesajul
$subiect = 'Mesaj de pe site';
$mesaj = $_POST['mesaj'];
$from = 'From: '. $_POST['email'];

// PHP trimite datele la serverul de e-mail


if (mail($to, $subiect, $mesaj, $from)) {
echo 'Mesajul a fost trimis cu succes.';
}
else {
echo 'Eroare, mesajul nu a putut fi expediat.';
}
}
?>
- Intai se verifica (cu isset()) daca au fost trimise date de la formularul HTML.
Fara aceasta verificare, s-ar expedia mesaje de e-mail ori de cate ori cineva
(intentionat) acceseaza direct fisierul php cu scriptul.
- Variabilele "$mesaj" si "$from" preiau datele adaugate de vizitator in
campurile unui formular HTML care au atributele 'name="mesaj"' si
'name="email"'.
Daca functia "mail()" este executata cu succes, va apare mesajul "Mesajul a
fost trimis cu succes.", in caz contrar va afisa "Eroare, mesajul nu a putut fi
expediat.".
Un model de cod HTML pentru crearea formularului care trimite datele la
scriptul php de mai sus este urmatoru:
<h3>Trimiteti mesaj</h3>
<form name="form" method="post" action="nume_script.php">
<label>E-mail : </label>
<input type="text" name="email" size="20" /> <br />
<label>Scrie mesajul : </label> <br />
<textarea name="mesaj" cols="35" rows="6"></textarea> <br />
<input type="submit" value="Trimite" />
</form>
- "nume_script.php" este calea si numele fisierului in care se afla scriptul php
de mai sus.
In browser va apare:
Trimiteti mesaj

E-mail :
Scrie mesajul :

Trimite
La sectiunea Mailer gasiti un "mailer" mai complet.

- In Partea 2 invatati cum sa trimiteti mail-uri cu PHP care pot cotine tag-uri
HTML si cod CSS.
Part. 2

Creare imagini cu PHP


Invatati sa creati si sa afisati imagini cu PHP
Invatati sa afisati mai multe imagini generate de PHP in aceeasi pagina

Pe langa crearea de cod de tip text (HTML, XML, ...), PHP poate fi folosit si
pentru crearea si manipularea de imagini cu diferite formate (GIF, PNG,
JPEG, WBMP si XPM).
PHP are implemetat cateva functii pentru lucru cu informatii legate de
imagini, cum ar fi lungimea, latimea sau extensia imaginii. Pentru crearea
de noi imagini sau manipularea celor existente este necesar sa aveti instalat
in PHP o librarii GD cu functii pentru imagini. Pentru mai multe informatii
despre cerinte si instalare librarie GD, vizitati GD library.
- Daca folositi WampServer sau Xampp, acestea au deja incluse
librarii GD.
Puteti afla informatii despre libraria GD instalata folosind functia gd_info(),
aceasta returneaza o matrice cu informatii despre libraria GD inclusa.
Exemplu:
<?php
var_dump(gd_info());
?>

1. Crearea imaginilor
Pentru crearea unei imagini cu PHP sunt esentiali urmatorii pasi:
- Definirea identificatorului de imagine si suprafata de baza a imaginii.
- Stabilirea culorilor fundalului, formei sau a textului din imagine.
- Trimiterea datelor de iesire cu imaginea creata.
- Eliberarea memoriei asociata creeri imaginii.

Cam asta e, pe scurt, partea teoretica, acum sa trecem la practica, voi


prezenta pas cu pas un script PHP simplu care va afisa in browser o imagine
PNG formata dintr-un dreptunghi cu fundal albastru si in interior un text.
Scriptul este urmatorul:
<?php
$text = 'Textul din imagine';

// setare dimensiuni suprafetei de baza


$height = 40;
$width = 170;
// definirea imaginii
$im = imagecreate($width, $height);

// setare culori
$fundal = imagecolorallocate($im, 10, 10, 250);
$text_color = imagecolorallocate($im, 255, 255, 255);

// finalizarea imaginii
imagefill($im, 0, 0, $fundal);
imagestring($im, 4, 10, 15, $text, $text_color);

// trimiterea datelor de iesire


header('Content-type: image/png');
imagepng($im);

// curatarea memoriei
imagedestroy($im);
?>
- Acest script va afisa urmatorul rezultat

Sa studiem acest script


- Pentru inceput am setat variabila "$text" ce contine textul care va fi
adaugat in imagine, si variabilele "$height" si "$width" care reprezinta
dimensiunile imaginii.
- In continuare avem "$im = imagecreate($width, $height)",
functia imagecreate() returneaza un identificator de imagine ce creaza
suprafata de baza a imaginii, prelund ca argumente dimensiunile acesteia (in
pixeli).
- Ca alternativa se poate folosi o imagine deja existenta, peste care sa
adaugati testul, pentru aceasta se foloseste
functiaimagecreatefrompng("nume.png") (sau
"imagecreatefromjpeg()", "imagecreatefromgif()"; in functie de tipul
imaginii), exemplu: $im = imagecreatefrompng("img.png")

- Urmatorul pas este definirea culorii pentru fundal si pentru text, pentru
aceasta se foloseste functia imagecolorallocate(), aceasta returneaza un
identificator de culoare care va fi folosit pentru accesarea culorii si preia 4
argumente: primul argument este identificatorul de imagine creat cu
"imagecreate()" (in script este in variabila "$im"), urmatoarele trei argumente
reprezinta valorile RGB (Red, Green, Blue) pentru stabilirea culorii.
- Pentru adaugarea culorii de fundal se foloseste functia imagefill(),
care preia 4 argumente (in script avem "imagefill($im, 0, 0, $fundal);"),
argumentele sunt:
- identificatorul de imagine
- urmatoarele doua argumente definesc coordonatele X si Y de start
pentru umplerea culorii (0, 0)
- ultimul argument reprezinta identificatorul de culoare folosit (aici cel din
variabila $fundal)

- Pentru adaugarea textului in cadrul imaginii se foloseste


functia imagestring(), aceasta preia 6 argumente:
1. - identificatorul de imagine
2. - tipul fondului folosit, care poate fi un numar intre 1 si 5, reprezentand
fonturi prestabilite
o - ca alternativa se poate folosi functia imageloadfont(), pentru
includerea de alte fonturi
3. - al treilea argument reprezinta distanta, in pixeli, fata de marginea din
stanga a imaginii
4. - al patrulea argument reprezinta distanta, in pixeli, fata de marginea de
sus a imaginii
5. - al cincilea argument reprezinta sirul introdus
6. - ultimul argument este culoarea textului

- Urmatotul pas este trimiterea datelor de iesire pentru afisarea in


browser.
- Pentru aceasta intai scriptul spune browser-ului ca trimite o imagine si nu
test sau HTML, se face acest lucru folosind functia header() cu tipul
MIME al imaginii "header('Content-type: image/png')". Daca doriti ca
imaginea sa fie de tip JPEG (sau GIF) inlocuiti "png" cu "jpeg" (sau "gif"),
astfel 'Content-type: image/jpeg'.
- dupa ce s-au trimis datele pentru "header", se trimit datele imaginii
utilizand functia imagepng() (sau "imagejpeg()", "imagegif(); in functie
de tipul imaginii") care preia ca argument identificatorul de imagine (in
script avem "imagepng($im)")
o Ca alternativa, imaginea poate fi scrisa intr-un fisier, in loc sa fie
afisata in browser o salvati pe server, pentru aceasta se adauga un
al doilea parametru la "imagepng()" reprezentand numele
fisierului, exemplu "imagepng($im, "img.png")" si nu se mai scrie
functia "header()". (trebuie sa aveti permisiuni de scriere pe
server)

- In final s-a folosit functia imagedestroy() (care foloseste ca argument


identificatorul de imagine) pentru eliberarea resurselor de memorie folosite la
crearea imaginii.
2. Utilizarea imaginilor create cu PHP
Deoarece un header poate fi trimis numai o data pentru o pagina, si asta
este singura cale de a spune browser-ului ca sunt trimise date de imagine,
poate deveni mai dificil cand se doreste crearea si afisarea mai multor
imagini cu PHP.
In acest caz:

a) Puteti folosi scriptul pentru a salva imaginea pe server (dupa cum a fost
explicat mai sus) si apoi folositi etichete <img> pentru afisarea imaginii
- Exemplu:
<?php
$text = 'Textul din imagine';

// setare dimensiuni
$height = 50;
$width = 170;
$im = imagecreate($width, $height);

// setare culori
$fundal = imagecolorallocate($im, 10, 10, 250);
$text_color = imagecolorallocate($im, 255, 255, 255);

// finalizarea imaginii
imagestring($im, 4, 10, 15, $text, $text_color);

// salvarea imaginii pe server


imagepng($im, "img.png");

// curatarea memoriei
imagedestroy($im);
?>

<img src="img.png" alt="Afisare 1" />


--- <img src="img.png" alt="Afisare 2" />
- Acest script va afisa urmatorul rezultat

---

b) O alta metoda este scrierea intr-un fisier php extern a scriptului care
genereaza si afiseaza imaginea, apoi apelati scriptul PHP in atributulsrc, ca in
exemplul urmator:
<img src="script_img.php" alt="Afisare 1" />
--- <img src="script_img.php" alt="Afisare 2" />
- Unde "script_img.php" este fisierul PHP care genereaza si afiseaza
imaginea

Functii utile pentru lucrul cu imagini


Invatati si exersati diferite functii pentru crearea si manipularea imaginilor
Invatati sa copiati si sa redimensionati suprafete din imagini

In aceasta lectie sunt prezentate, cu exemple, cateva functii utile pentru


lucrul cu imagini generate de PHP.
1. Functia imageline()
- Aceasta functie deseneaza o linie in cadrul imaginii, sintaxa generala
este urmatoarea:
imageline("identificator_im", "x1", "y1", "x2", "y2", "id_culoare")

Unde
- "identificator_im" reprezinta identificatorul de imagine returnat de o
functie pentru crearea imaginii, cum e "imagecreate",
"imagecreatetruecolor" sau "imagecreatefrompng" (pt. imagine PNG)
- "x1" si "y1" reprezinta coordonatele de start (x, y) pentru punctul de
incepere a liniei (in pixeli, in raport cu marginea din stanga si de sus)
- "x2" si "y2" reprezinta coordonatele de final (x, y) pentru punctul de
terminare a liniei (in pixeli, in raport cu marginea din stanga si de sus)
- "id_culoare" reprezinta identificatorul de culoare folosit pentru culoarea
liniei (returnat de functia "imagecolorallocate")

Iata un exemplu:
<?php
// setare dimensiuni
$height = 40;
$width = 170;
// definirea cadrului de baza a imaginii
$im = imagecreate($width, $height);

// setare culori
$fundal = imagecolorallocate($im, 10, 10, 250);
$line_color = imagecolorallocate($im, 200, 220, 8);

// crearea imaginii
imagefill($im, 0, 0, $fundal);
imageline($im, 50, 10, 120, 10, $line_color); // prima linie
imageline($im, 40, 20, 130, 20, $line_color); // a doua linie

// trimiterea datelor de iesire


header('Content-type: image/jpeg');
imagejpeg($im);

// curatarea memoriei
imagedestroy($im);
?>
- Comentariile necesare sunt deja in codul scriptului.
- Functia "imageline()", folosita de 2 ori, va crea doua linii dupa coordonatele
dintre paranteze.
- Rezultatul accestui script este imaginea de mai jos

2. Functia imagearc()
- Aceasta functie deseneaza un arc de cerc centrat pe anumite coordonate
date. Sintaxa generala este urmatoarea:
imagearc("identificator_im", "x1", "y1", "width", "height", "start",
"end", "id_culoare")

Unde
- "identificator_im" reprezinta identificatorul de imagine returnat de o
functie pentru crearea imaginii, cum e "imagecreate",
"imagecreatetruecolor" sau "imagecreatefrompng" (pt. imagine PNG)
- "x1" si "y1" reprezinta coordonatele de start (x, y) pentru centrul arcului
de cerc (in pixeli, in raport cu marginea din stanga si de sus)
- "width" si "height" reprezinta lungimea, respectiv inaltimea, arcului de
cerc.
- "start" reprezinta unghiul de inceput al arcului de cerc, in grade
- "end" reprezinta unghiul de sfarsit al arcului de cerc, in grade. 0 o este
localizat la pozitia orei 3, arcul de cerc fiind desenat in sensul acelor
ceasornicului.
- "id_culoare" reprezinta identificatorul de culoare folosit pentru culoarea
liniei arcului de cerc (returnat de functia "imagecolorallocate")

Iata un exemplu:
<?php
// setare dimensiuni
$height = 100;
$width = 100;
// definirea imaginii
$im = imagecreate($width, $height);

// setare culori
$fundal = imagecolorallocate($im, 10, 10, 250);
$cerc_color = imagecolorallocate($im, 220, 220, 8);
$arc_color = imagecolorallocate($im, 250, 2, 2);

// crearea imaginii
imagefill($im, 0, 0, $fundal);
imagearc($im, 30, 25, 20, 20, 0, 360, $cerc_color); // primul cerc
imagearc($im, 70, 25, 20, 20, 0, 360, $cerc_color); // al doilea cerc
imagearc($im, 50, 44, 70, 70, 25, 150, $arc_color); // ultimul arc de cerc

// trimiterea datelor de iesire


header('Content-type: image/jpeg');
imagejpeg($im);

// curatarea memoriei
imagedestroy($im);
?>
- Comentariile necesare sunt deja in codul scriptului.
- Functia "imagearc()", folosita de 3 ori, va crea arce de cerc dupa
coordonatele dintre paranteze. (Testati singuri scriptul, modificand valorile
argumentelor)
- Rezultatul accestui script este imaginea de mai jos

- Observati ca pot fi create cercuri complete sau arce de cerc, in functie de


valoarea in grade a argumentului sapte ("end").
- Pentru a desena un arc de cerc (sau cerc) cu suprafata colorata, nu
doar linia de margine, folositi functia "imagefilledarc()".
3. Functia getimagesize()
- Aceasta functie returneaza o matrice cu mai multe elemente ce contin
date despre tipul si dimensiunile imagini.
Mai importante sunt primele 2 elemente din matrice (index 0 si 1) care
reprezinta lungimea, respectiv inaltimea imaginii; si al patrulea element
(index 3) care este un sir cu dimensiunile imaginii.
Iata un exemplu:
<?php
$img = 'imagini/image.png'; // calea catre fisierul cu imaginea
$size = getimagesize($img);
echo "$size[0] - $size[1] <br /> $size[3]";
?>
- "getimagesize()" preia ca argument imaginea si stocheaza datele (matricea)
in variabila "$size".
- acest script va afisa un rezultat similar cu cel de mai jos (depinde de
imaginea folosita)
270 - 100
width="270" height="100"
4. Functia imagecopy()
- Aceasta functie copie o portiune dintr-o imagine data. Sintaxa generala
este urmatoarea:
imagecopy("identificator_im2", "identificator_im1", "x2", "y2",
"x1", "y1", "width", "height")

Unde
- "identificator_im2" reprezinta identificatorul celei dea doua imagini,
rezultata prin suprafata copiata
- "identificator_im1" reprezinta identificatorul primei imagini (sursa), din
care va fi copiata portiunea
- "x2" si "y2" reprezinta coordonatele de start (x, y) din cadrul celei dea
doua imagini, punctul de unde va incepe adaugarea imaginii rezultata
prin suprafata copiata
- "x1" si "y1" reprezinta coordonatele de start (x, y) din prima imagine, de
unde va incepe copierea (in pixeli, in raport cu marginea din stanga si de
sus)
- "width" si "height" reprezinta lungimea, respectiv inaltimea, suprafetei
copiate.

Iata un exemplu:

- Avem initial aceasta imagine


- In continuare urmatorul script va copia si afisa o portiune din imagine

<?php
// preluarea imaginii sursa
$im1 = imagecreatefrompng('imgs/marplo.png');

// definirea identificatorului si a cadrului pt. imaginea 2


// care va rezulta cu suprafata copiata
$im2 = imagecreatetruecolor(170, 50);

// Copierea suprafetei
imagecopy($im2, $im1, 10, 0, 30, 10, 170, 50);

// datele de iesire
header('Content-Type: image/png');
imagepng($im2);

// eliberarea memoriei
imagedestroy($im2);
imagedestroy($im1);
?>
- "imagecopy()" va copia o suprafata din prima imagine, reprezentata prin
"$im1" si o va incadra in cea dea doua imagine, reprezentata prin "$im2"
(conform coordonatelor date).
- Acest script va returna urmatorul rezultat:

5. Functia imagecopyresized()
- Aceasta functie copie si redimensioneaza o portiune dintr-o imagine data.
Sintaxa generala este urmatoarea:
imagecopyresized("identificator_im2", "identificator_im1", "x2",
"y2", "x1", "y1", "width2", "height2", "width1", "height1")

Unde
- "identificator_im2" reprezinta identificatorul celei dea doua imagini,
rezultata cu suprafata copiata si redimensionata
- "identificator_im1" reprezinta identificatorul primei imagini (sursa), din
care va fi copiata portiunea
- "x2" si "y2" reprezinta coordonatele de start (x, y) din cadrul celei dea
doua imagini, punctul de unde va incepe adaugarea imaginii rezultata
prin suprafata copiata si redimensionata
- "x1" si "y1" reprezinta coordonatele de start (x, y) din prima imagine, de
unde va incepe copierea suprafetei (in pixeli, in raport cu marginea din
stanga si de sus)
- "width2" si "height2" reprezinta lungimea, respectiv inaltimea, suprafetei
rezultata dupa redimensionare.
- "width1" si "height1" reprezinta lungimea, respectiv inaltimea, suprafetei
copiate.

Iata un exemplu:

- Avem initial aceasta imagine


- In continuare urmatorul script va copia, redimensiona si afisa o portiune
din imagine

<?php
// preluarea imaginii sursa
$im1 = imagecreatefrompng('imgs/marplo.png');

// definirea identificatorului si a cadrului pt. imaginea 2


// care va rezulta cu suprafata copiata si redimensionata
$im2 = imagecreatetruecolor(80, 20);

// Copierea si redimensionarea suprafetei


imagecopyresized($im2, $im1, 0, 0, 10, 10, 80, 20, 170, 50);

// datele de iesire
header('Content-Type: image/png');
imagepng($im2);

// eliberarea memoriei
imagedestroy($im2);
imagedestroy($im1);
?>
- "imagecopyresized()" va copia o suprafata din prima imagine =,
reprezentata prin "$im1" si o va redimensiona si incadra in cea dea doua
imagine, reprezentata prin "$im2" (conform coordonatelor date).
- Acest script va returna urmatorul rezultat:

- Pentru copierea si redimensionarea imaginii cu "resambling", puteti folosi


functia imagecopyresampled().

O lista completa cu functiile care pot fi folosite pentru lucrul cu imagini in PHP gasiti
aici Functii pentru imagini

Creare PDF cu PHP


Part. 2

In aceasta lectie veti invata cum sa creati documente PDF cu PHP

Pe langa date de tip text sau imagini, cu PHP puteti crea si documente in
format PDF (care pot fi citite cu Adobe Acrobat Reader), utile in special cand
se doreste scoaterea la imprimanta a paginilor.
Pentru crearea documentelor de tip PDF pot fi utilizate functii care folosesc
libraria PDFlib. Pentru a folosi functiile specifice acestei librarii trebuie sa
aveti PDFlib instalat si activat in modulul PHP. Incepand cu versiunea PHP 5
si PDFlib 6 functiile acesteia sunt apelate ca metodele unei clase. Pe langa
faptul ca unele sisteme nu au instalata sau activata aceasta librarie de
functii, trebuie sa tineti cont la scrierea programului si de versiunile PHP si
PDFlib pe care le folositi, acest lucru poate fi mai dificil pentru incepatori.
Totusi, daca sunteti interesati gasiti documentatia pentru crearea
documentelor PDF cu PDFlib la pagina creare PDF cu PHP si PDFlib.

O alta modalitate mai simpla de a crea documente PDF cu PHP este folosirea
unei clase numite FDPF. Avantajul este ca aceasta clasa nu necesita
instalarea PDFlib si este gratuita. Aveti nevoie doar de fisierul PHP care
contine clasa FPDF si un director cu fonturile pe care le puteti folosi in
documentul PDF, acestea le puteti descarca de aici Download Clasa
FPDF sau de pe site-ul oficial www.fpdf.org.
Documentatia si tutorialele in limba engleza le puteti descarca si de aici
-> Documentatie Clasa FPDF.

Aceasta lectie are doua parti, in prima parte, aici, voi explica lucrile de baza
(pentru incepatori) in crearea documente PDF folosind class FPDF, iar in
partea a doua sunt prezentate cateva metode mai avansate.
1. Primul document PDF
Primul pas e sa copiati pe server fisierul PHP cu clasa FPDF si directorul cu
fonturile, apoi in fisierul dv. php includeti aceasta clasa dupa care urmeaza
datele necesare creari documentului PDF.
Aceste date trebuie sa fie in principal urmatoarele:
1. Se creaza obiectul ce va reprezenta documentul PDF. Pentru aceasta se
foloseste expresia new FPDF(), aceasta poate prelua 3 argumente,
exemplu: new FPDF('P','mm','A4'); primul argument defineste orientarea
paginii (P - Portrait sau L - Landscape), al doilea argument e pentru
unitatea de masura (mm - milimetri, cm - centimetri, pt - point), iar
ultimul argument este pt. formatul paginii (A3, A4, A5, Letter). Daca nu
sunt specificate argumente, documentul va avea valorile implicite:
Portrait, milimetri, A4.
2. Se adauga elemente ce definesc fontul, grafica, textul, imagini si altele.
Pentru aceasta se folosesc metodele (functiile) clasei FPDF.
- Aici, inainte de a adauga text, apelati metoda
pentru initializarea paginii, functia AddPage(), si metoda pentru
definirea fontului SetFont().
3. La urma se trimit datele de iesire cu metoda Output(), aceasta poate
prelua 2 argumente, avand forma generala.
Output('file', 'action')
- unde 'file' este numele documentului PDF creat, exemplu
'doc.pdf'
- iar 'action' poate fi unul din literele: 'I', 'D', 'F' sau 'S' care
reprezinta actiunea ce se va efectua
- I trimite fisierul pdf sa fie afisat in browser
- D deschide optiunea de download a documentului
PDF
- F salveaza fisierul pdf pe server, cu numele (si calea)
adaugat in primul atribut
- S returneaza documentul ca string (sir), numele este
ignorat.
Daca metoda Output() este apelata fara atribute, documentul PDF va
fi afisat direct in browser.

Pentru ca documentul PDF creat sa poata fi vizualizat de browser sau


descarcat, browser-ul clientului trebuie sa aibe instalat plug-in-ul pentru
Adobe Reader.
Cand continutul pe care doriti sa-l afisati in pagina PDF depsaseste inaltimea
acesteia, se va genera automat o pagina noua.
Iata un exemplu simplu in care este creata o pagina PDF si in ea un text.
<?php
include('fpdf.php');
$pdf=new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','',16);
$pdf->Text(25,40,'Prima pagina PDF.');
$pdf->Output();
?>
- Dupa includerea fisierului cu clasa FPDF 'fpdf.php' am definit obiectul FPDF()
stocat in variabila "$pdf", cu aceasta se va apela metodele clasei.
- Odata obiectul creat, am initializat crearea paginii cu "$pdf->AddPage()",
apoi am setat fontul apeland metoda specifica "$pdf->SetFont('Arial','B',16)"
- primul argument este numele fontului, al doilea este pentru stil (B-bold, I-
italic, U-underline, null-normal).
- In continuare am apelat metoda Text() pentru crearea textului, aceasta preia
3 argumente: primul argument reprezinta distanta X fata de marginea din
stanga (aici 25), al doilea argument reprezinta distanta Y fata de marginea de
sus (aici 40) si ultimul este textul care va apare in pagina PDF.
- Dupa ce am definit toate aceste elemente, apelam metoda Output(), fara
atribute, care trimite datele de iesire pentru afisarea documentului PDF.
- Daca doriti salvarea acestuia pe server, apelati aceasta metoda astfel
$pdf->Output('fisier.pdf', 'F'); (in acest caz, PHP trebuie sa aibe permisiuni
de creare fisiere pe server). Daca doriti ca utilizatorului sa-i apara optiunea
de download, apelati aceasta metoda asa: $pdf->Output('fisier.pdf', 'D');
(fisierul nu va fi salvat si pe server).
- Puteti vedea rezultatele acestui exemplu aici -> Demo 1.

In documentatia FPDF gasiti metodele pe care aceasta clasa le poate folosi,


rolul lor si argumentele pe care le preia fiecare.
2. Adaugarea unei celule cu text
Pe langa text simplu, puteti adauga si celule (cadre) in care sa fie adaugat
textul. Aceste celule le puteti crea cu metoda Cell(); sunt similare cu DIV-ul
din HTML, le putem defini suprafata, fondul, bordura sau alinierea datelor.
Iata un exemplu care va crea o pagina PDF in care avem o celula cu un text
centrat in ea.
<?php
include('fpdf.php');
$pdf=new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','',16);
$pdf->Cell(36,10,'Text in celula.',1,1,'C');
$pdf->Output();
?>
- Ca si in primul exemplu, dupa ce am inclus fisierul cu clasa FPDF am definit
obiectul de lucru si am setat initializarea paginii si fontul.
- Functia cell() defineste cadrul celulei si textul din ea, aceasta preia mai
multe argumente:
- primele doua reprezinta lungimea si inaltimea celulei
- urmatorul argument este textul afisat in celula
- celelalte argumente sunt pentru bordura, pozitia pointer-ului in pagina in
raport cu celula si alinierea textului din ea
- in afara de acestea, functia cell() mai poate prelua 2 argumente: pentru
fundal (true) si pentru link.

- La urma am apelat metoda Output() care trimite datele de iesire pentru


afisare.
Rezultatul acestui exemplu il puteti vedea aici -> Demo 2.
3. Linie noua, culori si fond
In urmatorul exemplu puteti vedea cum sa adaugati o linie noua in pagina,
sa setati o culoare pentru text si pt. fondul unei celule si sa definiti culoarea
si grosimea bordurii celulei.
Pentru a adauga o linie noua intr-o pagina PDF construita cu clasa FPDF se
apeleaza metoda Ln(), aceasta poate prelua un argument numeric ce
reprezinta inaltimea noii linii.
Pentru definirea unei culori pentru text se foloseste
metoda SetTextColor(), aceasta preia 3 argumente numerice cu valoarea
intre 0 si 255 reprezentand culorile RGB (Red, Green, Blue). Similar, pentru
culoarea de fundal (background) se foloseste metoda SetFillColor() cu cele
3 argumente reprezentand culorile RGB, iar pentru culoarea bordurii se
foloseste metoda SetDrawColor().
Grosimea liniei se poate defini cu metoda SetLineWidth(nr), unde "nr" e
un numar ce reprezinta grosimea in unitatea de masura data, de obicei
milimetri. Daca aceasta metoda nu e specificata, grosimea liniei este 0.2
mm.
Iata un exemplu care va crea o pagina PDF cu 2 linii de text (a doua cu text
albastru) si o alta linie in care avem o celula cu fond galben, bordura
definita si text verde.
<?php
include('fpdf.php'); // Include clasa FPDF

// Creaza documentul de lucru


$pdf=new FPDF();

$pdf->AddPage(); // Initializeaza pagina


$pdf->SetFont('Arial','',16);
$pdf->Text(20,10,"Prima linie"); // Adauga prima linie de text
$pdf->SetTextColor(1,1,250); // Seteaza culoarea pentru textul care va apare in
continuare
$pdf->Text(20,16,"Alta linie de text"); // Adauga o alta linie cu text albastru
$pdf->ln(10); // Adauga rand nou cu inaltimea 10 mm
$pdf->SetDrawColor(0,10,220); // Seteaza o culoare pt. bordura celulei
$pdf->SetLineWidth(0.5); // Defineste grosimea bordurii la jumatate de
milimetru
$pdf->SetFillColor(255,255,10); //Seteaza culoarea pt. background din celula
urmatoare
$pdf->SetTextColor(0,220,0); // Schimba culoarea pentru urmatorul text
$pdf->Cell(115,10,'A treia linie de text in celula, dupa linie noua',1,1,'C',true); //
Celula cu background

$pdf->Output(); // Trimite datele de iesire la browser


?>
- Ca sa intelegeti rolul fiecarei linii de cod, cititi comentariile asociate.
Pentru a vedea rezultatul acestui script click aici -> Demo 3.
- Ca sa observati mai bine rolul liniei noi "Ln()", cand testati scriptul, stergeti
aceasta linie de cod.
4. Paragraf, Linie, Imagine si Link
Paragraf
In exemplele de sus ati vazut cum puteti adauga text (pe o linie) folosind
metoda "Text()", totusi, aceasta metoda este utila in cazul sirurilor mai mici,
pe o singura linie, dar sunt situatii cand trebuie sa adaugati in pagina PDF
un continut de text mai mare si care are mai multe linii. In acest caz folositi
metoda write(), aceasta permite adaugarea de continut text cu mai multe
linii (formate cu "\n") sau cand testul ajunge la marginea din dreapta trece
automat pe o noua linie. Sintaxa generala a acestei metode este:
Write(h, continut_text, url)
- unde "h" este inalimea fiecarei linii din paragraf, "continut_text" este textul
adaugat, iar "url" (optional) este o adresa URL care poate fi deschisa cand
se da click pe continut_text.

Linie
Clasa FPDF are si o metoda pe care o puteti folosi pentru trasarea de linii in
pagina, aceasta este metoda line() si are urmatoarea sintaxa:
Line(x1, y1, x2, y2)
- unde "x1" si "y1" sunt coordonatele X si Y pentru punctul de inceput a
liniei, iar "x2" si "y2" sunt coordonatele X si Y pentru punctul de sfarsit a
liniei

Imagine
Pe langa date de tip text sau linii, in pagiina PDF puteti adauga cu FPDF si
imagini JPEG, PNG sau GIF; pentru aceasta se foloseste
metodaImage() care are urmatoarea sintaxa:
Image(src, x, y, w, h, tip, url)
- unde "src" este adresa imaginii, aceasta este singura strict necesara,
restul sunt optionale.
- "x" si "y" sunt coordonatele X si Y pentru coltul din stanga-sus de unde
incepe afisarea imaginii, daca nu sunt specificate se folosesc coordonatele
curente.
- "w" si "h" reprezinta dimensiunile (lungime, inaltime) in care va fi afisata
imaginea in pagina, daca nu sunt specificate se folosesc dimensiunile
imaginii.
- "tip" este tipul imaginii (JPG, JPEG, PNG sau GIF), daca nu e adaugat se
preia din extensia acesteia, iar "url" este o adresa URL care poate fi
deschisa la click pe imaginea respectiva.

Link
Sunt mai multe metode, simple sau mai complexe, de a adauga un link in
pagina PDF. Aici veti vedea doua metode simple, pentru ceva mai complicat
studiati tutorialul din documentatia FPDF.
Cea mai simpla metoda e sa scrieti direct adresa URL in continutul textului
(vedeti in exemplul de jos), in pagina va apare adresa asa cum ati scris-o iar
cand se da click pe ea deschide acea adresa.
O alta metoda pe care o puteti folosi e sa adaugati adresa in atributul URL a
uneia din metodele: Cell(), Write() sau Image().

Codul din urmatorul exemplu va afisa o pagina PDF in care este un continut
text pe mai multe linii care are si o adresa URL, urmat de un link intr-o
celula, doua linii si o imagine.
<?php
include('fpdf.php'); // Include clasa FPDF

// Creaza documentul de lucru


$pdf=new FPDF();

// Initializeaza pagina si defineste fontul textului


$pdf->AddPage();
$pdf->SetFont('Arial','',15);

// Sirul ce contine textul cu mai multe linii, care va fi adaugat in metoda Write()
$sir ="Text adaugat cu metoda Write() \r\n Linie noua din cadrul aceluiasi sir, \r\n O alta
linie care contine si un link www.marplo.net/php-mysql";

$pdf->Write(5, $sir); // Paragraf cu inaltimea liniei de 5 mm


$pdf->SetTextColor(1,1,250); // Seteaza culoarea pentru textul care va apare in
continuare
$pdf->Ln(10); // Linie noua cu inaltimea 20mm
$pdf->SetFont('Arial','I',13); // Modifica stilul si dimensunea textului, pt.
evidentiere link
$pdf->Cell(23,5,'Link Jocuri','B',1,'C',false,'http://www.marplo.net/jocuri'); // Celula cu
link si bordura jos pt. evidentierea acestuia

$pdf->Ln(); // Linie noua


$pdf->Image('marplo.jpg'); // Adauga o imagine in pagina

// Adaugarea liniilor
$pdf->SetDrawColor(90,100,200); // Seteaza culoarea pt. linie
$pdf->SetLineWidth(1); // Defineste grosimea liniei
$pdf->line(80,70,100,45); // Deseneaza prima linie
$pdf->line(100,45,120,70); // Deseneaza a doua linie

$pdf->Output(); // Trimite datele de iesire la browser


?>
- Studiati codul si comentariile din script ca sa intelegeti modul de lucru.
Pentru a vedea rezultatul acestui script click aici -> Demo 4.

Atentie, cand doriti sa adaugati in metode atribute care, in ordine, sunt dupa altele
optionale pe care nu doriti sa le folositi, trebuie totusi sa le adaugati si pe acestea (cu
valoare nula "" sau false).
De exempu, in scriptul de mai sus am vrut sa adaug o adresa URL in metoda "Cell()", care
este ultimul atribut, inaintea acestuia fiind atributul pt. background. Desi nu am folosit o
culoare pt. background, am adaugat acest atribut ca "false" ca sa fie respectata ordinea
atributelor recunoscute de clasa.

In partea a doua a acestei lectii veti invata cum sa adaugati elemente mai
avansate in documentul PDF, cum sunt: Header, nr. pagini, tabele sau contint
realizat prin recunoasterea unor tag-uri HTML.

Part. 2

Utilizare FTP cu PHP


Invatati sa va conectati la server prin FTP folosind PHP
Invatati sa transferati fisiere prin FTP cu PHP
Functii utile pentru utilizare FTP cu PHP

FTP (File Transfer Protocol) este un protocol standard care realizeaza o


conexiune client-server pentru transfer si manipulare de fisiere prin Internet.
Cu ajutorul FTP puteti adauga si copia fisiere (si directoare) de pe server sau
sa le schimbati permisiunile CHMOD. PHP are functii speciale pentru
conectarea la server si lucrul cu FTP.
1. Conectarea la server
Pentru conectarea la server prin FTP sunt necesare 3 date
importante: adresa serverului (a domeniului), numele de
utilizator si parola de conectare prin FTP.
La inceput se deschide o conexiune cu serverul, folosind
functia ftp_connect(), aceasta preia ca argument necesar numele
serverului, care de obicei are forma "ftp.server" ("server" poate fi numele
domeniului sau adresa IP a acestuia). Daca deschiderea conexiunii s-a
efectuat, functia va returna un ID a conexiunii, in caz contrar returneaza
FALSE.
Dupa deschiderea conexiunii se face autentificarea pe server, pentru
aceasta se foloseste functia ftp_login() care are urmatoarea sintaxa:
ftp_login(conn_id, nume_user, parola)
- unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()"
- "nume_user" este numele de utilizator pentru conectare la FTP, iar
"parola" este parola utilizatorului.
Pentru inchiderea conectarii se foloseste functia ftp_close(), aceasta preia
ca argument id-ul conexiunii.

Iata un exemplu de conectare prin FTP la server-ul unui site:


<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.un_site.net'; // Poate fi de exemplu
'ftp.marplo.net'
$ftp_user = 'utilizator';
$ftp_pass = 'parola';

// Seteaza Id-ul conexiunii


$conn_id = ftp_connect($ftp_server);

// Executa autentificarea pe server (mod pasiv ca sa nu fie blocat de


firewall)
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);

// Verifica daca s-a reusit sau nu conectarea la server


if ((!$conn_id) || (!$login_result)) {
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul
$ftp_user a iesuat.";
exit;
}
else {
echo "Conectare reusita la serverul $ftp_server, pentru utilizatorul
$ftp_user";
}

// Inchide conexiunea
ftp_close($conn_id);
?>
- Daca s-a efectuat cu succes conectarea si autentificarea pe server, va afisa
mesajul de confirmare, in caz contrar apare mesajul de eroare.
- La urma, "ftp_close($conn_id);" inchide conexiunea si elibereaza memoria
alocata.

Conectarea la server folosind codul de mai sus este primul pas, dupa aceasta
puteti folosi functiile PHP specifice FTP pentru a efectua diferite operatii, cum
sunt: preluarea continutului directoarelor, incarcarea sau descarcarea de
fisiere, crearea de noi directoare sau modificarea permisiunilor CHMOD.
2. Preluarea continutului directoarelor
Pentru a prelua continutul unui director (numele fisierelor si directoarelor
din el) se foloseste functia
ftp_nlist(conn_id, director)
- unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()"
- "director" este numele directorului a carui continut va fi preluat
Aceasta functie returneaza o matrice secventiala a carei elemente sunt
numele fiecarui director si fisier din catalogul cautat.
Mai jos este un exemplu practic.
<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.domeniu_site'; // Poate fi de exemplu
'ftp.marplo.net'
$ftp_user = 'utilizator';
$ftp_pass = 'parola';

// Seteaza Id-ul conexiunii


$conn_id = ftp_connect($ftp_server);
// Executa conectare pe server (mod pasiv ca sa nu fie blocat de
firewall)
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);

// Verifica daca s-a reusit sau nu conectarea la server


if ((!$conn_id) || (!$login_result)) {
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul
$ftp_user a iesuat.";
exit;
}
else {
// Obtine continutul directorului (numele de fisiere si directoare din
el)
$continut = ftp_nlist($conn_id, ".");

// Parcurge matricea si afiseaza numele directoarelor si fisierelor


returnate
for ($i=0; $i<count($continut); $i++) {
echo '<br>'.$continut[$i];
}
}

// Inchide conexiunea
ftp_close($conn_id);
?>
- Dupa setarea conexiunii si autentificarea pe server, daca conectarea a
reusit este apelata functia "ftp_nlist()", care va stoca in variabila "$continut"
matricea cu numele cataloagelor si fisierelor din directorul radacina (precizat
de argumentul ".").
Daca doriti obtinerea datelor din alt director, de exemplu "www", puteti apela
functia asa: ftp_nlist($conn_id, '/www').
- Pentru afisarea (sau preluarea) numelui fiecarui fisier si director returnat se
parcurge matricea "$continut".
Rezultatul afisat de acest script va fi ceva similar cu cel de jos:
cgi-bin
private
public_html
statistics
www
3. Incarcare fi sier pe server
Pentru incarcarea (upload) unui fisier pe server prin FTP cu PHP se
foloseste functia ftp_put(), aceasta returneaza TRUE daca incarcarea s-a
efectuat cu succes, in caz contrar returneaza FALSE. Are urmatoarea
sintaxa:
ftp_put(conn_id, destinatie, fisier, tip_transfer)
- unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()"
- "destinatie" este directorul (si numele fisierului) pe server unde va fi
incarcat fisierul
- "fisier" este numele fisierului care va fi copiat
- "tip_transfer" reprezinta modul incarcarii pe server, acesta poate lua
valoarea FTP_ASCII sau FTP_BINARY
Iata un exemplu in care se copie un fisier de pe calculatorul client pe server,
in directorul 'www':
<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.domeniu_site';
$ftp_user = 'utilizator';
$ftp_pass = 'parola';

// Seteaza Id-ul conexiunii


$conn_id = ftp_connect($ftp_server);

// Executa conectare pe server (mod pasiv ca sa nu fie blocat de


firewall)
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);

// Verifica daca s-a reusit sau nu conectarea la server


if ((!$conn_id) || (!$login_result)) {
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul
$ftp_user a iesuat.";
exit;
}
else {
// Datele cu numele fisierului, sursa unde se afla si directorul unde va
fi incarcat pe server
$fisier = 'test.txt';
$sursa = 'c:/wamp/www/site/'. $fisier;
$destinatie = '/www/'. $fisier;

// Apeleaza functia "ftp_put()" pt. efectuarea transferului


// Afiseaza mesaj de reusita sau nu
if (ftp_put($conn_id, $destinatie, $sursa, FTP_BINARY)) echo "Fisierul
$fisier a fost incarcat pe server";
else echo "Eroare, fisierul $fisier nu a putut fi incarcat pe server";
}

// Inchide conexiunea
ftp_close($conn_id);
?>
- Daca datele pentru conectare sunt corecte si PHP are permisiuni de transfer
prin FTP, fisierul "test.txt" (aflat pe calculatorul client in directorul
"c:/wamp/www/site/") va fi copiat pe server, in directorul "www/".
- Fisierul va fi incarcat cu acelasi nume, daca doriti sa fie transferat pe server
cu alt nume, modificati la "$destinatie".
4. Copiere fi sier de pe server
Pentru copierea (download) unui fisier de pe server pe calculatorul client
se foloseste functia ftp_get(), aceasta returneaza TRUE daca transferul s-a
efectuat cu succes, in caz contrar returneaza FALSE. Are urmatoarea
sintaxa:
ftp_get(conn_id, client, fisier, tip_transfer)
- unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()"
- "client" este locatia de pe calculatorul client unde va fi copiat fisierul
- "fisier" este numele fisierului (si locatia) de pe server unde acesta se
gaseste
- "tip_transfer" reprezinta modul incarcarii pe server, acesta poate lua
valoarea FTP_ASCII sau FTP_BINARY

Iata un exemplu in care se descarca prin FTP un fisier de pe server pe


calculatorul client:
<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.domeniu_site';
$ftp_user = 'utilizator';
$ftp_pass = 'parola';

// Seteaza Id-ul conexiunii


$conn_id = ftp_connect($ftp_server);

// Executa conectare pe server (mod pasiv ca sa nu fie blocat de


firewall)
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);

// Verifica daca s-a reusit sau nu conectarea la server


if ((!$conn_id) || (!$login_result)) {
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul
$ftp_user a iesuat.";
exit;
}
else {
// Datele cu numele fisierului, sursa unde se afla si directorul unde va
fi copiat
$fisier = 'test.txt';
$server = '/www/'. $fisier;
$client = 'c:/download/'. $fisier;

// Apeleaza functia "ftp_get()" pt. efectuarea transferului


// Afiseaza mesaj de reusita sau nu
if (ftp_get($conn_id, $client, $server, FTP_BINARY)) echo "Fisierul
$fisier a fost descarcat";
else echo "Eroare, fisierul $fisier nu a putut fi descarcat";
}

// Inchide conexiunea
ftp_close($conn_id);
?>
- Daca datele pentru conectare sunt corecte si PHP are permisiuni de transfer
prin FTP, fisierul "test.txt" (aflat pe server in directorul "www/") va fi copiat pe
calculatorul client, in directorul "c:/download/".
- Fisierul va fi copiatat cu acelasi nume, daca doriti sa fie descarcat pe
calculator cu alt nume, modificati la "$client". Daca in directorul unde va fi
copiat se mai afla un fisier cu acelasi nume, acesta va fi inlocuit cu cel
descarcat de pe server.
5. Creare director pe server
Inainte de a crea un director nou prin FTP, setati directorul curent de lucru
care reprezinta locatia unde doriti sa fie creat noul catalog. Pentru aceasta
se foloseste functia ftp_chdir(conn_id, director); "conn_id" este id-ul
conexiunii iar "director" este numele directorului care va fi setat pentru
lucru.

Pentru crearea unui director pe server prin FTP se foloseste


functia ftp_mkdir(), in caz de succes returneaza numele noului director
creat, iar in caz contrar returneaza FALSE. Are urmatoarea sintaxa:
ftp_mkdir(conn_id, nume_dir)
- unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()"
- "nume_dir" este numele noului director

Iata un exemplu in care se creaza un director "test" pe server, in "www/":


<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.domeniu_site';
$ftp_user = 'utilizator';
$ftp_pass = 'parola';

// Seteaza Id-ul conexiunii


$conn_id = ftp_connect($ftp_server);

// Executa conectare (mod pasiv ca sa nu fie blocat de firewall)


$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);

// Verifica daca s-a reusit sau nu conectarea la server


if ((!$conn_id) || (!$login_result)) {
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul
$ftp_user a iesuat.";
exit;
}
else {
$dir = 'un_director'; // Numele noului director

// Daca e setat directorul de lucru "www/"


if(ftp_chdir($conn_id, '/www/')) {
// Apeleaza functia "ftp_mkdir()" pt. crearea directorului
// Afiseaza mesaj de reusita sau nu
if (ftp_mkdir($conn_id, $dir)) echo "Directorul $dir a fost creat";
else echo "Eroare, directorul $dir nu a putut fi creat";
}
}

// Inchide conexiunea
ftp_close($conn_id);
?>
- Daca datele pentru conectare sunt corecte si directorul curent de lucru
(www/) este setat cu succes iar PHP are permisiuni de scriere pe server, in
catalogul "www/" va fi creat directorul "un_director".

Pentru stergerea unui director se foloseste functia ftp_rmdir(conn_id,


del_dir), unde "conn_id" este id-ul conexiunii iar "del_dir" este numele
directorului care va fi sters.
6. Transferarea unei portiuni de fi sier pe server
Pe langa transferul unui fisier complet, PHP ofera si functii pentru
transferul unei anumite parti din continutul unui fisier.
O functie care face acest lucru este ftp_fput(), aceasta incarca pe server
continut dintr-un fisier deschis cu "fopen()", returneaza TRUE in caz de
succes, iar in caz contrar returneaza FALSE. Are urmatoarea sintaxa:
ftp_fput(conn_id, destinatie, pointer_fisier, tip_transfer)
- unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()"
- "destinatie" este directorul de pe server unde va fi incarcat fisierul
- "pointer_fisier" reprezinta identificatorul (pointer-ul) de fisier deschis cu
"fopen()". Retine continutul de la acest pointer pana la sfarsitul fisierului.
- "tip_transfer" reprezinta modul incarcarii pe server, acesta poate lua
valoarea FTP_ASCII sau FTP_BINARY

Iata un exemplu in care este preluata o parte din continutul unui fisier si
transferata intr-un fisier pe server:
<?php
$fisier = "test.txt"; // Fisierul care va fi deschis pt. citire

// Daca fisierul a fost deschis pt. citire


if ($fp = fopen($fisier, rb)) {
fseek($fp, 40); // Seteaza pozitia pointer-ului in fisier

// Datele pt. conectare la server


$ftp_server = 'ftp.domeniu_site';
$ftp_user = 'utilizator';
$ftp_pass = 'parola';

// Seteaza Id-ul conexiunii


$conn_id = ftp_connect($ftp_server);

// Executa conectare (mod pasiv ca sa nu fie blocat de firewall)


$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);

// Verifica daca s-a reusit sau nu conectarea la server


if ((!$conn_id) || (!$login_result)) {
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul
$ftp_user a iesuat.";
exit;
}
else {
$destinatie = '/www/test2.txt'; // Directorul destinatie
si numele fisierului

// Transfera continutul intr-un fisier nou pe server


// Afiseaza mesaj de reusita sau nu
if (ftp_fput($conn_id, $destinatie, $fp, FTP_BINARY)) echo 'Continutul a
fost transferat';
else echo 'Eroare, continutul nu a putut fi transferat';
}
// Inchide conexiunea
ftp_close($conn_id);

// Elibereaza memoria ocupata de deschiderea fisierului


fclose($fp);
}
?>
- Daca fisierul "test.txt" a fost deschis pentru citire, functia "fseek($fp, 40)"
muta pointer-ul la pozitia 40, astfel va fi retinut continutul din fisier care
incepa de la caracterul 41 pana la sfarsit (primul caracter are pozitia 0).
- In continuare, daca s-a efectuat cu succes conexiunea si autentificarea prin
FTP, se transfera continutul in fisierul "test2.txt" din directorul "www" de pe
server (daca fisierul "test2.txt" exista deja pe server, continutul lui va fi
inlocuit cu cel transferat).
In cazul in care doriti sa transferati intreg continutul unui fisier deschis cu
"fopen()", nu este necesara utilizarea funtiei "fseek()".
Aceasta metoda este utila cand doriti sa adaugati un sir sau continut, de
exemplu preluat dintr-un form, pe server prin FTP. Adaugati sirul intr-un fisier
temporar pe care apoi il deschideti cu "fopen()" si transferati continutul cu
"ftp_fput()".

Pentru stergerea unui fisier se foloseste functia ftp_delete(conn_id,


'cale/fisier'), unde "conn_id" este id-ul conexiunii iar "cale/fisier" este calea
si numele fisierului care va fi sters.
7. Alte functii utile pentru FTP
Pe langa functiile prezentate in exemplele de mai sus, PHP are si alte
functii utile pentru lucrul cu fisiere si directoare prin FTP.
Iata cateva din acestea:
ftp_cdup(conn_id) - Schimba ca director curent de lucru directorul
parinte
ftp_chmod(conn_id, octal_CHMOD, fisier) - Seteaza permisiunile
CHMOD a unui fisier prin FTP
ftp_mdtm(conn_id, fisier) - returneaza timpul, in format Unix, cand a
fost ultima data modificat un fisier
ftp_pwd(conn_id) - Returneaza numele directorului curent de lucru
ftp_rename(conn_id, nume_actual, nume_nou) - Modifica numele
unui director sau fisier
ftp_size(conn_id, fisier) - Returneaza marimea fisierului specificat, in
bytes (unele servere nu suporta aceasta functie)

O lista completa cu functiile PHP pentru FTP gasiti la adresa din urmatorul link Functii PHP
pentru FTP

S-ar putea să vă placă și