Sunteți pe pagina 1din 45

11/22/2014

Proiectarea bazelor de date

Codruta-Mihaela ISTIN,

Obiective

SQL
Logice
NonRelationale

1
11/22/2014

Curs 1

Introducere
Editoare
Structura generala a unui fisier HTML
Sintaxa (tag si atribute)
Formatare de text
Bullet-list-uri
Formatare folosind tabele
inserare de imagini
Ancore
Adresarea resurselor
Rolul browser-ului
Comunicare intre browser si server

Editoare HTML

Ce este HTML

HTML = Hypertext Markup Language


limbajul este folosit pentru a prezenta informatii in pagini Web
Editoarele HTML:
o text (AkelPad, Crimson Editor, FAR Manager (+Colorer plugin), gedit,
jEdit, Kate, Metapad, nano, Nedit, Notepad, WordPad, SciTE, Tex-Edit
Plus, TextEdit, TED Notepad)

o WYSIWYG (what you see is what you get) (Dreamweaver, MS Office


HTML Editor, WYMeditor)

o pot salva pagini html (AbiWord, Apple Pages, AppleWorks, Microsoft


Word, LibreOffice Writer, OpenOffice.org Writer, WordPerfect)

2
11/22/2014

Structura generala a unui fisier HTML

<html>

<head>
<title>Titlu in bara browser</title>
</head>

<body>
<!-- comentariu -->
<p align=center>Index</p>
</body>

</html>

Structura generala a unui fisier HTML

un tag incepe cu <, urmat de numele tagului, optional pot sa


urmeze unul sau mai multe atribute, iar in final urmeaza > <html>
urmeaza corpul tagului, care poate sa cuprinda text si alte <head>
taguri imbricate <title>Titlu in bara browser</title>
</head>
dupa corpul tagului urmeaza tagul de inchidere, care incepe cu <body>
</, urmat de acelasi nume de tag ca si cel folosit la deschidere <!-- comentariu -->
si apoi > <p align=center>Index</p>
daca un tag nu are continut, poate fi inchis folosind /> in loc </body>
</html>
de > (ex: <br/>)
un atribut consta dintr-un nume de atribut, urmat de = si
valoarea sa, care poate fi pusa intre sau

un fiser HTML incepe si se termina intotdeauna cu <html>


in interiorul <html> exista 2 mari sectiuni, marcate prin <head> si <body>
in sectiunea <head> intra toate elementele care nu apar vizual in pagina de browser (titlu, stiluri,
etc)
sectiunea <body> intra toate elementele care apar vizual in pagina de browser
comentariile incep cu <!-- si se termina cu -->

3
11/22/2014

Tag-uri folosite la formatarea textului

TAG Efect
(nume)
<p>..</p> Declara un nou paragraf. Intre doua paragrafe exista o linie.
(paragraph)
<br/> Linie noua. In codul HTML nu conteaza cum este textul scris pe linii, findca acestea nu
(break) se iau in considerare. Pentru a se introduce o linie noua se foloseste <br/>
<b>..</b> Ingroasa textul din interiorul sau
(bold)
<u>..</u> Subliniaza textul din interiorul sau
(underline)
<i>..</i> Inclina textul din interiorul sau
(italic)

deoarece in codul HTML nu conteaza cate spatii exista unul dupa altul (ele se vor afisa ca un singur
spatiu), pentru a se afisa mai multe spatii se foloseste simbolul &nbsp;
daca se doreste afisarea caracterrului <, se foloseste simbolul &lt; , pentru a nu se confunda cu
inceputul de tag; exista si alte simboluri pentru caractere speciale, ex: pentru copyright

Liste

Lista neordonata (UnorderedList) Rezultat

<ul> rosu
<li>rosu</li> verde
<li>verde</li> albastru
<li>albastru</li>
</ul>

Lista ordonata (OrderedList) Rezultat

<ol> 1. Maria
<li>Maria</li> 2. Ion
<li>Ion</li> 3. Mihai
<li>Mihai</li>
</ol>

li = List Item

4
11/22/2014

Formatare folosind tabele

<table border=1 cellspacing=2 cellpadding=10>


<tr>
<td bgcolor="yellow"><b>Nr</b></td>
<td bgcolor="yellow"><b>Nume</b></td>
<td bgcolor="yellow"><b>Note</b></td>
</tr>
<tr>
<td>1</td>
<td valign="top">Maria</td>
<td>9.50<br/>8.10<br/>8.90</td>
</tr>
<tr>
<td>2</td>
<td>Ion</td>
<td>7.80<br/>5.70<br/>8.30</td>
</tr>
<tr>
<td>3</td>
<td valign="bottom">Mihai</td>
<td>6.10<br/>8.20<br/>7.10</td>
</tr>
</table>

Formatare folosind tabele


<table border=1 cellspacing=0 cellpadding=20>
<tr>
<td bgcolor=#FF0000>1</td>
<td bgcolor=#00FF00>2</td>
<td bgcolor=#0000FF>3</td>
</tr>
<tr>
<td bgcolor=#FF00FF>A</td>
<td bgcolor=#00FFFF colspan="2">Cuplaj</td>
</tr>
</table>
<table border=1 cellspacing=0 cellpadding=20>
<tr>
<td bgcolor=#FF0000>1</td>
<td bgcolor=#00FF00 rowspan="2">Cuplaj</td>
<td bgcolor=#0000FF>3</td>
</tr>
<tr>
<td bgcolor=#FF00FF>A</td>
<td bgcolor=#00FFFF>C</td>
</tr>
</table>

5
11/22/2014

Inserare de imagini

imaginile se pasteaza separat de fisierele HTML, in forma lor  imagini


