PHP MySQL
PHP MySQL
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):
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
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
?>
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
// ceva cod
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Conectare nereusita: '. mysqli_connect_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)
- 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());
}
$conn->close();
?>
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
$conn->close();
?>
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,...)
$conn->close();
?>
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_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.
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>
</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".
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_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';
}
?>
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
$conn->close();
?>
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());
}
$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());
}
$conn->close();
?>
"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.
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
$conn->close();
?>
Acesti termeni sunt folositi cu clauza WHERE, iar cautarea este case-
insensitive (fara diferenta intre litere mari si mici).
// ...
?>
<?php
// ...
// ...
?>
// ...
?>
<?php
// ...
// ...
?>
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.
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_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 ).
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'";
$conn->close();
?>
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
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
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
// interogare sql
$sql = "SELECT `site` AS st FROM `sites`";
$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
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".
// interogare sql
$sql = "SELECT CONCAT(`site`, ' - ', `nr`) AS str FROM `sites`";
$conn->close();
?>
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.
// 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";
$conn->close();
?>
Afiseaza:
POW(5, 3) - 125
POW(8, 3) - 512
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";
$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.
- 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.'
';
}
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();
}
?>
- 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();
}
?>
// 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 */
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
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', ...));
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);
// Daca datele au fost adaugate ($coun nu e false) afiseaza nr. randuri adaugate
if($count !== false) echo 'Nr. randuri adaugate: '. $count;
?>
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");
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
- In browser va afisa:
Randuri afectate: 1
4. DELETE
Instructiunea DELETE sterge randuri din tabel. Formula generala aplicata
cu PDO este:
$obiectPDO ->exec("DELETE FROM `nume_tabel`
WHERE conditie");
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
- In browser va afisa:
Randuri afectate: 2
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);
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
- 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
// Se parcurg datele
while($row = $datas->fetch(PDO::FETCH_NUM)) {
echo $row[0]. '-'. $row[1]. '<br />'; // Afiseaza datele din prima si a doua
coloana
}
- 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
// 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)
}
- 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
// 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
// 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
- 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
- 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', )
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
// Se parcurg datele
while($row = $datas->fetch()) {
echo $row->id. '-'. $row->adresa. '<br />'; // Afiseaza datele din coloanele "id"
si "adresa"
}
- 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
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
// Variabila Array cu valori ce trebuie adaugate in interogarea SQL pregatita (pt. ':id'
si ':categorie')
$ar_val = array('id'=>2, 'categorie'=>'educatie');
// Variabila Array cu valori ce trebuie adaugate in interogarea SQL pregatita (pt. ':id'
si ':categorie')
$ar_val = array('id'=>8, 'categorie'=>'limbi straine');
- 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:
$prep->execute();
$id = 2;
$cat = 'programare';
$prep->execute();
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 includ variabilele
$prep->bindParam(':nume', $nume, PDO::PARAM_STR);
$prep->bindParam(':categorie', $categorie, PDO::PARAM_STR);
$prep->bindParam(':adresa', $adresa, PDO::PARAM_STR);
- 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".
// E CORECT
$prep = $dbh->prepare("SELECT `coloana` FROM `tabel` WHERE `coloana` LIKE
:cuvant");
$prep->bindValue(':cuvant', '%valoare%');
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
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
- 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.
// 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);
return $ul;
}
echo test(10); // 15
?>
$a = new A;
echo $a->getVal(); // 2
?>
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.
- 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]"
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
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.
// 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);
// curatarea memoriei
imagedestroy($im);
?>
- Acest script va afisa urmatorul rezultat
- 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)
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);
// curatarea memoriei
imagedestroy($im);
?>
---
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
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
// 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
// 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
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:
<?php
// preluarea imaginii sursa
$im1 = imagecreatefrompng('imgs/marplo.png');
// 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:
<?php
// preluarea imaginii sursa
$im1 = imagecreatefrompng('imgs/marplo.png');
// 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:
O lista completa cu functiile care pot fi folosite pentru lucrul cu imagini in PHP gasiti
aici Functii pentru imagini
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.
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
// 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";
// 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
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
// 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';
// 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';
// 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
// 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.
// 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".
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
O lista completa cu functiile PHP pentru FTP gasiti la adresa din urmatorul link Functii PHP
pentru FTP