proprie de imagine banner.jpg
pentru a fi incluse in HTML se foloseste tag-ul: harta.jpg
<img src=cale_catre_imagine /> index.html
calea reprezinta numele fisierului de imagine, precum si locatia contact.html
sa; locatia unui fisier poate fi specificata in doua feluri: despre.html
o prin adresare relativa specificandu-se diferenta de cale
fata de fisierul html curent (ex: <img src=imagini/harta.jpg />)
o prin adresare absoluta specifcandu-se calea completa a imaginii in sistemul
de fisiere sau ca resursa de pe internet (ex: <img src=d:/site/imagini/harta.jpg /> ,
<img src=http://www.magazincarti.ro/imagini/harta.jpg>); daca specificarea unei
resurse incepe cu http://, se considera ca ea se gaseste pe internet
pentru o imagine se poate specifica o latime si o inaltime diferite de cea a fisierului
original, folosind atributele width si height
daca se specifica doar unul dintre cele doua atribute, celalalt va fi scalat in mod
corespunator pentru ca imaginea sa-si pastreze raportul intre latime si inaltime

Link-uri

link-urile se insereaza in html folosind tag-ul:


<a href=cale_catre_destinatie> text </a>
cale_catre_destinatie are acelasi format ca in cazul unei imagini
text este un text sau o imagine care apare in browser si pe care daca se face click,
se trece la resursa indicata de cale
se pot specifica link-uri catre alte parti ale documentului curent, utile de exemplu
pentru tabele de cuprins. Acestea vor avea calea specificata incepand cu # urmat
de un nume de ancora; ancora se declara de forma <a name=nume_ancora/>
se poate specifica si cum anume sa se deschida noua pagina, folosind atributul
target, care poate avea printre altele urmatoarele valori:
o _blank - deschide link-ul intr-o pagina noua
o _self - deschide link-ul in aceeasi pagina (implicit)
exemple:
<a href=despre.html>Despre noi</a>
<a href=http://www.google.com><img src=imagini/sigla_google.jpg/></a>
<a href=#paragraf_termeni>5. Termeni si conditii</a>
<a href=imagini/echipa.jpg target=_blank>Echipa noastra</a>

6
11/22/2014

Integrarea PHP-ului in HTML


Server (Apache)
1
Dispecer de
cereri 8
Browser

2 7
Baza de 5 1. Se trimite o cerere de pagina
date Interpretor PHP 2. Paginile PHP sunt trimise la
6 interpretorul PHP
(MySQL) 3,4. Interpretorul incarca de pe
3 4 disc codul sursa PHP
5,6. Daca exista interogare de
HDD baza de date, PHP-ul
interogheaza baza de date
7. Rezultatul final al interpretorului
PHP este un fisier HTML
8. Fisierul HTML rezultat e returnat
apelantului

Primul program PHP

<html>
<head></head>
<body>
<?php
echo salut;
?>
</body>
</html>

programele sau secventele PHP se scriu in interiorul unor fisiere HTML, care
trebuie sa aiba extensia .php
o secventa PHP incepe cu <?php si se incheie cu ?> . Unele servere sunt setate
sa accepte si doar <? , dar acest fel de a incepe nu este intotdeauna portabil
PHP-ul accepta si comenzi scrise direct, fara a fi nevoie ca acestea sa fie scrise
intr-o functie (ca in C)
comenzile de afisare gen echo sau print trimit caracterele de afisat chiar in
interiorul paginii care contine secventa PHP, incepand cu inceputul acesteia
in final toata secventa PHP este stearsa din codul PHP, fiind inlocuita cu
caracterele afisate in interiorul acesteia

7
11/22/2014

Primul program PHP

<html>
<head></head> <html>
<body> <head></head>
<?php <body>
echo salut; salut
?> </body>
</body> </html>
</html>

programele sau secventele PHP se scriu in interiorul unor fisiere HTML, care
trebuie sa aiba extensia .php
o secventa PHP incepe cu <?php si se incheie cu ?> . Unele servere sunt setate
sa accepte si doar <? , dar acest fel de a incepe nu este intotdeauna portabil
PHP-ul accepta si comenzi scrise direct, fara a fi nevoie ca acestea sa fie scrise
intr-o functie (ca in C)
comenzile de afisare gen echo sau print trimit caracterele de afisat chiar in
interiorul paginii care contine secventa PHP, incepand cu inceputul acesteia
in final toata secventa PHP este stearsa din codul PHP, fiind inlocuita cu
caracterele afisate in interiorul acesteia

Elemente de PHP

<?php
for($i=0;$i<5;$i++)
echo $i.</br>;
?>

toate variabilele incep cu $


variabilele nu trebuie declarate inainte de a fi folosite si nu au un tip predefinit
(aceeasi variabila poate contine succesiv orice tip de date, dar e considerat un stil de
programare prost sa fie folosita aceeasi variabila cu tipuri diferite de date)
operatorul . (punct) are rolul de a concatena doua siruri de caractere, convertind
initial operanzii la siruri de caractere
PHP-ul provine din C si foarte multe constructii sunt similare celor din C (for, while,
if, )
instructiunile de afisare nu scriu si linie noua la finalul lor si atunci tot rezultatul a
fost afisat pe o singura linie, dar in browser vor aparea linii diferite din cauza lui <br/>
IMPORTANT: intotdeauna cand se afiseaza ceva din PHP, se va tine cont de faptul
ca rezultatul final este HTML si deci se aplica regulile specifice HTML-ului

8
11/22/2014

Elemente de PHP

<?php
for($i=0;$i<5;$i++)
echo $i.</br>; 0<br/>1<br/>2<br/>3<br/>4<br/>
?>

toate variabilele incep cu $


variabilele nu trebuie declarate inainte de a fi folosite si nu au un tip predefinit
(aceeasi variabila poate contine succesiv orice tip de date, dar e considerat un stil de
programare prost sa fie folosita aceeasi variabila cu tipuri diferite de date)
operatorul . (punct) are rolul de a concatena doua siruri de caractere, convertind
initial operanzii la siruri de caractere
PHP-ul provine din C si foarte multe constructii sunt similare celor din C (for, while,
if, )
instructiunile de afisare nu scriu si linie noua la finalul lor si atunci tot rezultatul a
fost afisat pe o singura linie, dar in browser vor aparea linii diferite din cauza lui <br/>
IMPORTANT: intotdeauna cand se afiseaza ceva din PHP, se va tine cont de faptul
ca rezultatul final este HTML si deci se aplica regulile specifice HTML-ului

Elemente de PHP

<table border=<?php=$size?>><tr>
<?php
for($i=0;$i<3;$i++)
echo <td>$i</td>;
?>
</tr></table>

pentru usurinta afisarii, se accepta ca variabilele sa fie scrise direct in interiorul


sirurilor de caractere, atunci cand acestea sunt incadrate de ghilimele
daca sirurile de caractere sunt incadrate de apostroafe, variabilele s-ar fi considerat
ca fiind simple caractere si ar fi rezultat: <td>$i</td><td>$i</td><td>$i</td>
in caz ca se doreste afisarea unor expresii simple, se poate folosi constructia
<?php=expresie?> , unde expresie este expresia de afisat. Aceasta constructie este
echivalentul unei instructiuni echo expresie;
valoarea variabilelor se pastreaza intre mai multe secvente PHP care au fost
folosite in cadrul aceluiasi fisier. In exemplul de mai sus, se considera ca $size este o
variabila initializata cu valoarea 7 intre-o secventa PHP anterioara

9
11/22/2014

Elemente de PHP

<table border=<?php=$size?>><tr>
<?php <table border=7><tr>
for($i=0;$i<3;$i++) <td>0</td><td>1</td><td>2</td>
echo <td>$i</td>; </tr></table>
?>
</tr></table>

pentru usurinta afisarii, se accepta ca variabilele sa fie scrise direct in interiorul


sirurilor de caractere, atunci cand acestea sunt incadrate de ghilimele
daca sirurile de caractere sunt incadrate de apostroafe, variabilele s-ar fi considerat
ca fiind simple caractere si ar fi rezultat: <td>$i</td><td>$i</td><td>$i</td>
in caz ca se doreste afisarea unor expresii simple, se poate folosi constructia
<?php=expresie?> , unde expresie este expresia de afisat. Aceasta constructie este
echivalentul unei instructiuni echo expresie;
valoarea variabilelor se pastreaza intre mai multe secvente PHP care au fost
folosite in cadrul aceluiasi fisier. In exemplul de mai sus, se considera ca $size este o
variabila initializata cu valoarea 7 intre-o secventa PHP anterioara

Elemente de PHP

Definirea unei functii PHP exemplu


$colorDa=#00ff00; $colorNu=#ff0000;
function f1($n)
{
global $colorDa, $colorNu;
if($n){
return <font color=$colorDa>cautarea a returnat $n rezultate</font>;
}else{
return <font color=$colorNu>niciun rezultat gasit</font>;
}
}

echo f1(25);
definirea unei functii se face folosind cuvantul cheie function, urmat de numele
functiei si de parametrii ei intre paranteze, fiecare parametru fiind si el prefi
la fel ca si in cazul variabilelor nu se dau tipurile argumentelor si nici tipul valorii
returnate, acestea putand avea orice tip
daca intr-o functie se doreste accesarea unor variabile globale, acestea se vor lista
prefixate de cuvantul global. Altfel orice nume de variabila e considerat local.

10
11/22/2014

Elemente de PHP

$persoane=array('Ion','Ana','Maria'); Maria
Ana
for($i=count($persoane)-1;$i>=0;$i--) Ion
echo $persoane[$i].'</br>'; --------------
echo '--------------</br>'; Ion
$persoane[]='Mihai'; // adaugare element in vector Ana
Maria
foreach($persoane as $p)echo "$p</br>"; Mihai
echo '--------------</br>'; --------------
$preturi=array('Mere'=>5.2, 'Pere'=>7.1,'Kiwi'=>5.5); Pret Mere: 5.2 lei
Pret Pere: 7.1 lei
$preturi['Avocado']=3.5; // adaugare element in vector Pret Kiwi: 5.5 lei
foreach($preturi as $sortiment=>$pret) Pret Avocado: 3.5 lei
echo "Pret $sortiment: $pret lei</br>;

vectorii se declara folosind array. Exista 2 tipuri de vectori: simpli ($persoane), in


care se specifica valorile si asociativi ($preturi), in care se specifica perechi de
cheie=>valoare. Vectorii simpli se acceseaza prin indexul valorii ($persoane[1]), iar cei
asociativi printr-o cheie ($preturi[Kiwi])
iterarea intr-un vector se poate face simplu, folosind instructiunea foreach
($nume_vector in $valoare), care atribuie pe rand lui $valoare toate valorile din vector.
Pentru vectori asociativi se foloseste foreach ($nume_vector in $cheie=>$valoare)

Elemente de SQL (MySQL)

SQL = Structured Query Language; este un limbaj de interactiune cu bazele de date


relationale
SQL este definit de standardul ISO/IEC 9075:2011 dar acest standard nu defineste
o serie de functionalitati importante si din acest motiv toate implementarile de SQL
folosesc si extensii proprii, care de multe ori nu sunt compatibile cu extensiile altor
implementari
implementari notabile:
MySQL - este cea mai folosita baza de date perntru servere. Este open source,
dezvoltat de compania suedeza MySQL AB si preluat ulterior de Oracle
Microsoft SQL Server (MSSQL) este dezvoltat de Microsoft si este mai mult
folosit pe serverele care ruleaza MS Windows
Oracle este baza de date dezvoltata de Oracle Corporation si include multe
extensii ale limbajului SQL standard, cum ar fi PL/SQL
SQLite este o baza de date SQL open source care isi pastreaza toate tabelele
intr-un singur fisier, la randul lui situat in cadrul aplicatiei si astfel este usor de
instalat/copiat intr-o aplicatie (deployment). Pe langa utilizarea pe servere, SQLite
se foloseste foarte mult in aplicatii care ruleaza pe calculatoare desktop sau pe
smartphone-uri

11
11/22/2014

Elemente de SQL (MySQL)

intr-o baza de date (BD) SQL, toate datele de acelasi fel sunt grupate intr-o tabela
o tabela are drept coloane toate campurile necesare pentru specificarea datelor
respective
fiecare linie dintr-o tabela contine o inregistrare distincta

persoane prieteni
id nume id_persoana Id_prieten
1 Ion 1 2
2 Ana 1 3
3 Mihai 2 1
3 1
in SQL nu exista legatura de date
2 3
directa, cum ar fi prin ponteri, pentru a se
specifica structuri de date complexe, gen 3 2
arbori
in exempul de mai sus, din cauza ca fiecare persoana poate sa aiba mai multi
prieteni, lista acestora a trebuit codificata intr-o alta tabela, relationarea intre ele
facandu-se pe baza unor coduri numerice

Elemente de SQL (MySQL)

fiecare camp are un tip de date. Tipurile de date cel mai des intalnite:

Tip de date Folosire Exemple


CHAR(n) unul sau mai multe caractere care au o dimensiune 0723-111-222
fixa (nr. de telefon sau carte de credit)
VARCHAR(n) siruri de max. 255 de caractere, fara dimensiune Ionut T. M. Popescu Sandu
fixa (nume, e-mail)
LONGTEXT texte de dimensiuni foarte mari (descrieri, In povestirea \Capra cu trei
articole) iezi\ este vorba despre
LONGBLOB date binare (imagini, muzica)
INT(n) numere intregi cu semn 2348
DOUBLE(n,d) numere zecimale cu d zecimale 3.14159
DATE date calendaristice 2013/05/20
TIME timp 18:24:39
DATETIME combinatie de data si timp 2011/08/27 09:45:20

12
11/22/2014

Managementul MySQL folosind


phpMyAdmin
phpMyAdmin este o aplicatie PHP, care ruleaza intr-un browser si prin intermediul
careia se poate face managementul complet al unei bd MySQL

lista de baze de date apare in stanga si sus este meniul pentru creare de noi baze de
date, utilizatori, inserare cod SQL sau importare/exportare de date
pentru criterii de securitate, pentru fiecare bd se definesc unul sau mai multi
utilizatori, fiecare putand avea drepturi diferite utilizare a acelei bd

phpMyAdmin - crearea unei tabele in mod


vizual

13
11/22/2014

phpMyAdmin - vizualizarea unei tabele

la selectia unei bd, in stanga apar toate tabelele ei. Daca se apasa pe numele unei
tabele, apar inregistrarile din ea. Daca se apasa pe dreptunghiul din stanga ei, ii
apare structura
in orice mod sunt disponibile operatii de adaugare, modificare, stergere

Elemente de SQL (MySQL)

-- BAZA DE DATE: e1, utilizator: user1, parola: 1


CREATE TABLE `utilizatori` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nume` varchar(50) NOT NULL,
`email` varchar(50) NOT NULL,
`parola` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8_bin AUTO_INCREMENT=3 ;
INSERT INTO `utilizatori` (`id`, `nume`, `email`, `parola`) VALUES
(1, 'Ion', 'ion@mail.com', '123'), (2, 'Ana', 'ana@mail.com', '456');
AUTO_INCREMENT inseamna ca se tine minte valoarea maxima dintre toate
intregistrarile acelui camp in tabela si la adugarea unei noi inregistrari (care trebuie sa
aiba setat id=0), id-ul ei va fi setat automat la urmatorul numar disponibil (MAX+1)
daca nu ar fi existat AUTO_INCREMENT, inainte de orice inserare (INSERT), ar fi
trebuit in prealabil executata o interogare de forma SELECT MAX(id) AS max_id
FROM utilizatori, pentru a se sti ce valoare putem sa-I atribuim campului id al
inregistrarii de introdus (max_id+1)
NOT NULL impune existenta unei valori. Fara el, in acel camp ar fi putut sa existe si
valoarea NULL.

14
11/22/2014

Elemente de SQL (MySQL)

DEFAULT CHARSET se refera la setul de caractere care vor fi folosite si la relatiile


dintre ele. Pentru bazele de date care trebuie sa stocheze caractere care nus e
regasesc in alfabetul englez standard, cel mai bine este ca tabelele sa stocheze
aceste date in format utf8 (UNICODE codat ca secvente de octeti)
exista mai multe relatii posibile la codarile utf8, cum ar fi:

utf8_bin Compara in mod strict caracterele, folosind codul lor UNICODE


utf8_general_ci Compara caracterele conform regulilor din limba respectiva, fara sa diferentieze
intre caractere mari si mici (ci=case insensitive)
utf8_general_cs Compara caracterele conform regulilor din limba respectiva, diferentiind intre
caractere mari si mici (cs=case sensitive)

ENGINE defineste felul in care MySql isi stocheaza baza de date. MyIsam a fost
stocarea implicita pentru MySql inainte de v5.5. MyIsam este optimizat pentru situatii in
care sunt necesare foarte multe operatii de citire si doar putine de scriere, de exemplu
magazine virtuale in care doar rar se adauga produse noi, dar pot sa existe milioane
de vizualizari ale produselor zilnic. MySql, versiunile mai noi, au trecut la un alt format
de stocare numit InnoDB, care ofera mai multe facilitati, gen tranzactii sau foreign keys

PHP: conectarea la MySQL

in PHP exista mai multe seturi de functii cu ajutorul carora se poate realiza conexia la o
bd MySQL. Vom prezenta folosirea PDO (PHP Data Objects), o extensie care permite
mai multe operatii si este mai usor de folosit. Totodata PDO abstractizeaza mai multe
aspecte referitore la bd SQL, ceea ce permite ca modificand doar in putine locuri un
program, acesta sa poata folosi si alte bd SQL.
initial, in PHP trebuie initiata o conexie la serverul MySQL. Pentru aceasta se foloseste
urmatoarea constructie:
$bd = new PDO("mysql:host=localhost; dbname=e1",'user1','1');
new are acelasi inteles ca in Java sau C++, creand un nou obiect. Constructorul PDO
are urmatoarele argumente:
o primul argument consta dintr-un nume de driver (mysql) si mai multi parametri,
care specifica pe ce server este bd, numele ei, etc.
o al doilea argument este numele utilizatorului folosit pentru conexie
o al treilea argument este parola utilizatorului
in caz de succes, $bd va contine un obiect prin intermediul caruia se vor efectua
interactiunile cu bd
conexia se realizeaza o singura data, la inceputul programului si se foloseste ulterior
ori de cate ori este necesar

15
11/22/2014

PHP: conectarea la MySQL

<table border=1>
<tr><td>Nume</td><td>E-mail</td></tr>
<?php
$bd=new PDO("mysql:host=localhost;dbname=e1 Nume E-mail
,'user1','1');
$utilizatori=$bd->query('SELECT * FROM utilizatori'); Ion ion@mail.com
foreach($utilizatori as $utilizator){ Ana ana@mail.com
echo '<tr><td>'.$utilizator['nume']
.'</td><td>'.$utilizator['email'].'</td></tr>';
}
?>
</table>

metoda query a obiectului $bd executa interogarea SQL si returneaza un vector de


valori, fiecare valoare fiind la randul ei un vector cu datele specifice unei inregistrari
valorile unei inregistrari pot fi accesate atat in mod asociativ, folosind numele
campului inregistrarii ($utilizator['nume']), cat si folosind indexul campului respectiv,
daca se stie ordinea campurilor rezultate din select ($utilizator[1])

SQL: interogari (selectii)

interogarile sunt folosite pentru a extrage date din BD

SELECT [DISTINCT] nume_camp1 [AS nume_alias1], sau *


FROM tabela1,
[WHERE conditie]
[GROUP BY expresie1 [ASC|DESC], ]
[HAVING conditie_where]
[ORDER BY expresie1 [ASC|DESC], ]
[LIMIT [index_inregistrare_initiala,] numar_inregistrari]

[] = optional
nume1, = inseamna ca poate urma nume2, nume3, etc., cu optinile lui propr
* = toate campurile
in SQL nu se face distinctie intre litere mari si mici, dar prin conventie cuvintele
rezervate sunt scrise cu majuscule iar numele de campuri cu litere mici

16
11/22/2014

SQL: interogari (selectii)

cadre id nume dep functie lucrari sex


1 Ion AC prof 78 m
2 Ana ET sl 20 f
3 Maria ETC conf 50 f
4 Mihai ETC conf 45 m
5 Adi AC prof 90 m
6 Cori AC prof 70 f

numele de dupa SELECT indica campurile (coloanele) de care avem nevoie (nu
conteaza ordinea din tabela)
tabelele de unde se extrag aceste coloane se specifica dupa FROM
dupa o comanda SQL se pune punct-virgula (;), pentru a o separa de urmatoarea

SELECT * FROM cadre;


SELECT functie, nume FROM cadre;

SQL: interogari (selectii)

cadre id nume dep functie lucrari sex


1 Ion AC prof 78 m
2 Ana ET sl 20 f
3 Maria ETC conf 50 f
4 Mihai ETC conf 45 m
5 Adi AC prof 90 m
6 Cori AC prof 70 f

numele de dupa SELECT indica campurile (coloanele) de care avem nevoie (nu
conteaza ordinea din tabela)
tabelele de unde se extrag aceste coloane se specifica dupa FROM
dupa o comanda SQL se pune punct-virgula (;), pentru a o separa de urmatoarea

SELECT * FROM cadre; -- selecteaza toate campurile (*) din tabela cadre
SELECT functie, nume FROM cadre;

17
11/22/2014

SQL: interogari (selectii)

cadre id nume dep functie lucrari sex


1 Ion AC prof 78 m
2 Ana ET sl 20 f
3 Maria ETC conf 50 f
4 Mihai ETC conf 45 m
5 Adi AC prof 90 m
6 Cori AC prof 70 f

numele de dupa SELECT indica campurile (coloanele) de care avem nevoie (nu
conteaza ordinea din tabela)
tabelele de unde se extrag aceste coloane se specifica dupa FROM
dupa o comanda SQL se pune punct-virgula (;), pentru a o separa de urmatoarea

SELECT * FROM cadre; -- selecteaza toate campurile (*) din tabela cadre
SELECT functie, nume FROM cadre; -- selecteaza doar functia si numele

SQL: interogari (selectii)

daca exista WHERE, conditia specificata va selecta doar anumite inregistrari (linii)

SELECT nume FROM cadre WHERE functie=prof;

SELECT nume FROM cadre WHERE lucrari>50 AND sex=m;

SELECT DISTINCT dep AS departament FROM cadre;

exista functii care se aplica unei singure inregistrari (LOWER, UPPER,


SUBSTRING, TRIM) si functii care actioneaza asupra tuturor inregistrarilor returnate
(AVG, COUNT, MIN, MAX, SUM)

SELECT MAX(lucrari) AS record_lucrari FROM cadre WHERE sex=f;

SELECT UPPER(nume) FROM cadre WHERE functie=conf

SELECT AVG(lucrari) FROM cadre WHERE dep=AC;

18
11/22/2014

SQL: interogari (selectii)

daca exista WHERE, conditia specificata va selecta doar anumite inregistrari (linii)

SELECT nume FROM cadre WHERE functie=prof; -- selecteaza numele tuturor


-- profesorilor din tabela
SELECT nume FROM cadre WHERE lucrari>50 AND sex=m;

SELECT DISTINCT dep AS departament FROM cadre;

exista functii care se aplica unei singure inregistrari (LOWER, UPPER,


SUBSTRING, TRIM) si functii care actioneaza asupra tuturor inregistrarilor returnate
(AVG, COUNT, MIN, MAX, SUM)

SELECT MAX(lucrari) AS record_lucrari FROM cadre WHERE sex=f;

SELECT UPPER(nume) FROM cadre WHERE functie=conf;

SELECT AVG(lucrari) FROM cadre WHERE dep=AC;

SQL: interogari (selectii)

daca exista WHERE, conditia specificata va selecta doar anumite inregistrari (linii)

SELECT nume FROM cadre WHERE functie=prof; -- selecteaza numele tuturor


-- profesorilor din tabela
SELECT nume FROM cadre WHERE lucrari>50 AND sex=m; -- selecteaza
-- numele tuturor barbatilor care au mai mult de 50 lucrari
SELECT DISTINCT dep AS departament FROM cadre;

exista functii care se aplica unei singure inregistrari (LOWER, UPPER,


SUBSTRING, TRIM) si functii care actioneaza asupra tuturor inregistrarilor returnate
(AVG, COUNT, MIN, MAX, SUM)

SELECT MAX(lucrari) AS record_lucrari FROM cadre WHERE sex=f;

SELECT UPPER(nume) FROM cadre WHERE functie=conf

SELECT AVG(lucrari) FROM cadre WHERE dep=AC;

19
11/22/2014

SQL: interogari (selectii)

daca exista WHERE, conditia specificata va selecta doar anumite inregistrari (linii)

SELECT nume FROM cadre WHERE functie=prof; -- selecteaza numele tuturor


-- profesorilor din tabela
SELECT nume FROM cadre WHERE lucrari>50 AND sex=m; -- selecteaza
-- numele tuturor barbatilor care au mai mult de 50 lucrari
SELECT DISTINCT dep AS departament FROM cadre; -- selecteaza o singura data
-- fiecare nume de departament si redenumeste campul ca departament

exista functii care se aplica unei singure inregistrari (LOWER, UPPER,


SUBSTRING, TRIM) si functii care actioneaza asupra tuturor inregistrarilor returnate
(AVG, COUNT, MIN, MAX, SUM)

SELECT MAX(lucrari) AS record_lucrari FROM cadre WHERE sex=f;

SELECT UPPER(nume) FROM cadre WHERE functie=conf;

SELECT AVG(lucrari) FROM cadre WHERE dep=AC;

SQL: interogari (selectii)

daca exista WHERE, conditia specificata va selecta doar anumite inregistrari (linii)

SELECT nume FROM cadre WHERE functie=prof; -- selecteaza numele tuturor


-- profesorilor din tabela
SELECT nume FROM cadre WHERE lucrari>50 AND sex=m; -- selecteaza
-- numele tuturor barbatilor care au mai mult de 50 lucrari
SELECT DISTINCT dep AS departament FROM cadre; -- selecteaza o singura data
-- fiecare nume de departament si redenumeste campul ca departament

exista functii care se aplica unei singure inregistrari (LOWER, UPPER,


SUBSTRING, TRIM) si functii care actioneaza asupra tuturor inregistrarilor returnate
(AVG, COUNT, MIN, MAX, SUM)

SELECT MAX(lucrari) AS record_lucrari FROM cadre WHERE sex=f; -- returneaza


-- numarul maxim de lucrari scrise de o femeie
SELECT UPPER(nume) FROM cadre WHERE functie=conf;

SELECT AVG(lucrari) FROM cadre WHERE dep=AC;

20
11/22/2014

SQL: interogari (selectii)

daca exista WHERE, conditia specificata va selecta doar anumite inregistrari (linii)

SELECT nume FROM cadre WHERE functie=prof; -- selecteaza numele tuturor


-- profesorilor din tabela
SELECT nume FROM cadre WHERE lucrari>50 AND sex=m; -- selecteaza
-- numele tuturor barbatilor care au mai mult de 50 lucrari
SELECT DISTINCT dep AS departament FROM cadre; -- selecteaza o singura data
-- fiecare nume de departament si redenumeste campul ca departament

exista functii care se aplica unei singure inregistrari (LOWER, UPPER,


SUBSTRING, TRIM) si functii care actioneaza asupra tuturor inregistrarilor returnate
(AVG, COUNT, MIN, MAX, SUM)

SELECT MAX(lucrari) AS record_lucrari FROM cadre WHERE sex=f; -- returneaza


-- numarul maxim de lucrari scrise de o femeie
SELECT UPPER(nume) FROM cadre WHERE functie=conf; -- selecteaza toti
-- conferentiarii, returnand numele lor cu majuscule
SELECT AVG(lucrari) FROM cadre WHERE dep=AC

SQL: interogari (selectii)

daca exista WHERE, conditia specificata va selecta doar anumite inregistrari (linii)

SELECT nume FROM cadre WHERE functie=prof; -- selecteaza numele tuturor


-- profesorilor din tabela
SELECT nume FROM cadre WHERE lucrari>50 AND sex=m; -- selecteaza
-- numele tuturor barbatilor care au mai mult de 50 lucrari
SELECT DISTINCT dep AS departament FROM cadre; -- selecteaza o singura data
-- fiecare nume de departament si redenumeste campul ca departament

exista functii care se aplica unei singure inregistrari (LOWER, UPPER,


SUBSTRING, TRIM) si functii care actioneaza asupra tuturor inregistrarilor returnate
(AVG, COUNT, MIN, MAX, SUM)

SELECT MAX(lucrari) AS record_lucrari FROM cadre WHERE sex=f; -- returneaza


-- numarul maxim de lucrari scrise de o femeie
SELECT UPPER(nume) FROM cadre WHERE functie=conf; -- selecteaza toti
-- conferentiarii, returnand numele lor cu majuscule
SELECT AVG(lucrari) FROM cadre WHERE dep=AC; -- returnaza media numarului
-- lucrarilor scrise in departamentul AC

21
11/22/2014

SQL: interogari (selectii)

daca exista clauza ORDER BY, inregistrarile selectate vor fi ordonate in ordinea
specificata
daca exista mai multe expresii dupa ORDER BY, prima oara se vor sorta
inregistrarile dupa prima expresie si daca exista mai multe inregistrari care sunt
identice din punct de vedere al primei expresii, ele se vor sorta dupa a doua expresie,
etc.
implicit, ORDER BY ordoneaza in ordine crescatoare (ASC). Daca se doreste
ordonare in ordine descrescatoare, se foloseste DESC dupa numele expresiei de
sortat

-- selecteaza in
-- ordine alfabetica dupa nume toate femeile
-- selecteaza numele
-- tuturor cadrelor, sortate in ordinea alfabetica a departamenteleor si in cadrul
-- fiecarui departament, sortate in ordinea descrescatoare e numarului de lucrari

SQL: interogari (selectii)

daca exista clauza ORDER BY, inregistrarile selectate vor fi ordonate in ordinea
specificata
daca exista mai multe expresii dupa ORDER BY, prima oara se vor sorta
inregistrarile dupa prima expresie si daca exista mai multe inregistrari care sunt
identice din punct de vedere al primei expresii, ele se vor sorta dupa a doua expresie,
etc.
implicit, ORDER BY ordoneaza in ordine crescatoare (ASC). Daca se doreste
ordonare in ordine descrescatoare, se foloseste DESC dupa numele expresiei de
sortat

SELECT nume FROM cadre WHERE sex=f ORDER BY nume; -- selecteaza in


-- ordine alfabetica dupa nume toate femeile
-- selecteaza numele
-- tuturor cadrelor, sortate in ordinea alfabetica a departamenteleor si in cadrul
-- fiecarui departament, sortate in ordinea descrescatoare e numarului de lucrari

22
11/22/2014

SQL: interogari (selectii)

daca exista clauza ORDER BY, inregistrarile selectate vor fi ordonate in ordinea
specificata
daca exista mai multe expresii dupa ORDER BY, prima oara se vor sorta
inregistrarile dupa prima expresie si daca exista mai multe inregistrari care sunt
identice din punct de vedere al primei expresii, ele se vor sorta dupa a doua expresie,
etc.
implicit, ORDER BY ordoneaza in ordine crescatoare (ASC). Daca se doreste
ordonare in ordine descrescatoare, se foloseste DESC dupa numele expresiei de
sortat

SELECT nume FROM cadre WHERE sex=f ORDER BY nume; -- selecteaza in


-- ordine alfabetica dupa nume toate femeile
SELECT nume FROM cadre ORDER BY dep, lucrari DESC; -- selecteaza numele
-- tuturor cadrelor, sortate in ordinea alfabetica a departamenteleor si in cadrul
-- fiecarui departament, sortate in ordinea descrescatoare e numarului de lucrari

SQL: interogari (selectii)

daca exista clauza GROUP BY, inregistrarile selectate se vor grupa conform
expresiilor de la GROUP BY
aceasta grupare este utila atunci cand dorim ca functiile care actioneaza pe toate
inregistrarile selectate (SUM, MAX) sa actioneze separat, in cadrul anumitor grupuri

-- pentru fiecare
-- departament selecteaza numele departamentului si media numarului de lucrari
-- selecteaza pentru fiecare
-- sex in parte numarul maxim de lucrari

ATENTIE: daca se foloseste GROUP BY, nu se mai pot accesa campurile individuale
ale inregistrarilor dintr-un grup, ci doar campuri sau expresii care sunt la fel pentru tot
grupul respectiv. De exemplu, SELECT nume, sex, MAX(lucrari) FROM cadre
GROUP BY sex nu va afisa decat in anumite situatii numele persoanei care are
numarul maxim de lucrari, de obicei afisandu-se numele primei sau ultimei persoane
din grup

23
11/22/2014

SQL: interogari (selectii)

daca exista clauza GROUP BY, inregistrarile selectate se vor grupa conform
expresiilor de la GROUP BY
aceasta grupare este utila atunci cand dorim ca functiile care actioneaza pe toate
inregistrarile selectate (SUM, MAX) sa actioneze separat, in cadrul anumitor grupuri

SELECT dep, AVG(lucrari) FROM cadre GROUP BY dep; -- pentru fiecare


-- departament selecteaza numele departamentului si media numarului de lucrari
-- selecteaza pentru fiecare
-- sex in parte numarul maxim de lucrari

ATENTIE: daca se foloseste GROUP BY, nu se mai pot accesa campurile individuale
ale inregistrarilor dintr-un grup, ci doar campuri sau expresii care sunt la fel pentru tot
grupul respectiv. De exemplu, SELECT nume, sex, MAX(lucrari) FROM cadre
GROUP BY sex nu va afisa decat in anumite situatii numele persoanei care are
numarul maxim de lucrari, de obicei afisandu-se numele primei sau ultimei persoane
din grup

SQL: interogari (selectii)

daca exista clauza GROUP BY, inregistrarile selectate se vor grupa conform
expresiilor de la GROUP BY
aceasta grupare este utila atunci cand dorim ca functiile care actioneaza pe toate
inregistrarile selectate (SUM, MAX) sa actioneze separat, in cadrul anumitor grupuri
daca exista clauza WHERE, aceasta va fi evaluata prima si abia apoi va fi evaluat
GROUP BY

SELECT dep, AVG(lucrari) FROM cadre GROUP BY dep; -- pentru fiecare


-- departament selecteaza numele departamentului si media numarului de lucrari
SELECT sex, MAX(lucrari) FROM cadre GROUP BY sex; -- selecteaza pentru fiecare
-- sex in parte numarul maxim de lucrari

-- selecteaza doar pentru profesori numarul maxim de lucrari pe sexe

ATENTIE: daca se foloseste GROUP BY, nu se mai pot accesa campurile individuale
ale inregistrarilor dintr-un grup, ci doar campuri sau expresii care sunt la fel pentru tot
grupul respectiv. De exemplu, SELECT nume, sex, MAX(lucrari) FROM cadre
GROUP BY sex nu va afisa decat in anumite situatii numele persoanei care are
numarul maxim de lucrari, de obicei afisandu-se numele primei sau ultimei persoane
din grup

24
11/22/2014

SQL: interogari (selectii)

daca exista clauza GROUP BY, inregistrarile selectate se vor grupa conform
expresiilor de la GROUP BY
aceasta grupare este utila atunci cand dorim ca functiile care actioneaza pe toate
inregistrarile selectate (SUM, MAX) sa actioneze separat, in cadrul anumitor grupuri
daca exista clauza WHERE, aceasta va fi evaluata prima si abia apoi va fi evaluat
GROUP BY

SELECT dep, AVG(lucrari) FROM cadre GROUP BY dep; -- pentru fiecare


-- departament selecteaza numele departamentului si media numarului de lucrari
SELECT sex, MAX(lucrari) FROM cadre GROUP BY sex; -- selecteaza pentru fiecare
-- sex in parte numarul maxim de lucrari
SELECT sex, MAX(lucrari) FROM cadre WHERE functie=prof GROUP BY sex;
-- selecteaza doar pentru profesori numarul maxim de lucrari pe sexe

ATENTIE: daca se foloseste GROUP BY, nu se mai pot accesa campurile individuale
ale inregistrarilor dintr-un grup, ci doar campuri sau expresii care sunt la fel pentru tot
grupul respectiv. De exemplu, SELECT nume, sex, MAX(lucrari) FROM cadre
GROUP BY sex nu va afisa decat in anumite situatii numele persoanei care are
numarul maxim de lucrari, de obicei afisandu-se numele primei sau ultimei persoane
din grup

SQL: interogari (selectii)

daca exista clauza HAVING, expresia sa va avea rolul de a selecta doar anumite
grupuri dintre cele formate de GROUP BY, (excluzandu-le pe celelalte)
expresia clauzei HAVING poate fi formata doar din nume de campuri dupa care s-a
facut GROUP BY sau din functii care actioneaza la nivel de grup.

SELECT dep, MAX(lucrari) FROM cadre GROUP BY dep HAVING dep<>AC --


pentru toate departamentele in afara de AC, selecteaza departamentul si numarul
maxim de lucrari din el
SELECT sex, MAX(lucrari) FROM cadre GROUP BY sex HAVING functie=prof
-- este eronata fiindca nu s-a facut GROUP BY dupa functie
SELECT COUNT(id) FROM cadre GROUP BY dep HAVING SUM(lucrari)>=100;
-- returneaza numarul de cadre din fiecare departament, daca departamentul are cel -
-- putin un total de 100 de lucrari publicate

25
11/22/2014

SQL: interogari (selectii)

daca exista clauza LIMIT, se va limita numarul de inregistrari selectate si posibil


indicandu-se indexul de la care se va incepe returnarea lor
LIMIT este foarte utila cand se cere sa se pagineze rezultatele selectate din BD, de
exemplu dorindu-se sa se afiseze doar cate 20 de intregistrari pe pagina

SELECT * FROM cadre ORDER BY lucrari DESC LIMIT 1; -- returneaza toate


-- informatiile despre persoana care are cel mai mare numar de lucrari
SELECT * FROM cadre ORDER BY nume LIMIT 100, 20; -- selecteaza 20 de
-- persoane, incepand cu indexul 100. Daca se considera o paginare de 20 de
-- persoane/pagina, aceasta interogare va selecta persoanele care se vor afisa pe
-- a 6-a pagina

SQL: interogari (selectii)


de multe ori exista o legatura (relatie) intre doua sau mai multe tabele (din acest
motiv aceste baze de date se si numesc RDBMS=Relational DataBase Management
System)
relatiile intre doua tabele pot sa fie de doua tipuri:
1 la 1 (one to one, 1..1) unei inregistrari dintr-o tabela ii corespunde o
singura inregistrare din alta tabela, de exemplu fiecare persoana are asociata o
singura inregistrare cu detalii despre ea (data nasterii, )
1 la n (one to many, 1..n, 1..*, 1..) unei inregistrari dintr-o tabela ii pot
corespunde zero, una sau mai multe inregistrari din alta tabela, de exemplu
fiecare persoana are asociate 0, 1 sau mai multe lucrari
pentru a se putea asocia doua tabele, trebuie sa existe unul sau mai multe campuri
care sa faca asocierea dintre cele doua tabele. De exemplu intr-o tabela de lucrari
trebuie sa existe un camp cid (cadru_id) care sa indice pentru fiecare lucrare carui
cadru ii apartine
operatia de a lega datele din doua sau mai multe tabele intre ele se numeste join si
are ca rezultat o noua tabela, care poate avea campuri din oricare dintre tabelele
initiale si campuri care sunt rezultatele unor formule.
pentru a se face join, in clauza FROM se adauga fiecare tabela participanta.
daca in tabelele participante exista campuri care au acelasi nume, pentru a se
diferentia intre ele, acestea se prefixeaza cu numele tabelei lor si punct (.)

26
11/22/2014

SQL: interogari (selectii)

lucrari
id cid nume data
1 5 Algoritm optimizat de parcurgere al arborilor generalizati 17.09.2011
2 5 Procesari SQL paralele 24.03.2007
3 6 Integrarea GPU in algoritmii de compilare 15.04.20012
4 6 Euristici in procesarea paralela 05.11.2011
5 4 Reducerea SAR la terminalele GSM 27.03.2013

tabela lucrari contine lucrarile persoanelor din tabela cadre.


pentru a se putea relationa cele doua tabele, tabela lucrari contine campul cid
(cadru_id) care contine identificatorul persoanei careia ii apartine lucrarea respectiva.
De exemplu, lucrarile cu id-urile 1 si 2 ii apartin lui Adi, deoarece in tabela cadre, Adi
are id-ul 5.

SELECT nume FROM lucrari WHERE cid=6; -- selecteaza numele tuturor lucrarilor
-- care ii apartin cadrului cu id-ul 6 (Cori)

SQL: interogari (selectii)

SELECT cadre.nume, lucrari.nume, data FROM cadre, lucrari WHERE cadre.id=cid


ORDER BY data DESC

27
11/22/2014

SQL: interogari (selectii)

SELECT cadre.nume, lucrari.nume, data FROM cadre, lucrari WHERE cadre.id=cid


ORDER BY data DESC

selecteaza simultan din tabelele cadre si lucrari inregistrarile care indeplinesc


conditia cadre.id=cid. Aceasta conditie de fapt asociaza fiecare lucrare, folosind cid-
ul ei cu cadrul caruia ii apartine acea lucrare.
va rezulta o noua tabela temporara, care are campuri din ambele tabele initiale si in
care fiecare inregistrare consta din numele unui cadru, numele unei lucrari apartinand
cadrului respectiv si data publicarii lucrarii respective.
deoarece un cadru poate avea mai multe lucrari, conditia cadre.id=cid este de tipul
1 to n, avand drept consecinta crearea mai multor inregistari in tabela temporara
pentru cadrele care au mai multe lucrari in tabela lucrari.
acolo unde in tabelele cadre si lucrari un camp are acelasi nume (ex: nume, id),
numele campului a trebuit sa fie prefixat cu tabela din care face parte, urmata de
punct (.), pentru a se specifica neunivoc la care camp se face referire
in final inregistrarile tabelei rezultate sunt sortate in ordinea invers cronologica a
publicarii lucrarilor

SQL: interogari (selectii)

SELECT COUNT( lucrari ) , dep FROM cadre, lucrari WHERE cadre.id = cid GROUP
BY dep

in caz de join, clauzele GROUP BY si HAVING actioneaza asupra tabelei rezultate


selectia de mai sus, returneaza numarul total de lucrari aflat in tabela lucrari, pentru
fiecare departament

SELECT DISTINCT cadre.nume FROM cadre, lucrari WHERE cadre.id=cid

28
11/22/2014

SQL: interogari (selectii)

SELECT COUNT( lucrari ) , dep FROM cadre, lucrari WHERE cadre.id = cid GROUP
BY dep

in caz de join, clauzele GROUP BY si HAVING actioneaza asupra tabelei rezultate


selectia de mai sus, returneaza numarul total de lucrari aflat in tabela lucrari, pentru
fiecare departament

SELECT DISTINCT cadre.nume FROM cadre, lucrari WHERE cadre.id=cid

selecteaza toate numele de cadre care au lucrari in tabela lucrari


fiecare nume de cadru apare o singura data

SQL: interogari (selectii)

o selectie poate avea ca sursa de date rezultatele unei alte selectii. In acest caz
vorbim de selectii imbricate. Acestea sunt posibile deoarece rezultatul unei selectii
este tot o tabela (posibil de 1 sau 0 inregistrari), iar in aceasta tabela se pot face
ulterior noi selectii.
in cazul selectiilor imbricate este necesar ca fiecare dintre acestea sa primeasca
cate un alias. Aceste aliasuri vor fi considerate numele tabelelor temporare in care
vor fi stocate rezultatele fiecarei selectii imbricate.

SELECT nume, max_lucrari, dep


FROM cadre,
( SELECT MAX( lucrari ) AS max_lucrari, dep AS d1
FROM cadre
GROUP BY dep ) AS t1
WHERE dep = d1 AND lucrari = max_lucrari

29
11/22/2014

SQL: interogari (selectii)


o selectie poate avea ca sursa de date rezultatele unei alte selectii. In acest caz
vorbim de selectii imbricate. Acestea sunt posibile deoarece rezultatul unei selectii
este tot o tabela (posibil de 1 sau 0 inregistrari), iar in aceasta tabela se pot face
ulterior noi selectii.
in cazul selectiilor imbricate este necesar ca fiecare dintre acestea sa primeasca
cate un alias. Aceste aliasuri vor fi considerate numele tabelelor temporare in care
vor fi stocate rezultatele fiecarei selectii imbricate.

SELECT nume, max_lucrari, dep nume max_lucrari dep


FROM cadre,
( SELECT MAX( lucrari ) AS max_lucrari, dep AS d1 Ana 20 ET
FROM cadre Maria 50 ETC
GROUP BY dep ) AS t1
Adi 90 AC
WHERE dep = d1 AND lucrari = max_lucrari

prima oara se va efectua selectul imbricat si va rezulta tabela t1, avand campurile
max_lucrari si d1
in a 2-a faza, se va efectua un join intre tabelele cadre si t1, conform conditiilor din
where, pentru a se asocia la fiecare departament si numar maxim de lucrari, una sau
mai multe persoane

SQL: interogari (selectii)


o tabela rezultata dintr-un select imbricat poate fi folosita pentru join cu alta tabela

SELECT nume, nr_lucrari FROM


cadre,
(SELECT cid, count(cid) AS nr_lucrari
FROM lucrari
GROUP BY cid) AS t1
WHERE id=cid
ORDER BY nr_lucrari DESC, nume

30
11/22/2014

SQL: interogari (selectii)


o tabela rezultata dintr-un select imbricat poate fi folosita pentru join cu alta tabela
SELECT nume, nr_lucrari FROM
cadre,
(SELECT cid, count(cid) AS nr_lucrari
FROM lucrari
GROUP BY cid) AS t1
WHERE id=cid
ORDER BY nr_lucrari DESC, nume

initial se executa selectia imbricata, care are ca rezultat o tabela (t1) cu doua
campuri (cid, nr_lucrari), si care asociaza pentru fiecare cid din lucrari, numarul de
lucrari inregistrate
se face join intre tabela cadre si tabela t1 dupa campul cid, pentru a se asocia
fiecarui cadru numarul de lucrari din tabela lucrari
rezultatul final este o tabela care contine numele cadrului si numarul sau de lucrari
din tabela lucrari, sortat descendent dupa numarul de lucrari si daca mai multe cadre
au acelasi numar de lucrari, intre ele vor fi sortate alfabetic
se poate observa ca nu a fost nevoie sa se prefixeze niciun nume de camp cu
numele tabelei careia ii apartine, din cauza ca in tabela t1 cu care s-a facut join la
cadre nu exista nicun camp care are un nume similar cu alt camp din cadre

SQL: inserare (INSERT)


inserarea (adaugarea) uneia sau mai multor intregistrari intr-o tabela se face cu
instructiunea:

INSERT INTO nume_tabela (nume_camp1,nume_camp2,) VALUES (val_camp1,


val_camp2, ), (),

nume_tabela - tabela unde se vor insera inregistrarile


nume_camp1, - numele campurilor din tabela
val_camp1, - valorile corespunzatoare campurilor din tabela.

ATENTIE: valorile trebuie sa fie in EXACT aceeasi ordine ca si campurile


corespunzatoare lor, deoarece campurile si valorile se considera in perechi

fiecare pereche de paranteze de dupa VALUES corespunde unei noi inregistrari.


Pot fi date mai multe inregistrari, separate prin virgula (,).
nu conteaza ordinea campurilor, dar este bine ca aceasta sa fie aceeasi ca ordinea
lor din baza de date. In acest fel devine mai usoara compararea instructiunii INSERT
cu baza de date, pentru a se evalua corectitudinea si efectele ei

31
11/22/2014

SQL: inserare (INSERT)


INSERT INTO cadre (id,nume,dep,functie,lucrari,sex) VALUES
(0,Gheorghe,ET,asistent,15,m);

este posibil sa nu se dea toate campurile, cu conditia ca acestea (cele care nu sunt
date) sa aiba specificate la definirea tabelei valori implicite (DEFAULT). Totusi este
bine sa se dea de fiecare data toate campurile, fiindca astfel este mai usor pentru
programator sa testeze daca nu cumva a uitat vre-un camp
campurile AUTO_INCREMENT trebuie sa aiba ori valoarea 0, ori sa nu fie date,
pentru a ii permite bazei de date sa isi seteze valoarea corecta (cu 1 mai mare decat
maximul valorilor din tabela)
ca peste tot in SQL, valorile numerice sunt date ca numere, iar cele de tip caracter
sau sir de caracter sunt date intre apostroafe () sau ghilimele ()
ca valori se pot specifica si expresii sau functii:

INSERT INTO anunturi (id,text,data) VALUES (0,Merge reteaua!, NOW());

NOW() este o functie care se evalueaza in functie de context (tipul campului data) la
o valoare de tip DATE, TIME sau DATETIME, care este chiar data si timpul de
introducere a unei inregistrari in tabela

SQL: stergere (DELETE)

stergerea uneia sau a mai multor inregistrari dintr-o tabela se face cu instructiunea:

DELETE FROM nume_tabela WHERE conditie;

sterge din tabela nume_tabela toate campurile care indeplinesc conditia data

ATENTIE: in cazul in care exista relatii intre tabele, trebuie avut grija sa se respecte
consistenta (integritatea) inregistrarilor dupa operatiile de stergere. Integritatea
inregistrarilor se mentine daca dupa stergere nu vor exista inregistrari care sunt
dependente de cele sterse si care nu au sens fara acestea. De obicei, la operatiile de
stergere, se sterg prima data inregistrarile dependente si apoi inregistrarea de baza.

De exemplu, daca s-a sters dintr-un magazin virtual o categorie de produse, trebuie
sterse toate produsele din acea categorie (daca ele nu au fost in prealabil
redistribuite la alte categorii), fiind ca ele oricum nu vor mai putea fi afisate sau
prelucrate corect dupa aceea.

32
11/22/2014

SQL: stergere (DELETE)

DELETE FROM lurari WHERE cid=5;


DELETE FROM cadre WHERE id=5;

tabela lucrari contine lucrarile cadrelor din tabela cadre. Campul id din cadre este
intr-o relatie de 1..n cu campul cid din lucrari
prima oara s-au sters din tabela lucrari toate inregistrarile corespunzatoare cadrului
cu id-ul 5, iar ulterior s-a sters din cadre chiar cadrul respectiv (cu id-ul 5)
ca rezultat final, s-a sters atat cadrul specificat cat si toate lucrarile sale si baza de
date isi pastreaza consistenta (integritatea)
este foarte important ca la stergere conditia data sa fie strict specifica pentru
inregistrarile care trebuiesc sterse. Din acest motiv se prefera in marea majoritate a
cazurilor sa se stearga dupa id-uri care sunt unice. Daca in exemplul de mai sus, s-ar
fi sters din tabela cadre folosind conditia WHERE nume=Adi, ar fi existat pericolul sa
se stearga si alte cadre care au tot numele Adi
cand se proiecteaza aplicatii de baze de date, este bine ca in sectiunea de
administrare sa existe o optiune de verificare a consistentei bazei de date, de
exemplu sa caute si sa stearga toate produsele fara categorie, toate comentariile fara
articolele la care au fost facute, etc

SQL: actualizare (UPDATE)

UPDATE nume_tabela SET nume_camp1=val1, nume_camp2=val2, WHERE


conditie

nume_tabela - tabela in care se va face actualizarea


nume_camp1, - numele campurilor ale caror valori vor fi actualizate
val1, - noile valori care vor fi date campurilor respective
conditie - conditia de selectie a campurilor care vor fi actualizate

UPDATE actualizeaza toate campurile din tabela nume_tabela care au fost


specificate si care indeplinesc conditia data. Noile valori sunt cele date la fiecare
camp. In toate inregistrarile selectate la un anumit camp, i se va seta valoarea data
pentru el.
valorile pot fi numere, caractere sau siruri de caractere intre apostroafe () sau
ghilimele () sau expresii
expresiile pot contine si vechile valori ale campurilor inregistrarii respective, ceea ce
este util de exemplu la incrementarea unor valori

33
11/22/2014

SQL: actualizare (UPDATE)

UPDATE cadre SET lucrari=25, functie=conf WHERE id=2;


UPDATE cadre SET lucrari=lucrari+1 WHERE id=3;
UPDATE angajati SET salariu=salariu*1.1;

este foarte important ca la actualizare conditia data sa fie strict specifica pentru
inregistrarile care trebuiesc actualizate. Din acest motiv se prefera in marea
majoritate a cazurilor sa se actualizeze dupa id-uri care sunt unice. Daca in exemplul
de mai sus, s-ar fi actualizat in tabela cadre folosind conditia WHERE nume=Ana, ar
fi existat pericolul sa se actualizeze si alte cadre care au tot numele Ana
se observa din al 2-lea exemplu ca s-a putut folosi valoarea anterioara a unui camp
din inregistrarea respectiva, pentru ca pe baza acesteia sa se calculeze noua valoare
Observatie: intotdeauna valorile care apar in partea dreapta a semnului egal (=) intr-
un SET, se refera la valori ANTERIOARE actualizarii (valorile care se afla stocate
curent in inregistrarea de actualizat).
se observa din al 3-lea exemplu ca un UPDATE poate modifica mai multe
inregistrari. Clauza WHERE poate chiar sa lipseasca complet si atunci se vor
modifica toate inregistrarile din tabela

PHP: primire date de la utilizator


un utilizator (browser sau script), poate trimite date in mod standard la un server
care foloseste PHP in doua feluri:
GET datele sunt codate chiar in URL-ul (Uniform Resource Locator, sau link-
ul) trimis. Aceasta metoda are avantajul de a fi foarte simplu de folosit, deoarece
trebuie doar formatat un link cu care va fi apelat serverul. Ca dezavantaj, se pot
trimite destul de putine date, deoarece in general link-ul nu poate avea orice
lungime
POST la un link dorit (URL_destinatie) se transmite un pachet de date care
contine toate datele de intrare care se afla in interiorul unui tag <form
action=URL-destinatie method=post></form> . Prin aceasta metoda se pot
transmite cantitati mari de date (de ordinul zecilor sau sutelor de MB, daca
setarile serverului permit aceasta) si se pot trimite si informatii binare (fisiere
binare).
trimiterea de la utilizator catre PHP si ulterior primirea raspunsului de la PHP se fac
folosind protocolul HTTP (HyperText Transfer Protocol), care presupune o trimitere
(send) si o receptie de raspuns (receive) de la utilizator
pe langa datele GET si POST, prin HTTP se mai trimit si alte date (headers) cum ar
fi: tipul si versiunea browser-ului clientului, cookie-uri active, etc
prin HTTP datele se transmit in clar, deci oricine care intercepteaza comunicatia
poate citi simplu ce se transmite. Exista si o varianta criptata (HTTPS- Secure
HTTP), care cripteaza datele atat la send cat si la receive

34
11/22/2014

PHP: primire date prin GET


pentru a se trimite date prin GET, acestea se scriu la sfarsitul URL-ului, dupa semnul
intrebarii (?), folosind perechi de nume_variabila=valoare_variabila, separate prin
ampersand(&)

https://www.google.ro/search?q=timisoara&lr=lang_ro

in exemplul de mai sus, se transmit catre pagina search a site-ului www.google.ro,


folosind protocolul HTTPS doua variabile:
q cu valoarea timisoara, reprezentand sirul de caractere care va fi cautat
lr cu valoarea lang_ro, specificand faptul ca vor fi cautate doar paginile scrise
in limba romana
caracterele care au o semnificatie speciala in codificarea GET, trebuie sa fie
transformate in secvente ESCAPE de caractere, analog secventelor folosite in printf
spatiu ! # $ & ' ( ) * + , / : ; = ? @ [ ]
%20 %21 %23 %24 %26 %27 %28 %29 %2A %2B %2C %2F %3A %3B %3D %3F %40 %5B %5D
de exemplu, daca se doreste sa se caute secventa operatorul &, sirul variabilei q va
trebui sa fie codat operatorul%20%26. Se poate constata ca dupa % trebuie sa
urmeze pe doua caractere codul ASCII exprimat in hexazecimal.
in PHP exista functiile urlencode/urldecode care codeaza, respectiv decodeaza un
sir de caractere la formatul necesitat de GET

PHP: primire date prin GET

cand datele transmise prin GET sunt receptionate de PHP, acestea sunt automat
decodificate din formatul lor specific si toate perechile de (variabila,valoare) sunt
depuse in vectorul asociativ $_GET inainte de executia scriptului PHP
$_GET este superglobal, adica este automat vizibil in functii fara a mai fi necesar sa
fie declarat la inceputul functiei cu global

echo valoarea variabilei <b>q</b> este <font color=red>.$_GET[q].</font>;

pentru exemplul anterior, in care se cauta cuvantul timisoara, pe ecran va aparea:

valoarea variabilei q este timisoara

daca se doreste sa se afiseze valorile tuturor variabilelor primite de la utilizator,


pentru se vedea atat numele cat si valorile lor, se poate folosi functia
var_dump($_GET)
var_dump afiseaza continutul variabilei (vector, obiect, etc) primita ca argument si
este foarte utila pentru depanarea programelor

35
11/22/2014

PHP: primire date prin POST


pentru a se trimite date prin POST, acestea sunt grupate intr-un pachet de date,
folosind tag-ul <form action=URL_destinatie method=post></form>
tot ce se afla in interiorul lui form se transmite ca un singur pachet de date la URL-ul
specificat
URL-ul specificat poate sa cuprinda o secventa de variabile GET
in HTML exista mai multe tag-uri care pot genera variabile ce vor fi trimise la server,
cum ar fi: input, textarea, select,

<form action=index.php?actiune=login method=post>


<table>
<tr><td>E-mail</td><td><input type=text name=email /></td></tr>
<tr><td>Parola</td><td><input type=password name=parola /></td></tr>
<tr><td colspan=2 align=center><input type=submit
value=Login/></td></tr>
</table>
</form>

cand se apasa pe butonul avand textul Login, se vor trimite la server (submit) doua
variabile prin POST: email si parola, avand valorile introduse de utilizator in
campurile respective (tipurile text si password ale tagului input genereaza variabile)
si o variabila prin GET: actiune

PHP: primire date prin POST


cand datele transmise prin POST sunt receptionate de PHP, acestea sunt automat
decodificate din formatul lor specific si toate perechile de (variabila,valoare) sunt
depuse in vectorul asociativ $_POST inainte de executia scriptului PHP
$_POST este superglobal, adica este automat vizibil in functii fara a mai fi necesar
sa fie declarat la inceputul functiei cu global

if($_GET[actiune]==login)
echo pentru utilizatorul avand email-ul <b>.$_POST[email]
.</b> s-a transmis parola <font
color=red>.$_POST[parola].</font>;

pentru exemplul anterior, in care se doreste logarea unui utilizator avand email-ul
ion@mail.com si parola aaa, pe ecran va aparea:

pentru utilizatorul avand email-ul ion@mail.com s-a transmis parola aaa

se poate constata ca variabila actiune a fost depusa in vectorul $_GET, fiindca a


fost postfixata URL-ului destinatie
daca se doreste sa se afiseze valorile tuturor variabilelor primite de la utilizator,
pentru se vedea atat numele cat si valorile lor, se poate folosi functia
var_dump($_POST)

36
11/22/2014

HTML: tag-ul input


tag-ul input poate prelua date de la utilizator in mai multe formate. Formatele sunt
date de atributul type, care poate avea urmatoarele valori: button, checkbox, color,
date, datetime, datetime-local, email, file, hidden, image, month, number,
password, radio, range, reset, search, submit, tel, text, time, url, week
atributul name specifica numele variabilei care va fi creata de acest tag
atributul value specifica valoarea de inceput care va fi afisata de tag-ul respectiv.
Este foarte util atunci cand se doreste, de exemplu reintroducerea sau modificarea
unor date existente (daca un utilizator nu a completat unele campuri sau le-a completat
gresit, ceea ce s-a completat deja poate fi trimis inapoi la utilizator in atributele value
ale tag-urilor din form, pentru a nu mai trebui sa fie reintroduse)
in principiu orice form trebuie sa aiba un <input type=submit value=text_buton/>
sau <input type=image src=url_imagine alt=text_explicativ/> care, atunci cand
sunt apasate, realizeaza trimiterea datelor din form la utilizator. Diferenta intre cele
doua input-uri este ca primul afiseaza un buton cu textul dat, iar a 2-lea afiseaza o
imagine si optional, daca se ramane cu mouse-ul peste ea, un text explicativ

HTML: tag-ul input


<?php
$vNume=$eroare=$succes=;
if($_GET[actiune]==adauga){
$nume=$_POST[nume];
if(strlen($nume)<4){
$eroare=nume prea scurt;
$vNume=$nume;
}else{
//introducere nume in baza de date
$succes=numele a fost introdus;
}
}
if($eroare)echo <font color=red>Eroare: $eroare</font>;
if($succes)echo <font color=green>Succes: $succes</font>;
?>

<form action=?actiune=adauga method=post>


Nume: <input type=text value=<?=php echo $vNume;?>;?> />
<br/>
<input type=submit value=Adauga nume nou/>
</form>

37
11/22/2014

HTML: tag-ul input


$vNume este folosit pentru a trimite inapoi la HTML valoarea implicita a valorii
campului nume din form. Prefixul v vine de la value. Initial $vNume este un sir vid si
deci nu se afiseaza nicio valoare implicita. Daca in schimb a aparut o eroare la tratarea
datelor, $vNume va fi setat pe valoarea primita de la utilizator, pntru a se putea rescrie
aceasta valoare in form.
$succes si $eroare sunt folosite pentru a furniza feedback utilizatorului, relativ la
starea operatiei efectuate.
IMPORTANT: intotdeauna se va furniza utilizatorului un feedback dupa fiecare operatie
executata, pentru a i se confirma acestuia indeplinirea cu succes sau esuarea operatiei
respective
pentru aplicatii mai pretentioase, eroarea se poate furniza explicit pentru fiecare
camp din form, de exemplu, afisandu-se deasupra sau la dreapta acestia un mesaj
explicativ sau o imagine de atentionare
daca la un URL lipseste adresa (partea de dinainte de ?), datele se vor transmite
paginii curente
in principiu, este bine sa se testeze un vector inainte de a se prelua o informatie din
el, deoarece in caz contrar, PHP-ul poate sa afiseze pe ecran un notice

$actiune=isset($_GET[actiune])?$_GET[actiune]:;
if($actiune==adauga)

HTML: tipuri de input

NOTA: fiecare browser afiseaza diferit tag-ul input. La unele browsere diversele tipuri
(type) de input mai noi pot lipsi si atunci se va afisa o simpla casuta de introdus text. In
principiu se poate conta pe tipurile: button, checkbox, file, hidden, image, password,
radio, reset, submit, text

38
11/22/2014

HTML: tipuri de input

HTML: tipuri de input

39
11/22/2014

HTML: tag-urile textarea si select


pe langa tag-ul input, mai exista tag-urile textarea si select, pentru introducerea
altor tipuri de date
select are doua variante, a doua varianta avand atributul multiple, pentru a permite
selectie multipla

HTML: exemplu de form


dorim sa avem un formular de introdus persoane, cu urmatoarele campuri:
nume numele complet
parola
sex in BD m coresunde pentru masculin si f corespunde pentru feminin
interese o lista din care pot fi selectate unul sau mai multe interese
judet in BD judetele sunt reprezentate prin codurile lor de doua litere mari
observatii un text oarecare, posibil mai lung

40
11/22/2014

HTML: exemplu de form


<form action="?action=aplicare" method="post">
<table>
<tr><td>Nume</td><td><input type="text" name="nume"/></td></tr>
<tr><td>Parola</td><td><input type="password" name="parola"/></td></tr>
<tr><td>Sex</td><td>
<input type="radio" name="sex" value="m" checked/> Masculin
<input type="radio" name="sex" value="f"/> Feminin </td></tr>
<tr><td>Interese</td><td>
<input type="checkbox" name="interese[]" value="sport" /> Sport
<input type="checkbox" name="interese[]" value="carti" /> Carti
<input type="checkbox" name="interese[]" value="filme" /> Filme </td></tr>
<tr><td>Judet</td><td>
<select name="judet><option value="AR">Arad</option>
<option value="TM" selected>Timisoara</option></select></td></tr>
<tr><td valign="top">Observatii</td><td>
<textarea name="observatii" rows="7" cols="20"></textarea></td></tr>
<tr><td colspan="2" align="center"><input type="submit" value="Aplica"/>
<input type="reset" value="Sterge" /></td></tr>
</table>
</form>

PHP: managementul sesiunii


datele de la utilizator (browser) sunt transmise catre server folosind protocolul HTTP (sau
HTTPS pentru comunicatii criptate). Deoarece protocolul HTTP este stateless (nu pastreaza
informatii de stare de la o comunicare la alta, analogul variabilelor dintr-un limbaj de programare),
PHP-ul pune la dispozitia programatorului un mecanism prin care se pot pastra aceste informatii
de stare, pastrandu-se astfel continuitatea logica a unei aplicatii pe parcursul mai multor apeluri
succesive
acest mecanism de pastrare a continuitatii logice se bazeaza pe conceptul de sesiune
(session). De obicei o sesiune dureaza atata timp cat un browser are deschisa o fereastra cu un
anumit site, inclusiv daca aceasta fereastra este inchisa si redeschisa. Setarile unei sesiuni
dureaza un interval de timp (de ordinul zecilor de minute/orelor) si daca sesiunea se cupleaza cu
alte mecanisme gen cookies, se poate prelungi la zile (in cazul site-urilor care ofera optiunea de
reamintire a diverselor date)
folosirea sesiunilor este foarte utila la urmatoarele genuri de actiuni, care toate implica
memorarea unor anumite informatii de-a lungul mai multor accesari:
pastrarea situatiei de logat/nelogat de obicei in sesiune se pastreaza id-ul utilizatorului
logat sau 0 daca nu este logat nimeni
pastrarea optiunilor de sortare se pastreaza coloana si sensul de sortare dorit pentru
diverse tabele de prezentare
pastrarea unui cos de produse (shopping cart) se pastreaza un vector asociativ cu id-ul
produsului si cantitatea
pastrarea unor filtre de cautare (gen interval de pret, judet/oras, etc) pentru ca tabelele de
prezentare sa prezinte doar informatii, conform filtrelor

41
11/22/2014

HTML: exemplu de form


<?php
session_start();
if(isset($_POST['nr']))$_SESSION['nr']=$_POST['nr'];
if(isset($_SESSION['nr']))$nr=$_SESSION['nr'];else $nr=0;
?>
<html><head></head>
<body>
<h1 align=center><?php echo $nr ?></h1>
<hr/>
<a href='?action=a1'/>Actiune 1</a> | <a href='?action=a2'/> Actiune 2</a>
<hr/>
<form action="?" method="post">
Numar nou: <input type="text" name="nr"/> <input type="submit" value="Schimba"/>
</form>
</body>
</html>

HTML: exemplu de form


session_start() porneste managementul sesiunii. Dupa acest apel devine disponibil
vectorul $_SESSION in care sunt pastrate toate variabilele de sesiune.
$_SESSION este un vector asociativ (la fel ca si $_GET si $_POST) si asociaza
unui nume de variabila valoarea ei. Orice nume din $_SESSION defineste o variabila
de sesiune
o variabila de sesiune isi pastreaza neschimbata valoarea de-a lungul mai multor
apeluri succesive si in oricare pagina din site. In acest fel, ea este analoaga unei
variabile globale din limbaje de programare gen C/C++.
$_SESSION este autoglobal, deci nu trebuie declarat global in interiorul functiilor
pentru a putea fi accesat. Totodata, in el se pot stoca orice tipuri de valori (vectori,
obiecte, ), nu doar tipuri simple gen numere au siruri de caractere
ATENTIE: daca se folosesc variabile de sesiune pentru definirea unor stari in care
se poate afla site-ul (gen campul si sensul de sortare), trebuie tinut cont de urmatorul
aspect: varabilele de sesiune nu se transmit de la browser prin parametrii atasati unui
link (GET) si atunci daca vom copia (copy/paste) un link din site pentru a-l deschide
ulterior sau a-l trimite altcuiva, in acest link nu vor fi prezente setarile care erau
stocate in variabilele de sesiune. In aceasta situatie, cand se va deschide link-ul
respectiv, pagina se va vedea ca si cum nu ar fi fost nicio setare facuta. Din acest
motiv se prefera ca setarile vizuale sa fie in acelasi timp adaugate la toate link-urile
din site (ca parametri GET), pentru a fi prezente in link-urile copiate de utilizatori

42
11/22/2014

PHP: securitate
ATENTIE: la proiectarea unui site, trebuie avut in vedere ca ORICE DATE PRIMITE DE LA
UTILIZATORI POT FI INCERCARI DE SPARGERE A SITE-ULUI.
daca un hacker reuseste sa aiba acces nepermis la un site sau server, trebuie avut in vedere
ca multe actiuni ii devin posibile: accesul la intreaga baza de date (deci nume de utilizatori, e-
mailuri, parole, carti de credit, ), posibilitatea de a folosi server-ul pentru a trimite spam sau
pentru a stoca fisiere descarcabile de pe internet, folosirea serverului ca proxy pentru a-si masca
propria locatie, etc. Chiar daca site-ul nostru poate sa nu fie de mare interes, trebuie tinut cont
de faptul ca utilizatorii in general isi folosesc aceeasi parola peste tot si atunci, daca parola lor
este stocata in clar in baza de date, un hacker care a spart site-ul si colecteaza parolele, le va
putea folosi la alte site-uri mult mai importante pentru utilizatorul respectiv (paypal, ebay, yahoo,
facebook, gmail, )
toate datele primite trebuie verificate si evaluate posibilitatile de a produce pagube la folosirea
lor
toate datele prezentate utilizatorului (facute publice), trebuie evaluate pentru a nu fi de ajutor
daca le vede un posibil hacker, daca acesta doreste folosirea lor in alte scopuri decat cele
intentionate. In acelasi timp, datele personale ale utilizatorilor (adresa, nr. tel.) trebuie facute
publice doar cu prevenirea sau acordul expres al acelui utilizator, fiindca pot fi folosite in scopuri
rele. E-mail-ul cel mai bine se va afisa sub forma de imagine, pentru a nu da posiblitatea
agentilor automati care cauta e-mail-uri pe internet sa-l gaseasca si sa-l foloseasca pentru a
trimite spam.
formularele de autentificare trebuie prevazute cu un contor de incercari, pentru a elimina
posibilitatea incercarilor automate, in serie, pentru spargerea parolelor

PHP: securitate
daca se da posibiltatea sa se faca upload de fisiere (imagini, etc), toate fisierele
trebuiesc verificate sa corespunda intr-adevar doar tipurilor permise (imagini, pdf, )
pentru a nu se permite upload-ul unor fisiere script sau executabile pe server, care
apoi vor putea fi folosite ca backdoor-uri. posibilitatea incercarilor automate, in serie,
pentru spargerea parolelor
la fisierele trimise deja, trebuie eliminata posibilitatea de a le modifica extensia dintr-
una inofensiva intr-una care sa le permita executia pe server
in general la fisiere si orice alte date de volum mare trebuie efectuate verificari de
spatiu, in asa fel incat un utilizator sa nu poata folosi mai mult spatiu decat ii este
permis.
la fisiere trebuie avut in vedere ca un fisier nou sa nu aiba acelasi nume ca alt fisier
vechi, pentru a nu-l sterge pe cel vechi, care poate apartine altui utilizator. In acest
sens, cel mai bine este sa se redenumeasca fisierele folosind identificatori unici.
cand se stocheaza date de la utilizator in baza de date, trebuie avut in vedere ca
datele trimise pot contine caractere speciale (ghilimele, apostroafe, semnul mai mic,
and, ), care daca nu sunt tratate corespunzator, pot fi afisate gresit sau chiar sa
compromita securitatea site-ului. De exemplu, semnul mai mic (<), daca este afisat in
mod direct poate fi interpretat ca inceput de tag si atunci sa compromita toata
structura HTML-ului de dupa el. Din acest motiv toate caracterele care au o
interpretare speciala in HTML trebuie codate in mod special (folosind htmlentities())

43
11/22/2014

PHP: securitate-SQL injection


un hacker poate incerca sa trimita la server cod SQL, folosind chiar campurile
formelor de introducere de date:
Exemple de SQL injection:

; delete * from users; --


; delete * from users; --

daca un hacker introduce unul dintre textele de mai sus in loc de un text obisnuit care
in interogarea SQL este pus intre ghilimele () sau inter apostroafe (), rezultatul va fi
urmatorul: ghilimeaua sau apostroful de inceput va inchide caracterele pentru campul
curent, punct-virgula (;) va termina query-ul curent si se va executa urmatorul query
(delete * from users), care va sterge toate conturile utilizator. Cele doua minusuri (--)
de final au rolul de a considera tot ce ar fi urmat in query-ul initial drept comentariu:
select id from users where name= and password=
devine
select id from users where name=;delete * from users; -- and password=
pentru a se elimina acest gen de atac trebuie ca toate datele care se introduc in baza
de date sa aiba caracterele speciale pentru SQL modificate in asa fel incat sa isi piarda
caracterul lor special, analog secventelor ESCAPE din C. In PHP se poate folosi
pentru aceasta functiile PDO::query sau PDO::prepare

PHP: interactiunea cu baza de date

$bd=new PDO("mysql:host=localhost;dbname=e1,'user1','1');
$stm=$bd->prepare(select id from users where user=? and password=?);
$bd->execute(array($_POST[user], $_POST[password]));

in exemplul de mai sus se primesc de la utilizator prin protocolul POST doua


variabile (user, password) si se testeaza daca exista un utilizator care are user-ul si
parola specificate. Comanda prepare foloseste in loc de variabilele primite de la
utilizator semnul intrebarii (?) pe post de placeholder. Acesta va fi inlocuit ulterior de
catre comanda execute cu parametrii doriti (analog afisarii variabilelor in C folosind
printf), avand in mod automat caracterele SQL semnificative prelucrate incat sa isi
piarda semnificatia speciala.
exemplul cu sir pentru SQL injection va deveni:

select id from users where name=\;delete * from users; -- and password=

se poate constata ca in fata primei ghilimele din sirul user s-a pus un (\). Acesta
face ca aceasta ghilimea sa isi piarda semnificatia de terminator de sir si sa devina
un simplu caracter din cadrul sirului (la fel ca folosirea \ in C in printf)
OBSERVATIE: ? folosit in prepare nu se pune intre ghilimele sau intre apostroafe

44
11/22/2014

Va multumesc!

45

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