Volumul de față se adresează studenților și cuprinde atât cursul cât și lucrările de laborator pentru disciplina cu același nume. Cartea este… [610965]

SISTEME INFORMATICE
DE
ASISTARE A DECIZIEI

note de curs și aplicații

2017

Cuvânt înainte,

Volumul de față se adresează studenților și cuprinde atât cursul cât
și lucrările de laborator pentru disciplina cu același nume.

Cartea este structurată pe două părți, prima, de noțiuni teoretice,
conține 6 capitole care încearcă să acopere, cât mai succint, o parte din
întinsul domeniul al t ehnologiilor utilizate pentru a crea, întreține,
administra, securiza și, nu în ultimul rând, a utiliza Internetul. Partea a
doua conține 12 lucrări de laborator în care studenții vor experimenta mare
parte din ceea ce este prezentat în curs.

Primul c apitol, "Conceptele Internetului" face o descriere succintă
a noțiunii de internet, cu descrierea modelului de referință OSI care stă la
baza dezvoltării rețelelor de calculatoare, implicit a internetului. Apoi
continuă cu clasificarea tehnologiilor Intern et: hardware, software de
comunicații și Dataware.
Al doilea capitol, intitulat "Servicii Internet sub FreeBSD" prezintă
ore scurt istoria și dezvoltarea sistemului FreeBSD, care este un sistem de
operare open source, bazat de UNIX, și la ora actuală, con siderat ca fiind
cel mai sigur, stabil și rapid. Tot aici se prezintă și configurarea unui server
multifuncțional: mail, ftp, web și baze de date.

Capitolul al treilea tratează tehnologiile Internet din punctul de
vedere al sistemului de operare Windows , prezentând procedurile și modul
de configurare a acestuia ca server cu aceleași roluri ca și cel sub FreeBSD.

Capitolul patru, denumit generic "Protocoale și servicii" face o
prezentare și descriere succintă a principalelor protocoale utilizate în
Internet, și anume: DNS, SSH, telnet, http. FTP, SMTP, POP, SSL și TLS.

Capitolul cinic, cel mai mare, intitulat Limbaje de programare și
tehnologii WEB" prezintă principalele limbaje de programare utilizate în
prezent pentru realizarea paginilor Web, cu o prezentare mai detaliată a
următoarelor limbaje: html, css, AMP = Apache + MySQL + PHP,
javascript.
i

Ultimul capitol, al șaselea, "Crearea paginilor Web cu Dreamweaver" face
o scurtă introducere în unul dintre cele mai utilizate programe de proiecta re a
paginilor Web, și anume Adobe Dreamweaver.

A doua parte a volumului conține 12 lucrări practice de laborator
în care se vor experimenta și verifica noțiunile și instrucțiunile predate în
cadrul cursului. Laboratoarele au un caracter evolutiv și rep etitiv, studenții
fiind nevoiți să repete la următoarea lucrare comenzile învățate în lucrările
anterioare.
Aceste lucrări au titluri sugestive, și anume:
Lucrarea 1 – Instalarea și configurarea serverului Apache, MySQL și
PHP pe sistemul de operare Fr eeBSD;
Lucrarea 2 – instalarea și configurarea serverului Apache, MySQL și
PHP pe sistemul de operare Windows;
Lucrarea 3 – Primii pași în HTML, elemente constructive;
Lucrarea 4 – Principalele structuri în HTML: legături, liste și tabele;
Lucrarea 5 – Primii pași în PHP – sintaxa, variabile și tipuri de date, cod
php în script html;
Lucrarea 6 – Construirea unui site dinamic în php;
Lucrarea 7 – Stiluri CSS și Chestionar în PHP;
Lucrarea 8 – Formular de prelucrare a datelor din baza de date MySQL;
Lucrarea 9 – Sistem de înregistrare, autentificare și protecție la accesarea
unei baze de date MySQL;
Lucrarea 10 – Realizarea unui formular de contact;
Lucrarea 11 – Sistem de căutare în baza de date MySQL;
Lucrarea 12 – Sistem de blocare acces al unu i utilizator asupra unui site, sistem
de contorizare click -uri pe un link.

Sisteme Informatice de Asistare a Deciziei
4
1. Conceptele Internetului

Tehnologiile Internet sunt asociate în cultura managerială cu posibilitatea de a
obține, prelucra și transmite informație (în special de afac eri, economică, marketing) rapid
și eficient.
Tehnologia Informației cuprinde clasa tehnologiilor utilizate pentru procesarea
informației. Informația este un termen vast. Dacă pentru public informația reprezintă
noutățile zilei, utilizat în contextul teh nologiei informației și al firmei informația
desemnează ansamblul cunoștințelor, al datelor și al comunicațiilor firmei (Apostol et al.,
2003). Deși tehnologiile de procesare a informației pot fi utilizate in sisteme izolate,
practic valoarea de utilizare a sistemelor izolate pentru firma contemporană tinde să
devină nulă fără utilizarea sistemelor de comunicație.
În proces de inovare continuă, tehnologiile de comunicație sunt disponibile pe
piață sub formă de brevete, licențe, produse sau servicii. Cu exc epția firmelor care au un
rol direct în dezvoltarea de tehnologii specifice de comunicație, firmele sunt în ipostaza
de consumator al acestor tehnologii și servicii de comunicații. Firmele furnizoare de
servicii cu valoare adăugată în comunicații sunt o cl asă aparte de consumatori și furnizori
de tehnologie, deoarece pe baza noilor tehnologii de comunicații și de prelucrare produc
și furnizează produse sau servicii noi sau particularizate.
Internet desemnează rețeaua mondială de rețele de calculatoare int erconectate în
scopul schimbului continuu de date. Tehnologiile Internet desemnează clasa TIC utilizată
în rețelele de calculatoare sau pentru comunicația cu calculatoarele. Astfel, Tehnologiile
Internet definesc multitudinea tehnologiilor de comunicare și de procesare a informației
prin care rețeaua Internet capătă valoare de utilizare pentru firmă.
Termenul internet (i non capital) desemnează rețelele individuale de calculatoare
care sunt interconectate, nu sunt parte din rețeaua Internet dar folosesc te hnologii de
comunicare compatibile Internet (Huston,1999).
În ianuarie 2006, rețeaua Internet deservea peste 395 milioane computere. Această
dimensiune nu cuprinde milioanele de dispozitive și calculatoare conectate prin rețelele
de telefonie mobilă sau r ețele private. (http://www.isc.org/index.pl?/ops/ds/hostcount –
history.php, 2006)
1.1. Modelul de referință OSI
Multitudinea sistemelor interconectate Internet, de la telefoane mobile, dispozitive
automate de achiziție de date până la noduri de prelucrare bazate pe ferme de servere pot
comunica în această rețea mondială de date respectând standardele de comunicație.
Modelul de referință Open Systems Interconnection – International Standard
Organization (ISO -OSI) este o descriere standard sau un model de r eferință al modului
cum mesajele sunt transmise între două puncte ale unei rețele de telecomunicații. Scopul
modelului ISO -OSI este acela de ghid de implementare de produse. În consecință
produsele compatibile
ISO-OSI funcționează și -sau utilizează alte produse de acest tip, constituind o bază
de plecare pentru interconectarea calculatoarelor, rețelelor și a aplicațiilor în rețelele de
calculatoare.

5 Modelul ISO -OSI (figura 1.1) poate fi utilizat pentru catalogarea produselor și
tehnologiilor, astfel înc ât fiecare produs poate fi înglobat în sisteme complexe fiind folosit
ca un bloc funcțional.

Fig. 1.1: Modelul conceptual ISO -OSI.

ISO-OSI definește șapte niveluri pentru o sesiune Internet astfel:
1. Fizic. Nivelul la care sunt realizate fizic conexi unile. Debutul rețelelor de
comunicație este reprezentate de rețelele de telefonie, publice sau private, bazate pe fire
metalice (cupru sau fier). Ulterior, aceste rețele de comunicație proiectate pentru
transportul semnalelor vocale analogice, au evoluat în rețele pentru transportul semnalelor
digitale: Integrated Services Digital Network (ISDN), Asynchronous Digital Line
Subscriber (ADSL). Rețelele moderne sunt proiectate pe baza tehnologiilor digitale de
comunicație care utilizează fibre optice (FDDI) sa u semnale radio pentru realizarea
rețelelor fără fir: Wireless Local Area Networks (WLAN), Wireless Interoperability for
Microwave Access (WiMax)
2. Date ( Data link) . Nivelul la care sistemul de comunicație stabilește o
legătură între două puncte ale unei r ețele fizice. Legătura de date presupune un protocol
de comunicație și sincronizare. Figura enumără protocoalele cunoscute, fără însă a epuiza
lista protocoalelor folosite: Serial Line Internet Protocol (SLIP), Point to Point Protocol
(PPP), Ethernet sunt câteva exemple.
3. Interconexiune ( Network ): Nivel de realizare și gestiune al rețelei de
calculatoare. Bazat pe nivelul de date, nivelul conexiune determină funcționalitatea rețelei
de calculatoare pe baza protocolului de rețea. În cazul rețelei Internet se utilizează
protocolul IP v4 bazat pe adrese de 32 biți a nodurilor de rețea. Rețeaua Internet
contemporană se confruntă cu limita fizică a adreselor, dezvoltarea viitoare fiind limitată
de lipsa adreselor disponibile. Acesta fiind unul din motivele implem entării protocolului
IPV6 ce oferă oportunitatea dezvoltării viitoare. Nivelul Network gestionează datagrame.

Sisteme Informatice de Asistare a Deciziei
6 4. Transport. Definit de protocoalele Internet Transmission Control Protocol
(TCP) și User Datagram Protocol (UDP). Spre deosebire de TCP, UDP asig ură un nivel
mai redus de control al erorilor fiind protocolul preferat pentru transmiterea mesajelor de
tip broadcast.
5. Sesiune ( Session ). Nivelul sesiune bazat pe nivelul transport asigură
funcționalitatea necesară sesiunilor de comunicație. Figura exemp lifică porturile 110/25
pentru a oferi funcționalitatea de poștă electronică prin protocoale corespunzătoare
POP/SMTP, sau portul 80 pentru protocolul http web.
6. Prezentare ( Presentation ). Simple Mail Transfer Protocol (SMTP) sau
HyperText Markup Protocol (HTTP) sunt exemple de implementare la nivelul OSI
Presentation. Acest nivel prin protocoalele implementate asigură un nivel de comunicație
independent de adresa fizică, acest detaliu este rezolvat la nivelele OSI inferioare. Astfel
utilizatorii rețelei In ternet (de exemplu utilizatorii de poștă electronică) se pot concentra
asupra mesajului și a destinației reprezentată de un nume și nu de o adresă IP.
7. Aplicație ( Application ). Nivelul cel mai înalt al modelului OSIdefinește
nivelul la care aplicațiile de comunicație interacționează cu nivelul Presentation.
Exemplul cel mai cunoscut îl poate constitui aplicația pentru poștă electronică. Acesta
asigură funcționalitatea necesară utilizării umane și exploatează nivelurile OSI inferioare
pentru a asigura gesti unea mesajelor, adreselor și a erorilor.
Modelul TCP -IP (Transmission Control Protocol/Internet Protocol Model ) este o
suită standard de protocoale și un model conceptual cunoscut și sub numele DARPA.
Corespondența nivelurilor celor două modele este prez entată în figura 1.2.

Fig.1.2: Corespondența nivelurilor TCP -IP și ISO OSI.

Suita de protocoale TCP -IP definește serviciile pentru aplicații Telnet, FTP (File
Transfer Protocol), http (Hypertext Transfer Protocol), DNS (Domain Name System),
RIP (Rou ting Interface Protocol), SMTP (Simple Mail Transfer Protocol), POP (Postal
Office Protocol), ECHO și multe altele (Figura 1.3). Aceste servicii și aplicații sunt
implementate în sistemele de operare și prin urmare disponibile ca resurse software și de
comunicație încă de la punerea în funcțiune a resurselor de calcul. Împreună cu celelalte
tehnologii ITC ele formează resursele bază de plecare pentru definirea aplicațiilor de
afaceri.

Cap 1: Conceptele Internetului
7
Fig.1.3: Suita de protocoale TCP -IP

Figura 1.4 ilustrează un model de programare al aplicațiilor pentru afaceri care
utilizează resursele Internet în comparație cu modelul ISO OSI. Modelul de programare
ilustrat în figura 1.4 în comparație cu modelul TCP și ISO OSI reprezintă punctul de
vedere al dezvoltării de aplicații din componente și servicii. Pe baza principiului utilizat
în modelul OSI prin care o componentă de pe un nivel superior ascunde complexitatea și
tehnologiile nivelului inferior, similar în modelul de programare comunicația Internet este
expusă aplicațiilo r de către sistemul de operare.
Programatorii de aplicații economice și de afaceri nu se confruntă cu necesitatea
rescrierii componentelor de pe nivelurile inferioare OSI.

Fig. 1.4: Redefinirea modelului OSI pentru aplicații de afaceri

Figura 1.5 ilustrează comparativ cu modelul ISO OSI evoluția modelelor utilizate
pentru dezvoltarea aplicațiilor economice și de afaceri utilizând mediul Internet. Aceste
modele încearcă să rezolve problema administrării complexității aplicațiilor, respectiv a
multit udinii de componente prin clasificarea componentelor și administrarea lor
specifică. În funcție de caracteristicile tehnice specifice aplicației de afaceri finale,

Sisteme Informatice de Asistare a Deciziei
8 accentul se poate pune pe calitatea componentelor de gestiune a documentelor semnate
digital , sau pe securitatea legăturilor multimedia etc.

Fig. 1.5: Redefinirea modelului OSI pentru aplicații de afaceri

1.2. Clasificarea Tehnologiilor Internet
Tehnologiile Internet pot fi clasificate în:
• Tehnologii hardware
• Tehnologii de comunicații
• Tehnologii software
• Tehnologii dataware
1.2.1. Tehnologii Internet Hardware
Clasa tehnologiilor hardware cuprinde acele tehnologii care conduc la realizarea
unor componente sau dispozitive fizice. Microprocesoarele, computerele pe un cip,
tehnologia ide ntific ării radio RFId (Radio Frequency Identity), smart card, cititoare
optice de coduri și multe alte componente electronice, optice sau electromecanice dar și
cu tehnologii foarte noi, cum este biotehnologia, sunt exemple cuprinse în această clasă.
În decada următoare în nodurile Internet vor fi prezente din ce în ce mai multe
dispozitive ( Internet appliances ) și nu sisteme tradiționale de tip computer personal (PC)
sau server. Estimările ajung la peste 80% din nodurile rețelei care vor fi echipate cu astfel
de echipamente. Această realitate este posibilă datorită avansului fără precedent al
tehnologiilor hardware în special în domeniul microprocesoarelor, memoriilor și
soluțiilor de stocare.
Astfel, piața produselor electronice oferă nu numai microcalculato are pe un chip,
dar și soluții integrate ce conțin procesoare pentru protocoalele Internet precum și aplicații
și servicii web implementate hardware. (www.cssinfo.com, 2006)
Resursele hardware pot constitui baza realizării unor centre de prelucrare cu un
singur server sau pot fi asociate în noduri de prelucrare a informației bazate pe resurse
distribuite. Sistemele de procesare a datelor bazate pe resurse distribuite au la baza
arhitecturii componente hardware standard. Sistemele redundante de tip Redundan t Array
of Inexpensive Disks (RAID), formate din două sau mai multe discuri organizate în
matrice de discuri, cu scopul realizării unui volum de date tolerant la defecte, este un
exemplu de tehnologie hardware ce utilizează componente standard. Acest princ ipiu al

Cap 1: Conceptele Internetului
9 utilizării componentelor standard cu scopul realizării unor sisteme cu funcționalitate
tolerantă la defecte este utilizat în sistemele de servere de tip cluster.
1.2.2. Tehnologii Internet de comunicații
Clasa tehnologiilor de comunicații cuprind e acele tehnologii prin care este
asigurată comunicația Internet. Tehnologiile de comunicație sunt dezvoltate prin
utilizarea echipamentelor hardware și componente software specializate. Piața
telecomunicațiilor este reglementată prin legi și alte acte leg ale emise de autoritățile
publice. În România, autoritatea publică responsabilă pentru domeniul comunicațiilor
este Autoritatea Națională pentru
Reglementare în Comunicații – ANRC (ANRC, 2006). Domeniile supuse
reglementărilor legale sunt resursele consi derate naționale cum sunt frecvențele radio,
plaja de numerotație pentru telefonia publică, proprietatea domeniilor Internet,
transportul datelor și al documentelor digitale, semnăturile digitale, serviciile electronice
publice etc.
Tehnologiile de comuni cație disponibile firmei sunt livrate de către operatorii de
telecomunicații autorizați. Datorită complexității domeniului comunicațiilor și/sau
interacțiunii cu specificațiile legii, conectarea și gestiunea resurselor Internet externe sunt
de regulă contr actate cu unul sau mai mulți operatori de telecomunicații.
Caracteristicile canalelor de comunicație determină clasificarea comunicațiilor în:
• Comunicație pe fir (cablu) o Operatori de telefonie fixă (rețea în topologie stea)
• Servicii de telefonie și tr ansmisiuni de date (viteza maximă 56Kbps) prin rețea
analogică comutată pe două fire de tip dial -up – Public Switched Telephone
Network (PSTN)
• Servicii de telefonie și transmisiuni de date prin rețele comutate de telefonie
digitală de tip ISDN. (64, 128, 2Mbps)
• Transmisiuni digitale prin linii fizice comutate sau închiriate tehnologie ADSL
(Viteze de până la 8Mbps) o operatori de cablu coaxial (rețea în topologie bus) •
128, 256 Kbps, de regulă operatori de cablu TV.
• Comunicație prin fibră optică
• Comun icație radio o WiFi – WiMax 1 – 100Mbps pe frecvențe libere 2,4 GHz,
5.4GHz o Prin frecvențe radio operate de operatori de telecomunicații licențiați
(Radio Comunicații SA, Orange, Vodafone) o Transmisiuni de date
prin echipamente fixe prin canal radio ded icat. o Transmisiuni de date
mobile prin canale GPRS de telefonie mobilă.
o Transmisiuni de date prin canale dedicate (închiriate) folosind rețeaua de
telefonie mobilă.
o Comunicații prin satelit o Transmisiuni de date pe canale dedicate
(închiriate) în loca ții fixe o Transmisiuni de date mobile.

Necesitatea conectării firmei la internet este manifestată prin alegerea a cel puțin
unui operator de telecomunicații. Operatorul va instala la sediul firmei canalul de
comunicație contractat, eventual echipamente le și serviciile software necesare firmei
pentru comunicația Internet.

Sisteme Informatice de Asistare a Deciziei
10 Un rol foarte important în portofoliul soluțiilor de comunicare disponibile
firmelor contemporane sunt soluțiile de comunicare bazate pe telefonia mobilă. Serviciile
oferite de opera torii de telecomunicații mobile sunt foarte variate și includ soluții de
cofinanțare a investiției inițiale. Terminalele rețelelor de telefonie mobilă sunt capabile
să transmită și să prelucreze sunete, imagini, filme, aplicații la cerere cum sunt cititoar e
detectoare de coduri de bare, soluții de identificare bazate pe tehnologia RFId, să asocieze
datelor coordonatele geografice calculate pe baza tehnologiilor GPS (Global Positioning
System) și să folosească sisteme de transmisiuni securizate bazate pe sem nături digitale.
Pe măsură ce rețeaua Internet a evoluat, au apărut și s -au dezvoltat servicii
fundamentale. La rândul lor, serviciile au influențat gradul de folosire și de extindere a
Internet -ului. Dintre acestea, cele care au avut un impact deosebit sunt (Roșca et al.,
2004):
• Servicii de bază:
o Nume în adresă IP: Domain Name System (DNS)
o Poștă electronică: Protocolul pentru transport poștal Simple Mail
Transport Protocol (SMTP) și protocolul pentru oficiul poștal Post
Office Protocol (POP) o Web:
World Wide Web (WWW)
o Transfer fișiere: File Transfer Protocol (FTP) o Servicii de știri: News
Transport Protocol (NNTP) o Voce: Voice over IP (VoIP)
• Servicii avansate o Servicii de stocare în siguranță bazate pe serviciul web
(WebDAV) o Protocoale securiz ate: Secure IP (IPSec), Virtual
o Private Network (VPN) o Semnături digitale, Certificate digitale
o Servicii pentru echilibrarea încărcării rețelei: Network load balancing
(NLB) o Servicii pentru autentificare de la distanță: Remote
Authentication Dial In User Service (RADIUS)
• Servicii de integrare în rețeaua Internet a altor tipuri de rețele de telecomunicații:
o Serviciul Web integrat cu sistemul de mesaje scurte SMS al rețelelor de
telefonie mobilă GSM. o Integrarea serviciului SMS al rețelelor de
telefo nie mobilă cu sistemul de poștă electronică SMTP și POP.
o Serviciul Wireless Access Protocol pentru integrarea navigatoarelor
telefoanelor mobile cu serviciile web
• Servicii speciale o Integrarea aplicațiilor bazate pe sisteme distribuite și eterogene
prin apelul procedurilor la distanță prin protocolul web și XML: Extensible
Markup Language Web services o Servicii pentru interogarea de la
distanță a colecțiilor de date: Reporting services
o Găzduire a aplicațiilor, bazelor de date sau a sistemelor de calc ul. (Hosting
Services) Tendința actuală este aceea de a folosi tehnologiile de
virtualizare care permit găzduirea mai multor sisteme de calcul virtuale
(sisteme de operare) într -un singur sistem fizic.
Lista serviciilor poate continua cu servicii complexe ce nu pot fi cuprinse într -o
anume categorie, dar se bazează pe principiul conectivității
Internet, pe schimbul de documente digitale convenit prin contractul între părți și
pe o anumită modalitate de securizare și decontare.

Cap 1: Conceptele Internetului
11 Modelul de afaceri pe baz a căruia firma utilizează canalele de telecomunicații prin
care menține conexiunea cu rețeaua Internet poate fi de tip:
• Decontare bazată pe timpul exploatării. Model bazat pe capacitate de date limitată
a canalului, canal pe care firma nu îl utilizează pe rmanent. Acest tip de decontare
este ce mai adesea utilizat în cazul conexiunilor prin linii telefonice comutate sau
prin rețelele de telefonie mobilă (Dial -up). Bugetul asociat acestui model de
exploatare este variabil.
• Canal cu bandă partajată, buget fi x. Model de decontare în care nu este garantată
calitatea serviciului, dar valoarea este limitată la o valoare fixă. Caracteristicile
tehnice ale acestui tip de contract sunt utile unei prezențe Internet permanente de
performanță redusă.
• Canal de comunica ție cu bandă garantată și buget fix. Acest tip de contract poate
cuprinde și garanția calității serviciului. Cunoscut și sub numele de contract
utilizator de bandă largă (broadband) devine contractul standard pentru exploatare
în mediul de afaceri. Pe baza bugetului fix și al garanției serviciului firma poate
defini o prezență internet continuă și supusă unor norme de calitate, design și
serviciu la nivelul așteptărilor partenerilor.
• Decontare bazată pe buget variabil cu o componentă fixă și una variabilă în relație
cu exploatarea bazată pe timp a unor resurse de comunicație partajate.

1.2.3. Tehnologii Internet Software
Clasa tehnologiilor software cuprinde acele tehnologii preponderent software
prin care firma asigură serviciile necesare exploatării r esurselor interne și externe.
Aplicații software, servicii software, componente software, programe sunt câteva din
denumirile utilizate pentru a desemna implementarea tehnologiilor software.
Tehnologiile software sunt asociate cu dreptul de autor și licenț a de exploatare.
Autoritățile publice au reglementat exploatarea drepturilor de autor și piața licențelor
software în încercarea de a limita evaziunea fiscală și distribuția ilegală a programelor. În
România, Oficiul pentru Drepturile de Autor – ORDA este mandatat prin lege în a impune
și monitoriza domeniul drepturilor de autor și al pieței tehnologiilor software. Firma
poate utiliza tehnologiile software pe baza unor modele de afaceri:
• Achiziție . Utilizarea de tehnologii pe baza licențelor de utilizare. Prezente pe piață
sub numele mărcilor comerciale ca pachete de programe, licența dă dreptul
utilizării neexclusive a produselor software cuprinse în pachet după un model de
licențiere autorizat conform legii. Exemplele sugestive pentru acest model sunt
pachetele de programe produse de corporații cu notorietate internațională cum
sunt Microsoft, Oracle, IBM, SAP etc. Suita de programe cuprinse în licența
produsului Microsoft SQL Server 2005 permite utilizarea tehnologiei SQL pe un
server licențiat în modul per procesor sau per client și licențe pentru clienții
serviciului. Licențele pot fi achiziționate pe durată nedeterminată sau prin
abonament limitat în timp.
• Dezvoltare . Prin dezvoltare proprie. Pe baza forței de muncă specializate, și a
altor contracte cu parteneri de afaceri, firma devine proprietarul unei soluții
software pe care este obligată de lege să o înregistreze la ORDA și eventual la
OSIM. Managementul firmei este constrâns să se asigure că mediile de dezvoltare

Sisteme Informatice de Asistare a Deciziei
12 al tehnologiilor și contractele cu furnizorii sunt de natură să genereze o proprietate
fără litigii. Costurile acestui model sunt mari și solicită resurse importante.
Sistemul organizatoric este deosebit de important. Cele mai bune practici în
domeniu impun utilizarea rolului de manager de proiect ( project manager ).
• Asamblare. Tehnologii disponibile Internet prin servicii software, decontate după
modul de utilizare integrate cu produsele proprii și cu produsele disponibile pe
baza licențelor achiziționate. Tehnologii software disponibile firmei ca servicii
sunt de regulă exclusiv prin Internet, respectiv nu dau posibilitatea instalării lor
pe resursele interne ale firmei. Firma are ca opțiune integrarea acestor servicii în
portofoliul propriu de servicii sau pentru exploatare internă. Ser viciul de căutare
Google poate reprezenta un exemplu pentru acest model de lucru. Firma nu poate
dispune de resursele hardware, de comunicații implicate în constituirea unei baze
de căutare de nivelul celui întreținut de compania Google. Firma utilizează
serviciul de căutare pus la dispoziție prin Internet și întreținut de Google.
Exemplul Google poate să nu fie semnificativ deoarece este un serviciu public
gratuit, dar devine semnificativ în cazul în care firma dorește un serviciu
specializat, de exemplu r ezultatele căutărilor să nu conțină reclame. Serviciul
specializat va fi livrat pe baza unui contract prin care firma achită valoarea
serviciului Google. Exemplu poate fi extins și pentru alte servicii software livrate
pe baza unui asemenea model.
• Configu rare. Soluții de uz general, configurate de specialiștii IT ai firmei pentru
a surprinde specificul activității. Situația în care tehnologiile sunt achiziționate
astfel încât să fie numai configurate se potrivesc cel mai bine soluțiilor de tipul
videoconfe rință (protocol SIP sau H323), în care specialiștii configurează local
produsele pentru a beneficia de infrastructura pusă la dispoziție de furnizorul
soluției.
• Utilizare. Soluții de uz general, disponibile prin Internet și configurate de la
distanță acc esibile permanent firmei printr -un model de afaceri bazat pe plata
serviciului prin abonament.
1.2.4. Tehnologii Internet Dataware
Clasa tehnologiilor dataware cuprinde acele tehnologii hardware, software și
comunicații precum și tehnici specializate pe ntru stocarea, întreținerea și exploatarea
volumelor mari de date denumite data warehouse .
Data warehouse manipulează datele care reprezintă istoria tranzacțiilor
economice ale firmei folosite pentru analiza și suportul deciziei de afaceri începând cu
planificarea strategică până la evaluarea performanței. Datele din Data Warehouse sunt
organizate optim pentru suportul analizei și nu pentru suportul tranzacțiilor în timp real.
Tehnologiile dataware fac posibilă analiza în timp real, furnizând răspunsuri
rapide la interogări analitice complexe și iterative. Modelul multidimensional de date
online analytical processing (OLAP) și tehnicile de agregare organizează și totalizează
volume mari de date așa încât pot fi evaluate rapid folosind analiza online și ins trumente
software grafice.

13 2. Servicii Internet sub Free BSD
FreeBSD este un sistem de operare liber Unix -like descendent din AT&T UNIX®
prin ramura Berkeley Software Distribution (BSD ), mai exact provine din sistemele de
operare 386BSD și 4.4BSD. Rulează pe calculatoare cu procesoare compatibile cu familia
Intel x86, dar și pe procesoare DEC Alpha, UltraSPARC® (al firmei Sun Microsystems),
Itanium (IA -64), AMD64, PowerPC, PC -98, ARM și MIPS.
FreeBSD este un sistem de operare complet, de zvoltat unitar. Nucleul, driverele
pentru dispozitive și utilitarele din spațiul utilizatorului, cum ar fi interpretorul de
comenzi sau shell -ul, sunt ținute în același arbore de urmărire a revizuirilor codului sursă
(CVS). Această metodă de dezvoltare vin e în contrast cu cea folosită pentru Linux (un
sistem de operare similar, dar mai bine cunoscut), unde nucleul este dezvoltat de o echipă
de dezvolt atori, utilitarele din spațiul utilizator și aplicațiile sunt dezvoltate de alte echipe
(cum ar fi proiectul GNU) , iar apoi toate acestea sunt împachetate împreună și publicate
de alte echipe sub formă de distribu ții Linux .
Ca sistem de operare, FreeBSD este privit în general ca fiind foarte fiabil și robust,
iar dintre sistemel e de operare ce raportează la distanță timpul de funcționare de la ultima
inițializare a sistemului (uptime) [1], FreeBSD este cea mai populară
alegere dintre sistemele de operare libere afișate în lista Netcraft a
primelor 50 de servere web cu cel mai lun g uptime [2] (uptime în unele
versiuni de GNU/Linux nu poate fi calculat). Un uptime lung indică de
asemenea faptul că nu au fost necesare actualizări ale nucleului
sistemului de operare, pentru că instalarea unui nou nucleu implică
reinițializarea sistemului și rescrierea de la
zero a contorului sistemului. Fig. 1: Mascota proiectului
2.1. Istoria și dezvoltarea FreeBSD FreeBSD:
Dezvoltarea inițială a sistemului FreeBSD a început în 1 993, pornind de la sursele
386BSD. Totuși, din cauza îngrijorărilor privind legalitatea tuturor surselor folosite în
386BSD și a unui proces între Novell (pe atunci proprietarul drepturilor pentru UNIX) și
Berkeley, FreeBSD a sfârșit prin reproiectarea une i mari părți a sistemului pentru
versiunea FreeBSD 2.0 (ianuarie 1995), folosind versiunea 4.4BDSLite de la
Universitatea din California, Berkeley. Manualul FreeBSD (î n limba englez ă)1 cuprinde
mai multe date istorice despre geneza sistemului de operare FreeBSD.
Poate cel mai notabil câștig al versiunii FreeBSD 2.0 a fost restructurarea
sistem ului Mach Virtual Memory (memorie virtuală Mach) al CMU -ului original, care a
fost optimizat pentru performanță sub încărcări mari, precum și crearea sistemului de
porturi, care face ca descărcarea, construirea și instalarea de software din surse terțe foa rte
ușoară. FreeBSD echipează situri de mare succes cum ar fi: cdrom.com (un depozit imens
de software care a doborât multe recorduri din internet), Hotmail și Yahoo!.
FreeBSD 3.0 a adus mai multe schimbări: mutarea la formatul binar ELF, suport
inițial p entru sistemele SMP și de asemenea a adăugat suport pentru o nouă platformă pe
64 bit: Alpha. La vremea sa, ramura 3.X a fost sever criticată pentru că multe schimbări
nu erau evidente în beneficiul și afectarea performanței, dar a fost un pas necesar pent ru
dezvoltarea a ceea ce avea să fie ramura de mare succes 4.X.

1 http://www.freebsd.org/doc/en_US.ISO8859 -1/books/handbook/history.html

Sisteme Informatice de Asistare a Deciziei
14 Inițial, FreeBSD a folosit și pe post de logo mascota BSD Daemon, dar în anul
2005 a fost organizată o competiție pentru un logo propriu. Pe data de 8 octombrie, 2005,
competiția a luat sfârș it, iar proiectul propus de Anton K. Gural a fost ales să devină logo
FreeBSD. BSD Daemon, rămâne însă mascota proiectului FreeBSD (fig. 1).
2.1.1. FreeBSD 5 — schimbări și dezvoltare
Versiunea FreeBSD finală și ultima din ramura 5 -STABLE este 5.5, a fos t lansată
în mai 2006. Dezvoltatorii FreeBSD mențin (cel puțin) două ramuri de dezvoltări în
același timp. O ramură -STABLE de FreeBSD este creată pentru fiecare număr de versiune
majoră, pentru care sunt scoase versiuni odată la fiecare 4 –6 luni. Ulitma versiune de
FreeBSD 4 -STABLE este 4.11, care este și ultima din versiunile ramurii 4 -STABLE.
Prima versiune 5 -STABLE a fost 5.3 (de la 5.0 la 5.2.1 au fost parte din ramura –
CURRENT ). Prima versiune 6 -STABLE a fost 6.0. Ramura de dezvoltare, -CURRENT ,
în acest moment este 7.0 -CURRENT și conține caracteristici agresive pentru un nucelu
nou și pentru aplicații din spațiul utilizator. Dacă o caracteristică este suficient de stabilă
și matură, atunci ea poate fi portată pe versiuni anterioare ale ramurii -STABL E (în slang –
ul FreeBSD operația este denumită MFC, Merge from CURRENT). Modelul de
dezvoltare FreeBSD este descris mai amănunțit într -un articol, în limba engleză, de Niklas
Saers2.
Marea diferență în FreeBSD 5 a fost o schimbare majoră în mecanismul de n ivel
jos al blocării nucleului care permite un suport mai bun pentru multiprocesor simetric
(SMP, symmetric multiprocessor), eliberând o mare parte de nucleu de blocarea
multiprocesorului, menționată uneori ca Big Giant Lock . Acum este posibilă executarea
în același timp mai multor procese în mod nucleu.
Altă schimbare majoră include o soluție de thread -ing m:n, numită KSE, care
acum este biblioteca implicită pentru threading (pthreads) începând cu 5.3 (crearea
ramurii 5 -STABLE). Terminologia m:n, unde m și n sunt întregi pozitivi, implică faptul
că m fire de execuție (thread) din spațiul utilizator corespund la n fire de execuție ale
nucleului. Multe alte caracteristici noi sunt legate de securitate. A fost format proiectul
TrustedBSD de către Robert Watso n cu scopul expres de a adăuga încredere în
funcționalitatea sistemului de operare pentru FreeBSD. Un mediu extensibil pentru
controlul obligatoriu al accesului (TrustedBSD MAC Framework, MAC este acronim
pentru mandatory access control), un sistem de fiși ere Access Control Lists (ACL, liste
de control pentru acces) și noul sistem de fișiere UFS2 toate provin din TrustedBSD.
Unele din funcționalitățile TrustedBSD au fost integrate de asemenea și în sistemele de
operare NetBSD și OpenBSD .
FreeBSD 5 a schimbat de asemenea semnificativ stratu l block I/O (bloc de
intrare/ieșire) prin introducerea mediului de transformare a cererii intrare/ieșire pentru
disc modular GEOM (GEOM modular disk I/O request transformation framework),
contribuție a lui Poul -Henning Kamp. GEOM activează crearea simplă a multor feluri de
funcționalitate, cum ar fi creare de imagini în oglindă, mirroring, (gmirror) și criptarea
(gbde). Lansarea recentă a FreeBSD 5.4 a confirmat ramura FreeBSD 5.X ca pe o
verisiune foarte stabilă și foarte performantă, în ciuda faptului că a avut o perioadă de
concepție lungă din motive de set cuprinzător de caracteristici.

2 http://www.freebsd.org/doc/en_US.ISO8859 -1/books/dev -model/

Cap 2: Servicii Internet sub Free BSD
15 2.1.2. FreeBSD 6 și 7
FreeBSD 6.1 a fost lansat în 8 mai, 2006, iar 7.0 -CURRENT este în dezvoltare
activă. Aceste versiuni continuă să lucreze la optimizări SMP și thre ading, la zona
funcționalității avansate a 802.11 și la auditarea evenimentelor de securitate TrustedBSD.
Realizările primei versiuni ale acestora includ înlăturarea Giant lock din VFS, înlocuirea
bibliotecii libthr cu o implementare 1:1 pentru threading c are se execută mai bine, și
adăugarea unei implementări de audit BSM, numită OpenBSM creată de proiectul
TrustedBSD, care se bazează solid pe implementarea BSD găsită în producția Open
Source de la Apple: Darwin , publicată sub o licență de tip BSD.
2.1.3. Compatibilitate cu Linux
FreeBSD oferă compatibilitate binară cu mai multe alte sisteme de operare
Unixlike (de tip unix), inclusiv cu Linux. Mo tivația din spatele acestui fapt este de obicei
atribuită rulării aplicațiilor dezvoltate pentru Linux, adesea comerciale, și care sunt
distribuite de obicei sub formă binară, astfel ele ne putând fi portate pe FreeBSD în lipsa
acceptului acelor care contr olează codul sursă.
Din linie de comandă, compatibilitatea permite utilizatorilor de FreeBSD să ruleze
majoritatea aplicațiilor care sunt distribuite doar ca binare Linux. În comparație cu
numărul vast de aplicații native disponibile pentru FreeBSD folosi nd colecția de porturi,
aceste aplicații sunt minoritare. Aplicațiile folosite în nivel de compatibilitate Linux
includ StarOfice, versiunea Linux de Netscape, Adobe Acrobat, RealPlayer, VMware,
Oracle, WordPerfect, Skype, Doom 3, Quake 4, seria Unreal Tou rnaments, Sea Monkey,
și altele. În general, pare să nu existe nici o diminuare notabilă a performanței când se
rulează binarele Linux comparativ cu aplicațiile native FreeBSD.
Deși există multe aplicații care rulează fluent în stratul de compatibilitate, trebuie
notat că stratul nu este complet, astfel ducând unele binare Linux în situația de nu putea
fi folosite sau de a le limita funcționalitatea, probabil din cauza faptului că stratul de
compatibilitate suportă doar apelurile de sistem pentru nucleul L inux 2.4.2, o distribuție
care a făcut istorie. Un exemplu din această categorie este Cedega, produsul firmei
TransGaming pentru rulat jocuri de Microsoft Windows sub Linux. Folosirea acestuia în
acest moment este în mare măsură compromisă din cauza unui s trat de compatibilitate
incomplet. Există însă un succes limitat în folosirea lui la rularea jocurilor pe FreeBSD.
A fost acceptat un proiect pentru ediția 2006 Sumer of code, de a actualiza stratul de
compatibilitate și de a implementa apeluri de sistem c are lipsesc.
Pentru cele mai multe aplicații științifice, compatibilitatea Linux lucrează corect;
aplicații precum nmrpipe, ccp, Mathematica sau Matlab lucrează conform așteptărilor.
2.1.4. Licență
Ca și sistemele de operare surori, codul din FreeBSD es te publicat sub termenii
diferitelor licențe. Totalitatea codului nucleului și cea mai nou creată de cod este publicată
sub termenii licenței BSD cu două clauze, care permite tuturor să folosească și să
redistribuie FreeBSD după dorință. Există de asemenea părți publicate sub alte licențe:
GPL, LGPL, ISC, licență BSD cu trei clauze, licență BSD cu patru clauze.
Pentru unele funcționalități particulare, există de asemenea și binare fără cod sursă
cum ar fi Atheros HAL pentru funcționalitate wireless și o un ealtă doar în format binar
pentru AAC RAID de la Adaptec.

Sisteme Informatice de Asistare a Deciziei
16 2.1.5. Produse derivate din FreeBSD
O gamă largă de produse sunt bazate direct sau indirect pe FreeBSD. Această
gamă cuprinde de la dispozitive de tip embedded (integrate), cum ar fi rutere Junipe r
Networks și sisteme de operare firewall de la Nokia, la porțiuni întregi ale altor sisteme
de operare incluzând aici Linux și RTOS WxWorks. Darwin, inima Mac OS X de la
Apple, se bazează în mare măsură pe FreeBSD incluzând aici sistemul de fișiere virtua l,
stiva de rețea și componente din spațiul utilizator. Apple continuă să integreze cod nou
din FreeBSD și contribuie înapoi către FreeBSD cu schimbări. Produsul open source
OpenDarwin, dezvoltat original din codul de bază al Apple dar acum entitate separa tă,
include de asemenea cod FreeBSD în mod substanțial. În plus există câteva sisteme de
operare originale desprinse din sau bazate pe FreeBSD incluzând aici PC -BSD și
DesktopBSD, care include îmbunătățiri destinate utilizatorilor de acasă sau stațiilor de
lucru; distribuțiile FreeSBIE și Frenzy live CD; produsele firewall embedded m0n0wall
și pfSense; DragonFly BSD o notabilă desprindere din FreeBSD 4.8 conceput pentru o
strategie de sincronizare multiprocesor diferită care a fost apoi aleasă pentru FreeBS D 5
și dezvoltarea unor caracteristici microkernel (micronucleu); și nu în ultimul rând
RoFreeSBIE, un proiect rezultat colaborării membrilor ROFUG.
2.1.6. TrustedBSD
Proiectul TrustedBSD oferă FreeBSD -ului un set de extensii de încredere pentru
sistemul de operare, fiind inițiat de Robert Watson. Scopul proiectului a fost
implementarea conceptelor de la Common Criteria pentru Information Technology
Security Evaluation (evaluarea securității tehnologiei informațiilor) și Orange Book.
Acest proiect rămâne încă în dezvoltare, și multe din aceste extensii de încredere au fost
integrate în lista de dezvoltare a FreeBSD 5.X, 6.X și acum 7.X -CURRENT.
Pincipalul obiectiv al proiectului TrustedBSD este contribuția la Access Control
Lists (listele de control al ac cesului), auditul evenimentului, atribuții extinse, capacități
de acord fin și mandatory access control (control al accesului obligatoriu). Ca parte din
proiectul TrustedBSD, există de asemenea un port care rulează pe FreeBSD al
implementării FLASK/TE al N SA în SELinux. Contribuții mai recente includ dezvoltarea
OpenBSM, o implementare open source a API -ului Basic Security Module (BSM, modul
de securitate fundamentală) al companiei Sun și un format de fișiere pentru jurnale de
audit, care suportă un sistem de audit pentru securitate extinsă care face parte din
FreeBSD 6.1.
Deși majoritatea componentelor proiectului TrustedBSD sunt incluse în arborele
sursă principal al FreeBSD, aceasta nu este singura lor destinație. Multe caracteristici,
odată ajunse la ma turitate, își găsesc locul în OpenBSD sau Darwin de la Apple
Computer.

Cap 2: Servicii Internet sub Free BSD
17 2.2. Configurarea unui server multifuncțional pe baza la
FreeBSD
2.2.1. Introducere:
Vom încerca să instalăm un server multifuncțional pe baza sistemului de operare
din famili a UNIX FreeBSD.
FreeBSD este un sistem comod organizat și se deosebește de cele alte sisteme de
operare UNIX prin distibutivul simplu și modalitatea simplă de instalare.

Serverul nostru va îndeplini următoarele funcții:
1. Marșrutizator
2. Mail server (POP3 + IMAP)
3. FTP server
4. Web server (Apache + PHP)
5. Data base server (MySQL)
2.2.2. Instalarea sistemului
Vom examina versiunea FreeBSD 5.0. Pentru simplitate se va descrie toata
procedura pe pași. Dacă se a face totul corect, instalarea va dura c irca 40 minute.
1. plasam CD ul cu distributivul FreeBSD în CD -ROM.
2. După ce se pornește instalarea alegem regimul CUSTOM de instalare. Acest
regim ne va permite să instalăm doar ceea ce avem nevoie.
3. Pasul următor este de a împărți corect HDD -ul pe parti ții. Dat fiind faptul că
pentru serverul nostru HDD -ul nu joacă cel mai important rol, îl vom împărți așa
cum ne oferă sistemul. Activam punctul PARTITION apăsăm litera A , și după
ce el a împărțit totul automat apăsăm litera Q .
4. Activăm punctul LABEL. A păsăm iarăși litera A și apoi Q .
5. Activăm punctul DISTRIBUTIONS. Apoi de aici alegem MINIMUM. Adică
instalăm sistemul cu minimum de resurse. Apoi EXIT
6. Activăm punctul MEDIA, de acolo alegem de unde vom instala sistemul în cazul
nostru va fi CDROM ;
7. Activăm punctul COMMIT. Și pe vreo 20 minute putem savura o cafea.
8. Activăm punctul CONFIGURATION. De aici puteți să adăugați porturile și
sursele care se afla în DISTRIBUTION, PACKAGE, PORTS. Apoi mergem să
schimbăm parola pentru userul ROOT;
9. În Punctul U SER MANAGEMENT adăugăm un utilizator din grupa WHEEL,
pentru a putea trece de la acest user la ROOT
10. Setam TIME ZONE
11. Trecem la punctul NETWORKING
12. Atenție!!! Se presupune că serverul nostru are 2 plăci de rețea. Una se va uita în
Internet alta spre reț eaua locală.
13. Mergem la punctul GATEWAY, apăsăm spațiu și bifam opțiunea.
14. Accesăm punctul INTERFACES. Vom vedea pe ecran toate plăcile noastre de
rețea.

Sisteme Informatice de Asistare a Deciziei
18 15. La două din ele care pot să se numească lnc0 și lnc1 (în dependență de versiune
denumirea poate sa varieze, dar 0 și 1 este neapărat.) la sfârșitul rândului este notat
ETHERNET. Deci anume acestea sunt plăcile noastre.
16. O activăm pe prima. Setăm numele calculatorului, numele de domeniu, adresa
DNS, și IP -ul din rețeaua din care face parte aceasta plac ă.
17. Activăm a doua placă și cu ea procedăm la fel.
18. Ieșim din instalare și restartăm calculatorul.
19. Felicitări ROUTER -ul este instalat
2.2.3. Setarea marșrutizatorului
Deci deja avem calculatorul cu 2 interfețe de rețea din care una se uita spre Int ernet
si alta spre rețeaua locală. Vom continua pe pași.

Server
FreeBSD
LAN
local
10.7.0.0/16
NIC2 NIC1
10.7.0.1/16 195.131.31.240

1. Verificăm dacă funcția de router este activată.
/etc/rc.conf gateway_enable='YES'

2. Recompilăm nucleul adăugând elementele de care vom avea
nevoie și eliminând cele de care nu avem nevoie. Asta se face
în felul următor.
cd /usr/src/sys/i386/conf
cp GENERIC my # facem o copie a nucleului Redactam
fișierul adăugând:
########### FIREWALL
options IP FIREWALL #firewall
options IPFIREWALL_VERBOSE #enable logging to syslogd(8)
options IPFIREWALL_FORWARD #enable transparent proxy support
options IPFIREWALL_VERBOSE_LIMIT=100 #limit verbosity
options IPFIREWALL_DEFAULT_TO_ACCEPT #allow eve rything by default

########### DUMMYNET – saiper in FreeBSD
options DUMMYNET
######### IPDIVERT – sistemul NAT
options IPDIVERT #divert sockets

3. Recompilam config my cd ../../depend/my
make depend && make && make install

INTERNET

Cap 2: Servicii Internet sub Free BSD
19
4. Restartam computerul shutdown -r now

5. Cream fișierul rc.firewall.local
Presupunem ca rețeaua locală este 10.7.0.0/16 și interfața ce privește Internetul
este 195.131.31.240, care este asociata interfeței dc1.
Atunci fișierul rc.firewall.local va fi:
#!/bin/sh

/sbin/ipfw -f flush
/sbin/ipfw add 5000 divert natd ip from 10.7.0.0/16 to any out xmit
dc1
/sbin/ipfw add 5100 divert natd ip from any to 195.131.31.240

activăm acest fișier:
sh /etc/rc.firewall.local

6. Porn im programul NATD
/sbin/natd -n dc1
Din acest moment routerul ar trebui să lucreze. Dar după prima reîncărcare totul
se va pierde de aceea trebuie să automatizăm procesul de încărcare a marșrutizatorului.

7. Cream fișierul /etc/rc.local și introducem următorul text
/sbin/natd –n dc1
/bin/sh /etc/rc.firewall.local
8. Restartăm sistemul și ne convingem că totul lucrează.

2.2.4. Mail server
Mail serverul constă din 2 componente. Componenta de transmitere a e -mailurilor
de la un calculator la a ltul – protocolul SMTP și componenta de primire a scrisorilor de
la server spre client protocoalele POP3 și IMAP.

2.2.4.1. Setarea SMTP
1. Agentul standard pentru SMTP este programul sendmail . Vom avea nevoie de
următoarele fișiere de configurare:
/etc/mail/access
/etc/mail/aliases
/etc/mail/local -host-names
/etc/mail/mailer.conf
/etc/mail/mailertable
/etc/mail/sendmail.cf
/etc/mail/virtusertable

Sisteme Informatice de Asistare a Deciziei
20 2. Setam fișierul /etc/mail/access . Aici noi putem seta hosturile și IP -urile
cărora le permit em sau nu să se folosească de SMTP -ul nostru. Edităm
fișierul.
cyberspammer.com 550 We don't accept mail from spammers
FREE.STEALTH.MAILER@ 550 We don't accept mail from
spammers another.source.of.spam REJECT
okay.cyberspammer.com OK
• RELAY

Dacă este setat OK sau RELAY atunci de pe aceste hosturi sau IPuri, sau
începuturi de IPuri se vor putea transmite scrisori. Dacă este REJECT atunci nu se va
permite de transmis.
3. În /etc/mail/aliases se pot notata sinonimele la utilizatori și liste de ut ilizatori.
Presupunem că dorim ca utilizatorul X să primească e -mailuri adresate și pe
numele X și pe Y. Atunci vom nota:

Y:X

Dacă noi dorim ca adresa Y să se refere la mai mulți abonați atunci scriem:

Y: joe,eric,paul sau Y: joe@host.com , eric@host.org, paul@host.md

După ce am editat acest fișier neapărat trebuie să scriem:
Newaliases

2.2.4.2. Configurarea POP3 și IMAP
Pentru început vom instala un program care ne permite să folosim protocoalele
IMAP și POP3. Sunt foarte multe programe de acest fel. Unul din ele poate fi găsit și aici
http://www.washington.edu/imap/ programul se numește IMAPD
ftp://ftp.cac.washington.edu/imap/imap.tar.Z

Dezarhiv ăm:
gunzip imap.tar.Z tar
–xvf imap.tar

Trecem în directoriul IMAP și compilăm:
make bsf
Trecem în directorul ../imapd și copiem fișierul imapd și pop3 în
/usr/local/libexec
Intrăm în fișierul /etc/inetd.conf și ștergem sem nul # din fața la IMAP4 și POP3,
în rândul POP3 în loc de pop3 schimbam în ipop3d, și la IMAP respectiv tot schimbăm

Restartam serviciul
ps –ax | grep ‘inetd'
Ținem minte numărul din /usr/sbin/inetd –wW și scriem kill –HUP numărul.
Controlăm, treb uie să lucreze ambele protocoale

Cap 2: Servicii Internet sub Free BSD
21 2.2.5. FTP server
Ca ftp server poate fi folosit programul PROFTPD . Acest program poate fi găsit aici
http://www.proftpd.org
De asemenea putem instala din porturi
cd /usr/ports/ftp/proftpd/ make
all install make clean
Pornim serviciul din fișierul /etc/inetd.conf Adăugăm:
ftp stream tcp nowait root /usr/local/libexec/proftpd proftpd

Restartăm serviciul
inetd kill –HUP

Configurăm serviciul
Copiem fișierul de configurare cp
/usr/local/etc/proftpd.co nf.default /usr/local/etc/proftpd.conf
Acum în fișierul /usr/local/etc/proftpd.conf putem configura toate opțiunile dorite.
Explicații adăugătoare sunt prezente aici http://www.proftpd.org/docs

2.2.6. Web server (Apache + PHP)
Există două versiuni a bsolut independente de Web: servere Apache. Apache 1 și
2. În acest curs vom examina cum se instalează apache 2 care poate fi găsit aici:
http://www.apache.org/
Se dezarhivează cu ajutorul comenzii tar –zxvf , apoi intram in directoriul creat
./configur e
Make
Make install
Automatizam încărcarea serverului, în fișierul /etc/rc.local (dacă nu există acest
fișier îl creăm noi) adăugăm :
/usr/local/apache22/bin/apachectl start
Toate fișierele Apache inclusiv acele de configurare se afla în
/usr/local/apache22

Următorul pas este instalarea PHP pe care îl găsim aici www.php.net Dezarhivăm
și configurăm metoda de instalare prin:
./configure –with-apxs2=/usr/local/apache2/bin/apxs –with-mysql
make make install

Dacă încă nu avem i nstalat MySQL ștergem îmbinarea –with-mysql Instalarea
MySQL va fi explicată în pasul următor.
Schimbăm configurația Apache:
Intrăm în /usr/local/apache22/conf/httpd.conf

Verificăm dacă există:

Pentru PHP4

Sisteme Informatice de Asistare a Deciziei
22 LoadModule php4_module libexec/lib php4.so

Pentru PHP5
LoadModule php5_module libexec/libphp5.so

Adăugăm sau scoatem # din fata la rândurilor
AddType application/x -httpd-php .php .phtml
AddType application/x -httpd-php-source .phps

Restartam apache
/usr/local/apache22/bin /apachectl restart

2.2.7. Instalarea MySQL
Există câteva pachete de distribuție MySQL. Toate pot fi găsite pe
www.mysql.com . Noi ne vom folosi de o versiune necompilată a programului și o vom
compila -o singuri. MySQL necompilat toate fi găsit ai ci:
ftp://unix.hensa.ac.uk/sites/master.us.finkmirrors.net/distfiles/mysql -4.0.16.tar.gz

Dezarhivăm tar -zxvf mysql -4.0.16.tar.gz
-C /usr/local/src

Creăm utilizatorul mysql și grupa pentru acest utilizator deoarece mysql va lucra
sub propriul util izator pw groupadd mysql
pw useradd mysql -g mysql -d /usr/local/mysql -s /dev/null

Configurăm instalarea cd
/usr/local/src/mysql -4.0.16
./configure –prefix=/usr/local/mysql –with-mysqld-user=mysql

Compilăm
make make
install

Instalăm baza de date mysql scripts/mysql_install_db

Atribuim fișierele compilate utilizatorului mySQL
chown -R mysql /usr/local/mysql/var chgrp -R
mysql /usr/local/mysql/var

În mapa /usr/local/etc/rc.d/ creăm fișierul mysql.sh
Conținutul acestui fișie r poate fi găsit în Internet,
http://tutorial.ru/files/mysql/mysql.sh sau se copie
următoarele:
#!/bin/sh

Cap 2: Servicii Internet sub Free BSD
23 basedir="/usr/local/mysql" datadir="$basedir/var"
pid_file="$basedir/var/mysqld.pid"
bindir="$basedir/bin"
PATH=/sbin:/usr/sbin:/bin:/usr/bin:$ba sedir/bin
export PATH mode=$1 # start or stop
parse_arguments() { for arg do case "$arg" in
–basedir=*) basedir=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
–datadir=*) datadir=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
–pid-file=*) pid_file=`echo "$arg" | s ed -e 's/^[^=]*=//'` ;;
esac done }
# Get arguments from the my.cnf file,
# groups [mysqld] [mysql_server] and [mysql.server]
if test -x ./bin/my_print_defaults then
print_defaults="./bin/my_print_defaults"
elif test -x $bindir/my_print_defaults
then
print_defaults="$bindir/my_print_defaults"
elif test -x $bindir/mysql_print_defaults
then
print_defaults="$bindir/mysql_print_defaults" else
# Try to find basedir in /etc/my.cnf
conf=/etc/my.cnf print_defaults= if
test -r $conf then
subpat='^[^=]*basedi r[^=]*=\(.*\)$' dirs=`sed
-e "/$subpat/!d" -e 's//\1/' $conf` for d in
$dirs do
d=`echo $d | sed -e 's/[ ]//g'` if
test -x "$d/bin/my_print_defaults"
then
print_defaults="$d/bin/my_print_defaults"
break fi
if test -x "$d/bin/mysql_print_defaults" then
print_defaults="$d/bin/mysql_print_defaults"
break fi done fi
# Hope it's in the PATH … but I doubt it
test -z "$print_defaults" && print_defaults="my_print_defaults" fi
#
# Test if someone changed datadir; In this case we should also read
the
# default arguments from this directory
# extra_args=""
if test "$datadir" != "@localstatedir@" then
extra_args=" -e $datadir/my.cnf" fi
parse_arguments `$print_defaults $extra_args mysqld mysql_server
mysql.server`
# Safeguard (relative paths, core dumps.. )
cd $basedir case "$mode" in 'start') #
Start daemon
if test -x $bindir/mysqld_safe then
# Give extra arguments to mysqld with the my.cnf file. This script may
# be overwritten at next upgrade.
$bindir/mysqld_safe –datadir=$datadir –pid-file=$pid_fi le &
# Make lock for RedHat / SuSE if
test -w /var/lock/subsys then
touch /var/lock/subsys/mysql
fi else

Sisteme Informatice de Asistare a Deciziei
24 echo "Can't execute $bindir/mysqld_safe from dir $basedir"
fi ;;
'stop')
# Stop daemon. We use a signal here to avoid having to know the
# root p assword.
if test -s "$pid_file" then
mysqld_pid=`cat $pid_file`
echo "Killing mysqld with pid $mysqld_pid" kill
$mysqld_pid
# mysqld should remove the pid_file when it exits, so wait for it.
sleep 1
while [ -s $pid_file -a "$flags" != aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa
] do
[ -z "$flags" ] && echo "Wait for mysqld to exit \c" || echo ". \c"
flags=a$flags sleep 1 done
if [ -s $pid_file ] then echo
" gave up waiting!" elif [ –
n "$flags" ] then echo "
done" fi
# delete lock for RedHat / SuSE if
test -f /var/lock/subsys/mysql
then
rm /var/lock/subsys/mysql
fi else
echo "No mysqld pid file found. Looked for $pid_file."
fi ;;
'restart')
# Stop the service and regardless of whether it was
# running or not, start it again.
$0 stop
$0 start
;;
*) #
usage
echo "Usage: $0 start|stop|restart"
exit 1 ;; esac
Atribuim drepturi acestui fi șier
chmod 700 mysql.sh
Lansăm MySQL
/usr/local/etc/rc.d/mysql.sh start

Setăm parola pentru adminul mysql
/usr/local/mysql/bin/mysqladmin -u root password PAROLA

Facem câteva linkuri la alte programe care vor lucra cu Internetul :
ln -s /usr/local/mysql/include/mysql /usr/include
ln -s /usr/local/mysql/lib/mysql /usr/lib ln -s
/usr/local/mysql/bin/mysql /usr/local/bin ln -s
/usr/local/mysql/bin/mysqldump /usr/local/bin ln –
s /usr/local/mysql/bin/mysqladmin /usr/local/bin
ln -s /usr/local/mysql/lib/mysql/libmysqlclient.so.12 /usr/local/lib

Cap 2: Servicii Internet sub Free BSD
25 Restartăm calculatorul.

26 3. Servicii Internet sub Windows
3.1. Generalități
În acest capitol se vor prezenta generalități legate de sistemul de operare
Windows, cu exemplificări pe Windows 2000 server. Cum cursul nu se referă la sisteme
de opera re, ci doar la implementarea tehnologiilor internet în acestea, nu vom insista
asupra variantelor de sisteme Windows, a modului de instalare și a diferitelor facilități
furnizate de acestea, ci doar la acele module considerate utile și necesare pentru apli cații
Internet.
Sistemul de operare Windows 2000 este sub licență Microsoft, și suportă două
tipuri de licență:
• per server – pentru stabilirea de către server a numărului de conexiuni concurente;
• per seat – în care fiecare stație de lucru din domeniu ar e propriul său C.A.L.
(Client Access License) achiziționat o dată cu sistemul de calcul.

Prima variantă este mai viabilă deoarece într -o rețea pot exista sisteme cu diferite
sisteme de operare care ar putea să nu aibă un C.A.L. În modul de licențiere pe r server,
numărul de conexiuni este dat de numărul clienților care a fost achiziționat odată cu
sistemul de operare. Acest număr poate fi schimbat și se stabilește funcție de necesitățile
fiecărei rețele.
La instalarea unui sistem de operare Windows serve r, avem la dispoziție mai
multe componente pe care le putem să le instalăm sau nu. În continuare prezentăm câteva
din acestea cu rolul și importanța lor:
• Certificate Service – reprezintă suportul pentru aplicațiile care utilizează chei
publice de securita te, permițând instalarea și configurarea certificatelor de
autoritate (Certificate Authority);
• Internet Information Service (IIS) – reprezintă serviciul care se instalează și se
configurează pentru a putea pune la dispoziție fișiere via Web, utilizând ser viciul
HTTP. Atenție: nu instalați acest serviciu pe serverele de domeniu, pentru că
accesul prin http reprezintă un risc de securitate suplimentar într -o rețea de
calculatoare;
• Network Monitor Tools – o unealtă din componenta Management and
Monitoring T ools, folosită pentru urmărirea traficului pe rețea.
3.2. Configurarea Windows 2000 ca server de domeniu
La prima conectare pe server se deschide o fereastră de configurare care ne
permite să alegem din mai multe opțiuni, și anume:
• Active directory – serviciul pentru configurarea și administrarea utilizatorilor
dintr -un domeniu de calculatoare
• File server – server pentru fișere;
• Print server – server dedicat gestionării imprimantelor din rețea și a accesului
către acestea;
• Web/Media Server – server de dicat publicării fișierelor HTML sau media pe
Internet sau Intranet.
În Windows 200, serverul este un termen generic, care poate fi configurat în
funcție de necesități. Un server de domeniu este recunoscut generic sub denumirea de

27 Domain Controler (DC), î ntr-o rețea putând exista mai multe astfel de servere care
partajează informația din Active Directory în scopul unei mai mari siguranțe a rețelei.
Proprietatea de Domain Controller este văzută în Windows 2000 ca un rol care
poate fi schimbat ușor între di feritele servere din rețea. primul server care a fost configurat
ca DC în rețea este recunoscut și ca Master Domain Controller (MDC), toate celelalte
servere fiind Secondary Domain Controller (SDM).
3.2.1. Instalare Active Directory
Pasul l – Lansarea î n execuție a ferestrei de configurare
Start → Programs → Administrative Tools → Configure Your Server.
Pasul 2 – Instalare Active Directory
în fereastra care s -a deschis se apasă pe Active Directory și în josul ferestrei
există hyperlink -ul Start.
În fereastra de Welcome apăsați Next, apoi în alegerea tipului serverului: pentru
un domeniu nou (Domain controller for a new domairi) sau ca un server suplimentar
pentru un domeniu existent (Additional domain controller for an existing domairi).
Atenție: Dacă aveți conturi de utilizatori locale precum și alte setări de securitate
și căsuțe de e -mail pe serverul pe care doriți să configurați Active Directory, aceste vor
fi șterse automat. Dacă se instalează primul server, vom alege prima opțiune și trecem la
etapa următoare.
Pasul 3 – Crearea unui arbore de domenii
În Active Directory rețelele locale sunt organizate arborescent, momentul
configurării primului server din rețea coincide cu crearea unui nou arbore de domenii.
Alegeți, așadar, prima opțiune (Create a new domain tree) și treceți la pasul următor unde
va trebui să creați o nouă „pădure" (forest).
Pasul 4 – Crearea unui nou nume de domenii
Active Directory presupune existența unei alte structuri arborescente care
reprezintă scheletul de comunicați e între stațiile din viitorul domeniu. Acest nou serviciu
care trebuie instalat este DNS (Domain Name System – Sistemul numelor de domenii).
Programele utilizate, în mod curent, se referă rareori la sistemele gazdă, cutii
poștale și alte resurse prin adre sa lor binară (IP), în locul acesteia fiind folosite șiruri de
caractere de forma: nume_host.subdomeniul.. .subdomeniu_n. domeniu
Folosirea unor șiruri de caractere în locul adreselor binare duce la utilizarea ușoară
a adreselor, fiind mult mai ușor de re ținut decât niște numere care nu spun mare lucru
utilizatorilor obișnuiți. Va fi necesar un mecanism care să permită convertirea unei adrese
din format ASCII în format IP, singurul format recunoscut în rețea.
Structura arborescentă a DNS permite utilizar ea de domenii cu același nume.
Pentru a se stabili corespondența între nume și adresa IP se procedează astfel:
• programul de aplicație apelează o procedură de bibliotecă (resolver),
transferându -i ca parametru numele de domeniu;
• resolver -ul trimite un pac het UDP la serverul local DNS, care caută numele și
returnează adresa IP asociată acestuia;
• având adresa IP, programul apelant poate stabili o conexiune TCP cu destinația.

Cap 3: Servicii Internet sub Windows
Extinderea domeniilor de la diferite nivelu ri ale arborelui DNS se poate realiza prin

Sisteme Informatice de Asistare a Deciziei
28 crearea de proxy servere , care permit calculatoarelor unei rețele să acceseze în sens unic
resursele rețelei Internet, acestea nefiind „văzute" din exterior.
În Windows 2000 Server, numele de DNS conține și numel e de NetBIOS al
viitorului nume al domeniului de calculatoare.
În cazul nostru, vom folosi drept denumire a domeniului mydom.myorg.ro.
Numele complet al fiecărei stații din viitorul domeniu va fi format din numele acesteia
(NetBIOS Name) urmat de numele d omeniului DNS.
Pasul următor este reprezentat de specificarea numelui de NetBIOS al domeniului,
propunerea implicită fiind reprezentată de prima categorie : mydom.
Locația implicită a bazei de date cu informațiile din Active Directory este în
directorul WINNT, subdirectorul NTDS, pe discul pe care a fost instalat sistemul de
operare (în cazul nostru, partiția C :). Această locație poate fi schimbată (prin apăsarea
butonului Browse), dar nu vă deranjează cu nimic dacă rămâne acolo. De asemenea, log –
urile ( jurnalul de activitate) sunt salvate implicit la aceeași adresă de pe disc.
Pentru ca anumite obiecte din Active Directory să poată fi accesibile din orice
punct al rețelei, acestea trebuie să fie puse la dispoziție în rețea prin crearea unui share.
Locul de salvare a acestor obiecte este în directorul WINNT, subdirectorul SYSVOL. Vă
recomandăm să folosiți opțiunile implicite !
Utilitarul de instalare și configurare a Active Directory vă oferă posibilitatea de
configurare în această etapă a serverului DNS , se recomandă instalarea și configurarea
automată a acestuia pe calculatorul curent.
Pasul 5 – Permisiunile
Această etapă este foarte importantă din punctul de vedere al structurii rețelei.
Prima opțiune (Permissions compatible with pre -Windows 2000 ser vers) oferă
posibilitatea de a conecta la server stații care au instalat sisteme de operare mai vechi
decât Windows 2000. A doua opțiune (Permissions compatible only with Windows 2000
servers) asigură o securitate mult mai bună domeniului creat.
În cazul în care toate stațiile și serverele din domeniul creat au drept sistem de
operare Windows 2000 sau un sistem Windows mai nou, se recomandăm a doua opțiune.
Dacă nu, atunci obligatoriu este utilizarea primei opțiuni.
În cazul în care pe viitor pot exista c ăderi ale serviciului Active Directory, serverul
poate fi pornit în Directory Service Restore Mode care permite o recuperare a
informațiilor. Pentru accesul la această opțiune aveți nevoie de o parola. Pentru a accesa
opțiunea de Restore, introduceți CD -ul cu kit -ul de instalare a sistemului de operare în
unitatea de CD -ROM și reporniți sistemul. După repornire, se lansează aplicația Setup de
pe CD și alegeți opțiunea Restore (tasta R).
Pasul 6 – Ultima etapă
Ultima etapă ne prezintă un scurt sumar al inf ormațiilor configurate, după care se
trece la configurarea efectivă a Active Directory.
Pentru a putea configura Active Directory aveți nevoie de CD -ul de instalare a
sistemului de operare W2K Server, într -o etapă anterioară, litera CD -ROM -ului a fost
schimbată cu Z : așa că fișierele de instalare trebuie căutate la această nouă locație, în
directorul I386 de pe discul d -voastră.
Finalizarea instalării presupune în același timp repornirea serverului pentru
inițializarea noilor parametri de configurare a a cestuia.

29 După repornire, în fereastra de conectare (Log On to Windows) apare o nouă listă
de opțiuni din care puteți alege domeniul la care vă veți conecta. Pe fiecare stație de lucru
inclusă în viitorul domeniu va apărea, pe lângă numele domeniului, nume le de NetBIOS
al stației.
Pentru a nu mai vizualiza de fiecare dată la repornire fereastra de configurare a
serverului, dezactivați opțiunea Show this screen at startup și închideți fereastra.
Una dintre ultimele modificări pe care trebuie să le efectuaț i este reprezentată de
schimbarea adresei DNS de la configurarea adaptorului de rețea din 127.0.0. l (adresa de
loopback) în adresa serverului care reprezintă în acest moment și server de DNS :
1. RClick (pe pictograma My Network Places) → Properties.
2. RClic k (pe Local Area Connection) → Properties.
3. Internet Protocol (TCP/IP) → Properties → introduceți adresa
serverului la secțiunea Preferea DNS server → OK → pentru vizualizarea în bara
de aplicații a informațiilor despre conexiunea la rețea, activați opțiun ea Show icon
in taskbar when connected) → OK.
3.2.2. Dezinstalarea serviciului Active Directory
Această opțiune permite administratorilor de sistem schimbarea destinației unui
server din cadrul unei rețele. Alte cazuri în care această opțiune se poate ap lica este aceea
în care unui server i se atribuie rolul de server de Web într -un domeniu.
Pentru acest lucru trebuie să parcurgeți următoarele etape :
1. Start → Run → scrieți dcpromo → OK → Next.
2. în fereastra de informare apăsați OK.
3. în cazul în care nu aveți un server de domeniu secundar, toate
informațiile despre conturile de utilizatori vor fi eliminate, de asemenea politicile
de securitate precum și cheile publice de acces la diferite resurse. Domeniul nu va
mai exista! Selectați opțiunea This server is the last domain controller in the
domain în cazul în care nu mai există nici un alt server de domeniu în rețea și
apăsați Next.

3.3. Instalarea și configurarea unui server de Web
Instalarea serviciului de Web pentru un server se poate realiza o dată cu instalarea
sistemului de operare sau poate fi instalată ulterior:
1. Start → Setting → Control Panel;
2. Add/Remove Programs → Add/Remove Windows Components
Add/Remove Components;
3. în fereastra Windows Components Wizard → click pe Internet Information
Services (ISS) → Details;
4. Activați Internet Information Service Snap -In, pentru a putea gestiona
serviciul IIS dintr -o consolă administrativă. În această etapă se activează
automat și opțiunea Common files; 5. Activați opțiunea World Wide Web
Server;
6. OK → Next → Next → Finsh → Close.

Sisteme Informatice de Asistare a Deciziei
30 După efectuarea acestei operațiuni, în Administrative Tools apare o nouă
categorie: Internet Service Manager, din care poate fi gestionat noul server Web. NOTĂ:
acest server Web este disponibil și sub Windows XP Profesiona l.

Pe discul C:, de pe sistem a apărut un nou director: Inetpub, toate noile pagini pe
Cap 3: Servicii Internet sub Windows
care le veți crea fiind găzduite în subdirectorul wwwroot .
Verificarea funcționalității serverului se poate face lansând Inter net Explorer, iar
la adresă se trece localhost . Pagina care se afișează conține informații despre versiunea
serverului, documentația online, posibilitatea de administrare a serverului.
Pentru crearea propriilor pagini puteți folosi orice editor de pagini Web sau
scrierea codului HTML a paginilor într -un editor de texte. În listing -ul următor se prezintă
pagină de start în care se va specifica faptul că pagina este în construcție.
<HTML>
<HEAD>
<TITLE> Bun venit !! </TITLE>
</HEAD>

<BODY bgColor=" →3A6EA5" text="white">
<H1><CENTER> Această pagină este încă în construcție !!
</CENTER></H1>
<P> Vă rugăm reveniți ! </P>
</BODY>
</HTML>

Culoarea de background specificată la tag -ul <BODY> este echivalentul culorii
implicite a background -ului din Windows 2000. Am ales această culoare pentru a putea
integra o pagină Web pe desktop -ul stațiilor de lucru din domeniu. Puteți crea pagina prin
introducerea codului direct în notepad și salvați cu o anumită denumire (de exemplu,
HomePage) și extensia HTM, la adresa: C \Inetpub \wwwroot . vizualizarea acesteia în
browser realizându -se la adresa http : //localhost/HomePage.htm.
Pentru a încărca pagina creată anterior, în mod implicit, când se accesează
serverul, trebuie să modificați proprietățile implici te ale site -ului d -voastră:
1. în consola de administrare a IIS : RClick pe Default Web Site → Properties.
2. în fereastra de proprietăți: Documents →Add → scrieți numele fișierului în
căsuța Default Document Name (în cazul nostru, HomePage.htm) →OK.
3. Pozițion ați documentul pe primul loc prin apăsarea butonului cu săgeată în sus
→ OK.
În acest moment, pagina de start la accesarea serverului, specificând adresa
localhost, va fi cea creată în etapa anterioară.
Adresa la care poate fi accesat serverul Web de pe altă stație de lucru sau oricare
alt server din rețea se poate specifica în genul http: //nume_calculator/ (în cazul nostru
http: //WebServer/") sau prin adresa IP (http://192.168.123.100/') .
Instalarea unui server de e -mail într -un domeniu Windows trebui e să se realizeze
pe un server declarat mail exchanger în domeniul DNS, care vă oferă acces la Internet.
Serverul de e -mail oferit de firma Microsoft este Exchange Server. Acesta se poate integra
cu Active Directory și cu SQL Server.

31
3.4. Configurarea s erverului ca un Gateway
Condiția esențială pentru a instala un gateway este existența a cel puțin două
interfețe de rețea, una cu conectare directă la Internet (în cazul nostru IP -ul interfeței
Internet este : 193.231.34.101, iar pentru interfața internă: 192.168.123.254) și cealaltă
destinată rețelei interne.
Atribuirea rolului de router unui server de Windows 2000 :
1. Start → Programs → Administrative Tools → Routing and Remote Access.
2. RClick pe numele serverului → Configure and Enable Routing and Remot e
Access →Next.
3. în fereastra Common Configurations alegeți opțiunea pe care o doriți (în cazul
nostru putem alege ultima variantă, pentru că scopul nostru este de a configura
rolul de punte serverului în așa fel încât calculatoarele din rețeaua privată să
comunice cu cele din alte rețele) → Next.
4. Finish.

Un serviciu special care poate fi configurat în această etapă este NAT (Network
Address Translatiori) care presupune ca stațiile de lucru dintr -un anumit domeniu (Intern)
să poată accesa alte rețele de pe Internet prin intermediul interfeței de rețea reale (cea cu
conectare directă la Internet). Instalarea serviciului NAT:
1. în Routing and Remote Access, RClick pe General din IP Routing → New
Routing Protocol → Network Address Tmnslation (NAT) → OK.
2. RCli ck pe Network Address Translation (NAT) → New Interface.
3. în fereastra New Interface for… click pe interfața de rețea care face legătură cu
rețeaua privată → OK.
4. în fereastra N.A.T. Properties activați opțiunea Private interface connected io
private n etwork → OK.
5. RClick pe Network Address Translation (NAT) → New Interface.
6. în fereastra New Interface for… click pe interfața de rețea care face legătură cu
rețeaua Internet → OK.
7. în fereastra N.A.T. Properties activați opțiunea Public interface connec ted to the
Internet → Translate TCP/UDP headers (recommended) → OK.

După configurarea acestui serviciu, toate stațiile de lucru din domeniul Intern care
au trecut de la proprietățile TCP/IP la secțiunea Gateway, IP -ul intern al serverului, vor
putea să acceseze alte rețele de pe Internet.
Pentru controlul accesului, monitorizarea și controlul traficului precum și
configurarea unui firewall, trebuie instalat pachetul Microsoft Internet Security and
Acceleration Server 2000.

32
4. Protocoale si serv icii
4.1. DNS (Domain Name Service)
4.1.1. Introducere
Domain Name System (DNS) este un sistem distribuit de păstrare și interogare a
unor date arbitrare într -o structură ierarhică (figura 4.1). Cea mai cunoscută aplicație a
DNS este gestionarea domenii lor în Internet.
Caracteristicile sistemului de nume (DNS) sunt:
• folosește o structură ierarhizată;
• deleagă autoritatea pentru nume;
• baza de date cu numele și adresele IP este distribuită.
Fiecare implementare TCP/IP conține o rutină software (name resolver)
specializată în interogarea serverului de nume (DNS) în vederea obținerii translatării
nume/adresă IP sau invers.

Fig. 4.1: Sistemul ierarhic DNS

Există 2 tipuri de rezoluție de nume:
• rezoluție recursivă (name resolverul cere serverulu i de nume să facă translatarea);
• rezoluție iterativă (name resolverul cere serverului de nume să îi furnizeze adresa
IP a unui server care poate face translatarea).

Tipic, procesul de rezoluție a numelor se desfășoară astfel:
• name resolverul primeșt e de la o aplicație client TCP/IP un nume; acesta
formulează o interogare primului server de nume din lista serverelor;
• serverul de nume (DNS) determină daca este mandatat (autorizat) pentru
domeniul respectiv (dacă există configurată o zonă DNS care con ține numele
respectiv);
Înregistrarea resurselor –
asociate cu un nume
"Zon
ă

delegat
ă
"
Zon
ă
de autoritate, administrat
ă

de un
name server

Cap 4: Protocoale și servicii
33 • dacă este autorizat, transmite răspunsul clientului;
• dacă nu, transmite o interogare altui server de nume pentru un răspuns autorizat;
obține răspunsul autorizat și transmite clientului un răspuns neautorizat; totodată
stochează răspunsul local pentru a răspunde la alte cereri pentru același nume.
• resolverul de nume transmite răspunsul aplicației utilizator și îl păstrează într -un
cache pentru o anumită perioadă;
• dacă name resolverul nu primește un răspuns într -un anumit timp , transmite
cererea următorului server de nume din listă. Când lista este epuizată, va genera o
eroare.

DNS -ul foloseste în special protocolul UDP, port 53, pentru a deservi cererile.
Majoritatea tranzacțiilor DNS constau într -o cerere UDP de la client, urmată de un
răspuns de la server. RFC1034 și RFC1035 definesc următoarele tipuri de înregistrări
manipulate de sistemul DNS:
• înregistrarea A (adresă) asociază o adresă IP unui nume;
• înregistrarea AAAA este echivalentă cu înregistrarea A, dar se aplică protocolului
IPv6;
• înregistrarea CNAME este un pseudonim pentru un domeniu, care permite
coexistența a mai multor nume pentru o mașină, astfel încât să poată fi descrisă
mai bine existența anumitor servicii. De exemplu ftp, www, mail pot fi CNAME –
uri pent ru mașina test.exemplu.com ;
• înregistrare MX (mail exchanger) – definește numele serverelor de mail care
acceptă mail pentru un anumit domeniu. Înregistrările MX au asociată o prioritate,
sub formă numerică, prioritatea cea mai mică, ca valoare, indicând serverul de
mail principal;
• înregistrarea PTR asociază un nume de mașină unei adrese IP, fiind folosită în
special de serverele de mail (rezolvarea inversă);
• înregistrarea NS indică numele serverelor DNS care sunt autoritare pentru o zonă
sau domeniu. Ac este înregistrări trebuie să conțină numele canonice ale mașinii
(numele canonic este cel indicat printr -o înregistrare A și care apare și în
înregistrarea PTR);
• înregistrarea SOA (start of authority) indică, în primul rând, serverul DNS master
pentru o a numită zonă, precum și alte informații, cum ar fi, de exemplu,TTL -ul
(time to live – timpul maxim cât poate fi păstrat răspunsul DNS de către serverele
cache);
• înregistrarea TXT permite administratorului sa insereze informații suplimentare
intr-o inregist rare DNS.

4.1.2. Instalarea și configurarea serverului BIND
BIND (Berkeley Internet Name Domain) este cea mai cunoscută implementare
DNS în lumea Open Source. Serverul BIND, ajuns la versiunea majoră 9, este compus
dintr -un daemon (serviciu Unix), numi t named , care este serverul propriu -zis, și două
biblioteci de rezolvare, liblwres și libbind.
Sistemul de operare FreeBSD vine preinstalat cu serverul BIND, el trebuind
activat. Activarea servciului DNS se face adăugând în fișierul de configurare rc.conf linia

Sisteme Informatice de Asistare a Deciziei
34 named_enable=”YES”

Configurarea serverului BIND se face în mai mulți pași:
 se editează fișierul /var/named/etc/namedb/named.conf
 se editează fișierele – zonă
 se pornește efectiv serverul și se testează, corectând eventualele erori

4.2. Remote Login (SSH, Telnet) – SSH
În computing, Secure Shell sau SSH este un set de protocoale de internet standard
și asociate care permite stabilirea unui canal sigur între un computer local și unul controlat
de la distanța (remote). Este folosită cripto grafie public -key pentru a autentifica
computerul controlat și (opțional) să permită computerului controlat să autentifice
utilizatorul . SSH asigură confidențialitatea și integritatea datelor schimbate între cele
două computere prin folosirea encriptării și a codurilor de autentificare a mesajelor
(MACs). SSH este de obicei folosit pentru conectarea de la distanță și executarea de
comenzi pe acel computer, dar suportă de asemeni tunneling, trimiterea către porturi TCP
arbitrare și conexiuni X11; poate face transfer de fișiere folosind protocoalele asociate
SFTP sau SCP.
Un server SSH, implicit, ascultă pe portul standard TCP 22 . Informații
suplimentare în http://en.wikipedia.org/wiki/Secure_Shel l. Un program ssh client este
folosit de obicei pentru stabilirea unei conexiuni cu un sshd daemon care acceptă
conexiuni remote. Ambele (clientul si serverul) sunt prezente pe majoritatea siste melor
de operare moderne, inclusiv Mac OS, Linux, Solaris și OpenVMS.
Istoric
În 1995 a fost proiectată prima versiune a acestui protocol, numit în prezent SSH –
1. Scopul acestuia a fost înlocuirea lui rlogin, TELNET și rsh, care nu oferă o autentificare
puternică sau garantarea confidențialității.
În 1996 apare o versiune revizuită a protocolului, SSH -2, incompatibilă cu SSH1.
Noile facilități ale lui SSH -2 sunt: abilitatea de a rula oricâte sesiuni shell pe o singură
conexiune SSH, o securitate mai bu nă – vine cu algoritmul Diffie -Hellman de schimbare
a cheilor și o verificare a integrității via MAC.
În 1999 a apărut OpenSSH, implementat în versiunea 2.6 a Open BSD. De la
această versiune s -a încercat portabilitatea lui OpenSSH către alte sisteme de o perare.
Astfel, în 2005, OpenSSH este cea mai populară implementare ssh, fiind inclus
într-un număr mare de sisteme de operare.
4.2.1. Arhitectura lui SSH
În figura 4.2 se prezintă diagrama pachetului ssh -2.
Protocolul SSH -2 are o arhitectură internă c lară (definită în RFC -4251) cu straturi
bine separate. Acestea sunt:
• stratul Transport – acest strat se ocupă cu schimbul inițial al cheii și
autentificarea serverului și stabilește criptarea, compresia și verificarea
integrității. El expune către starul superior o interfață pentru trimiterea și recepția
pachetelor plaintext de peste 32.768 bytes fiecare. De asemenea, stratul transport

Cap 4: Protocoale și servicii
35 pregătește re -negocierea cheii, de obicei după transferarea a 1 GB de date sau
după 1 oră de la inițierea conexiunii;

Inițial necomprimat, apoi opțional comprimat
în conformitate cu
schema de comprimare negociată
negociate (în general aes128 -cbc)
Fig. 4.2: Arhitectura pachetului
SSH-2

• stratul Autentificarea utilizatorului – se ocupă cu autentificarea clientului ș i
oferă un număr de metode de autentificare. Autentificarea este dictată de client,
un fapt de obicei neînțeles de utilizatori; când este cerută/sugerată o parolă, este
cerută/sugerată clientului SSH nu serverului. Serverul pur și simplu răspunde
cererii c lientului de autentificare. Metodele de autentificare a utilizatorului includ
următoarele:
pachet_length
uint32
padding_length
b
yte
payload
byte
pachet_length) –
(
)
padding_length
(

-1
(
în general zlib)
Sire de date: ini
ț
ial necriptat, apoi
obligatoriu criptate în conformitate
cu algoritmul
ș
i cheia de criptare
Cel pu
ț
in 4 bi
ț
i
aleatorii de umplutur
ă

by
te
umplutur
ă
de lungime
aleatorie
Ini
ț
ial nefunc
ț
ional,
apoi implementat în
concordan
ță
cu
algoritmul
ș
i cheia
negociate
negociere secret
ă
cu
algoritmul "mac"
calculare fol osind o
cheie public
ă
,
num
ă
rul de secven
ță

al pachetului
ș
i
con
ț
inutul pachetului
Codul mesajului
autentificat

byte

mac_length

Sisteme Informatice de Asistare a Deciziei
36 o "password" – o metodă pentru o autentificare directă parolată, incluzând
facilitatea ce permite schimbarea parolei. Aceast metodă nu este
implementată de toate prog ramele;
o "publickey" – o metodă pentru o autentificare bazată pe cheie publică, de
obicei suportată cel puțin de perechea DSA sau RDA;
o " keyboard -interactive " – o metodă versatilă în care serverul trimite una
sau mai multe prompt -uri pentru a introduce i nformații și clientul le
afișează și trimite răspunsul înapoi. Folosite pentru a oferi autentificarea
printr -o singură parolă cum ar fi S/Key sau SecurID.
• stratul Connection (RFC 4254) – definește conceptul canalelor, cererii canal și
cererii globale fol osind serviciul SSH care este disponibil. O singură conexiune
SSH poate găzdui simultan multiple canale, fiecare canal transferând date în
ambele direcții. Cererea canal este folosită pentru a schimba date specifice din
afara canalului, cum ar fi: modifica rea mărimii ferestrei terminalului sau codul de
ieșire a proceselor in partea serverului. Clientul SSH cere un port pe partea
serverului pentru a fi expediat folosind o cerere globală. Tipurile standard de
canale includ:
o "shell" pentru terminale shell, SF TP și cereri de execuție (inclusiv
transferuri SCP);
o "direct -tcpip" pentru expedierea conexiunilor client către server; o
"forwarded -tcpip" pentru expedierea conexiunilor server către client;

Această arhitectură deschisă (open) oferă o flexibilitate co nsiderabilă, permițând
SSH să fie folosit pentru a varietate de scopuri peste un shell3 securizat. Funcționalitatea
stratului transport este compatibilă cu TLS; stratul autentificare user este extrem de
extensibil cu metode de autentificare particulare, și stratul conexiune oferă abilitatea de a
multiplexa mai multe sesiuni secundare într -o singură conexiune SSH.

Securitatea SSH
În toate versiunile de SSH, este importantă verificarea cheilor publice necunoscute
înainte de a le accepta ca valide. Accepta rea unei chei publice de la un atacator drept chei
publica validă are efectul dezvăluirii parolei transmise și permite celui care o află să atace.
Ac orice protocol criptat, SSH poate fi considerat cu risc de securitate de către
companiile care nu au încr edere în proprii utilizatori și care doresc sp tragă cu urechea la
propriile comunicații. În plus, SSH are integrat facilități de tunelare care în fac mai ușor
pentru utilizatori să obțină pasaje a unor volume mari de informații sau să stabilească
puncte d e intrare pentru acces intern neautorizat peste legături SSH față de alte
protocoale.

4.3. HTTP – protocolul http
HTTP (Hypertext Transfer Protocol) este metoda cea mai des utilizată pentru
accesarea informațiilor în Internet care sunt păstrate pe serv ere WWW (World Wide
Web). Protocolul HTTP este un protocol de tip text, fiind protocolul "implicit" al WWW.

3 Shell – o piesă software care oferă o interfață utilizator.

Cap 4: Protocoale și servicii
37 Adică, dacă un URL nu conține partea de protocol, aceasta se consideră ca fiind http.
Acesta presupune rularea unui program corespunzător pe calcula torul destinație care
înțelege protocolul respectiv. Fișierul destinație poate fi un document HTML (HyperText
Markup Language), un fișier grafic, de sunet, de animație, un program executabil pe
server -ul respectiv sau un editor de texte. După clasificarea în funcție de modelele de
referință OSI, protocolul HTTP este un protocol de nivel aplicație. Dezvoltarea sa este
coordonată de W3C (World Wide Web Consortium).
4.3.1. Modul de funcționare
HTTP are o tehnică de comunicare prin care pagini web se pot tran smite dela un
Computer aflat la distanță spre propiul Computer. Dacă se apelează un link sau adresă de
web ca http://www.example.com se cere calculatorului host să afișeze o pagină web (
index.html sau altele ). Numele www.example.com vine în primă fază co nvertit de
protocolul DNS într -o adresă IP. Urmează transferul prin protocolul TCP pe portul
standard 80 a serverului HTTP răspunsul la cererea HTTP -GET. Informații suplimentare
ca indicații pentru Browser, limba dorită, e.t.c. se pot adăuga în header -ul ( antetul )
pachetului HTTP. În urma cererii HTTP -GET urmează din partea serverului răspunsul cu
datele cerute ca : pagini în (X)HTML, cu fișiere atașate ca imagini, fișiere de stil ( CSS ),
scripturi ( Javascript ), dar pot fi și pagini generate dinamic (S SI, JSP, PHP și ASP.NET).
Serverul trimite înapoi un mesaj de eroare, dacă informațiile nu pot fi trimise dintrun
anumit motiv. Modul exact de desfășurare aacestei acțiuni ( cerere și răspuns ) este stabilit
în specificațiile HTTP.
4.3.2. Transferul argum entelor
Deseori dorește un utilizator să transmită informații speciale la website. Aici pune
la dispoziție HTTP două posibilități :
1. Transferul datelor în combinație cu o cerere după o resursă (HTTP -metoda "GET")
2. Transferul datelor în combinație cu o cer ere specială (HTTP -metoda "POST")

Datele transferate vin deseori codate.
La metoda GET se utilizează partea de cerere Uniform Resource Identifiers cu
semnul ?.
Această metodă se utilizează, pentru a transfera o listă de parametrii, pe care partea
opus ă trebuie să o ia în considerare la prelucrarea cererii.
Deseori această listă cuprinde perechi de valori separate prin semnul &, care sunt
alcătuite din numele parametrului, semnul = și valoarea parametrului. Rareori vine utilizat
semnul ; pentru separar ea înregistrărilor listei [1].

Exemplu: la pagina de start de la wikipedia se introduce în câmpul de căutare termenul
‘‘pisici‘‘, se alege categoria articole și se apasă butonul de căutare.

Browserul trimite atunci următoarea cerere la server :
GET /wiki/Spezial:Search?search=Katzen&go=Artikel HTTP/1.1 Host:
de.wikipedia.org …

Sisteme Informatice de Asistare a Deciziei
38 Serverului Wikipedia vin transmise două perechi de valori : Argument Valoare
search pisici go articol
Perechile de valori se transmit sub forma
Argument1=valoare1&Argume nt2=valoare2
iar cu ? se atașează pagina. Astfel ’’știe’’ serverul că utilizatorul dorește să vadă
articole despre pisici.
Serverul prelucrează cererea, dar nu trimite un fișier ci redirectează browserul cu
un Location -Header spre pagina dorită :
HTTP/ 1.0 302 Moved Temporarily Date: Fri, 13 Jan 2006 15:12:44 GMT
Location: http://de.wikipedia.org/wiki/Katzen … Browserul ascultă indicația și emite pe
baza noilor informații o nouă cerere : GET /wiki/Katzen HTTP/1.1 Host:
de.wikipedia.org … Serverul răs punde și oferă pagina cu articole despre pisici :
HTTP/1.0 200 OK Date: Fri, 13 Jan 2006 15:12:48 GMT Last -Modified: Tue,
10 Jan 2006 11:18:20 GMT Content -Language: de Content -Encoding: gzip Content –
Type: text/html; charset=utf -8
.‹……..´ZKs.¹.>Û¿.ž -[¶KÃ!õ²ÌÇlô²¬¬ìuVò*ÉÖ –3.r`Î+.F”xÊ!ÿ
×.ý.ö´7ý“ü’t.ó"9ÔʛĮ.A.ÐÝ

Partea de date este mai lungă și de necitit din cauza compresiei gzip.

În cazul unei cereri POST variabilele nu se află în URI, ci în partea body :
POST /wiki/Spezial:Search HTTP/1.1 H ost: de.wikipedia.org Content -Type:
application/x -www -form -urlencoded Content -Length: 24

search=Katzen&go=Artikel Serverul răspunde astfel : HTTP/1.0 302 Moved
Temporarily Date: Fri, 13 Jan 2006 15:32:43 GMT Location:
http://de.wikipedia.org/w iki/Katzen

4.3.3. Versiuni
HTTP/0.9 – prima versiune dezvoltată de Tim Berners -Lee și echipa sa, fiind
foarte simplu, dar cu numeroase neajunsuri, fiind repede înlocuit de alte versiuni;
HTTP/1.0 – versiune introdusă în 1996 prin RFC1945, a adus numer oase
îmbunătățiri;
HTTP/1.1 – versiune de îmbunătățire și reparare a neajunsurilor versiunii
anterioare;

În prezent se utilizează două versiuni ale protocolului, HTTP/1.0 și HTTP/1.1. La
versiunea HTTP/1.0 se stabilește o nouă conexiune TCP înaintea c ererii, iar după
transmiterea răspunsului conexiunea vine închisă. Astfel dacă un document HTML
cuprinde 10 imagini, vor fi necesare 11 conexiuni TCP, pentru ca pagina să fie afișată în
Browser. La versiunea 1.1 se pot emite mai multe cereri și răspunsuri pe o conexiune
TCP. Astfel pentru documentul HTML cu 10 imagini este necesar doar o conexiune TCP.
Deoarece viteza conexiunii TCP este la început mică datorită algoritmului SlowStart, se
scurtează semnificativ durata de încărcare a paginii. La aceasta se a daugă faptul că
versiunea 1.1 poate continua transferuri întrerupte. La HTTP se pierd informațiile

Cap 4: Protocoale și servicii
39 cererilor vechi ( deci este un protocol fără reținerea stării ). Prin utilizarea de cooki -uri în
header, se pot realiza aplicații, care pot utiliza informați i de stare ( alegerile utilizatorului,
coș de cumpărături ). Chiar și o recunoaștere a utilizatorului este astfel posibilă. În mod
normal se pot citi informațiile transmise care parcurg rețeaua pe computere și rutere. Prin
HTTPS transferul se poate cripta.

Noua versiune se poate utiliza in chat -uri prin utilizarea MIME -tip-ului
multipart/replace care reînoiește complet conținutul ferestrei browser -ului. Noua versiune
permite pe lăngă preluarea datelor și transmiterea de date la server. Cu ajutorul metode i
PUT pot webdesignerii să -și publice paginile web pe webserver prin WebDAV, iar prin
metoda DELETE chiar și șterge de pe server. De asemenea oferă HTTP/1.1 o metodă
TRACE, prin care se poate urmării calea spre webserver, și astfel să se verifice dacă date le
au fost corect transferate. Astfel se poate urmării calea prin diferite proxi -uri spre
webserver, un traceroute la nivel aplicație.
4.3.4. Metode
Metodele disponibile sunt :
• GET : este cea mai folosită metodă, fiind utilizată atunci când este cerută o resursă
serverului.
• HEAD : se comportă exact ca metoda GET, dar serverul returnează doar antetul
resursei, ceea ce permite clientului să inspecteze antetul resursei fară a fi nevoit
să ia și corpul resursei.
• PUT : metoda este folosită pentru a pune do cumente pe server, fiind inversul
metodei GET.
• POST : a fost proiectată pentru a trimite date de intrare către server.
• DELETE : este opusul metodei PUT.
• TRACE : este o metodă folosită de obicei pentru diagnosticare, putând da mai
multe informații despre traseul urmat de legătura HTTP, fiecare server proxy
adăugându -și semnătura în antetul Via.
• OPTIONS : este folosită pentru identificarea capacităților serverului Web, înainte
de a face o cerere.
• CONNECT : este o metodă folosită în general de serverele i ntermediare.

Exemplu

Cererea clientului :
GET / HTTP/1.1
Host: www.example.com

Răspunsul serverului:
HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Server: Apache/1.3.27 (Unix) (Red -Hat/Linux)
Last-Modified: Wed, 08 Jan 2003 23:11:55 G MT
Etag: "3f80f -1b6-3e1cb03b"
Accept -Ranges: bytes

Sisteme Informatice de Asistare a Deciziei
40 Content -Length: 438
Connection: close
Content -Type: text/html
4.3.5. Serverul Web Apache
Apache este un server HTTP de tip open -source. Apache a jucat un rol important
în dezvoltarea Web -ului, fiin d folosit în prezent în 50% din paginile web.

Instalare Apache, MySQL și PHP în Windows
În continuare se prezintă pașii necesari instalării celor trei pachete gratuite și open –
source: apache, MySQL și php pe un sistem de operare Windows. Pentru exemplificare
se folosesc:
• Sistem de operare: Windows XP Professional (SP2);
• Server web: Apache 2.2.2;
• Server baze de date: MySQL 5.0.22;
• Interpretor: PHP 5.1.4
4.3.5.1. Instalare Apache 2.2.2
Mai întâi se obțin binarele serverului: apache_2.2.2 -win32 -x86-no_ssl.msi
(aproximativ 4,2 MB) de pe http://httpd.apache.org/ , secțiunea download.
După ce am descărcat kit -ul, începem instalarea, executând dublu -clik pe
executabil (dacă în sistem există deja o versiune mai veche a serverului, aceasta
trebuie dezinstalată în prealabil).
Urmează Next apoi citim (eventual și suntem de acord cu) termenii și condițiile
după care Next din nou. Citim și instrucțiunile de folosire și iar Next.
Am ajuns la informațiile despre server, un de completam astfel:
• Network Domain (e.g. somenet.com): localhost
• Server Name (e.g. www.somenet.com ): localhost
• Administrator's Email Address (e.g. webmaster@somen et.com ):
tu@domeniu.ro
iar mai jos, in aceea și fereastra, bifăm

for All Users, on port 80, as a Service – Recommended

Cap 4: Protocoale și servicii
41
Astfel, serverul Apache se va instala ca serviciu, va porni automat odată cu
Windows -ul si va fi disponibil pentru toți utilizatorii sistemului.
În continuare Next. Ne într eabă de tipul instalării, bifăm Typical și apăsăm Next.
În continuare, suntem informați că Apache se va instala în C: \Program Files \Apache
Software Foundation \Apache 2.2 \. Totul e ok și aici, îi dam Next și Install
Installerul și -a făcut treaba, apăsăm Fi nish și am terminat cu instalarea serverului
Apache în Windows (vom reveni mai târziu asupra configurării acestuia). Dacă totul a
decurs în regula, veți observa că a apărut o iconița nou în System Tray (în dreapta jos,
unde este și ceasul).
4.3.5.2. Insta lare MySQL 5.0
Obținem binarele serverului: http://dev.mysql.com/downloads/mysql/5.0.html
(aproximativ 36,7 MB)
Deschide arhiva (implicit, Windows -ul știe să deschidă arhive .zip) și, ca de
obicei, dublu -click pe executabilul din interior (Setup.exe) ( Daca în sistem există deja
instalată o versiune mai veche de MySQL, trebuie dezinstalată. De notat este că după
dezinstalare, fișierele bazelor de date create cu versiunea veche se păstrează (C: \Program
Files \MySQL \MySQL Server 5.0 \data) și se vor putea re folosi în noua versiune.).
În continuare Next, iar apoi alegem Typical la tipul instalării și Next din nou.
Mai departe, ne este prezentat rezumatul instalării. Apăsăm Install
Mergând mai departe, ne este prezentată o fereastră in care este prezentă o b ifă cu
Configure the MySQL Server now
O bifăm și apăsăm Finish, pentru a continua cu configurarea serverului MySQL.
Se va deschide utilitarul de configurare al serverului, în care apăsăm Next, în
următoarea fereastră bifăm Standard Configuration și, bin eînțeles, Next.

Sisteme Informatice de Asistare a Deciziei
42 În continuare, bifam Install As Windows Service pentru ca serverul să se
instaleze ca serviciu și să pornească de fiecare dată când pornește Windowsul. Apăsăm
Next.
Ne sunt prezentate două câmpuri, în ambele introducem aceeași parolă, a u serului
root. Parola o vom folosi ulterior pentru a ne conecta la serverul MySQL. Apăsăm Next.
Următoarea fereastră ne prezintă pașii ce vor fi executați pentru configurarea serverului.
Apăsăm Execute iar apoi Finish
4.3.6. Instalare PHP 5.1.4
Obținem bi narele interpretorului: PHP 5.1.4 zip package (aproximativ 8,9 MB)
precum și colecția de extensii pentru acesta, Collection of PECL modules for PHP 5.1.4
(aproximativ 2,2 MB)
Dezarhivăm conținutul arhivei php -5.1.4 -Win32.zip în directorul c: \php\ iar
conținutul arhivei pecl -5.1.4 -Win32.zip în directorul c: \php\ext\, proaspăt creat anterior
Următorul pas este copierea fișierelor c:\php\php5apache2.dll ,
c:\php\dev\php5ts.lib și c:\php\php5ts.dll în directoarele c: \windows,
c:\windows \system și c: \windows \system32. Se recomandă și copierea fișierelor din
c:\php\ext în directoarele menționate anterior.
În continuare, cream fișierul de inițializare al PHP -ului. Astfel, copiem fișierul
php.ini -recommmended în directorul c: \windows \php.ini, urmând ca pe viitor s ă se
editeze acest fișier pentru a activa/dezactiva/modifica diverse opțiuni ale PHP -ului.

Acestea fiind zise, s -a terminat cu instalarea PHP -ului. Acum trebuie să se
modifice fișierul de configurare al serverului Apache, pentru ca acesta să știe să ser vească
scripturile PHP. Deschidem fișierul C: \Program Files \Apache Software
Foundation \Apache2.2 \conf\httpd.conf cu un editor text (Notepad, de exemplu) și se
modifică astfel ("…" reprezintă rânduri care pot fi ignorate):

ServerRoot "C:/Program Files /Apache Software Foundation/Apache2.2"

LoadModule php5_module "c:/php/php5apache2.dll"

DocumentRoot "C:/calea/catre/fisierele/siteurilor/tale"

<Directory "C:/calea/catre/fisierele/siteurilor/tale">

<IfModule dir_module>
DirectoryIn dex index.php index.html
</IfModule>

<IfModule mime_module>
….
AddType application/x -httpd -php .php

</IfModule>

Cap 4: Protocoale și servicii
43 Acestea fiind zise, se restarteaz ă sistemul și gata, avem un server web sub
Windows. Pentru a verifica dacă totul e in regulă, se creează un fișier test.php în directorul
C:/calea/catre/fisierele/siteurilor/tale

<?php phpinfo();
?>

și se accesează în browser http://localhost/test. php sau http://127.0.0.1/test.php

4.4. FTP – Protocolul FTP
4.4.1. Instalarea și configurarea unui server FTP
Drept server ftp, am optat pentru pachetul pure-ftpd (http://www.pureftpd.org/ ) ,
fiind o implementare stabilă, conformă cu standardele, bine securizată. Această distribuție
a fost aleasă deoarece oferă un foarte bun suport pentru utilizatori virtuali, având
posibilitatea f olosirii chiar și a bazelor de date (MySQL, PostgreSQL).
Pachetul se poate instala fie din colecția de porturi (/usr/ports/ftp/pure -ftpd) sau
cu ajutorul utilitarului pkg_add (figura 4.3).

Fig. 4.3. Instalare pure -ftpd cu pkg_add
În ambele cazuri, d upă instalare, trebuie editat manual fișierul de configurare al
serviciului, activat să pornească automat odata cu pornirea sistemului de operare și lansat
în execuție.
Fișierul de configurare, pure -ftpd.conf, trebuie amplasat în directorul
/usr/local/et c (figura 4.4)

Sisteme Informatice de Asistare a Deciziei
44
Fig.4.4: pure-ftpd.conf
Structura fișierului pure -ftpd.conf este prezentată în anexe. Important de
menționat este faptul că serverul a fost configurat să nu permită accesul anonim,
utilizatorul fiind blocat în directorul său (chroot), evidența utilizatorilor fiind păstrată în
sistemul nativ de baze de date, puredb .
Pentru a se putea crea utilizatori virtuali, în sistemul de operare trebuie creat un
cont de utilizator, care să nu aibă posibilitate de login și director home. Acest utiliz ator
real este necesar deoarece, după autentificarea prin protocolul ftp, utilizatorul virtual va
fi impersonalizat (va primi identitatea) acestui utilizator real.
În liniile de mai jos este prezentată secvența de comenzi pentru crearea
utilizatorului de sistem și a unui utilizator virtual.
ns1# adduser
Username: ftp
Full name: FTP Virtual user
Uid (Leave empty for default):
Login group [ftp]:
Login group is ftp. Invite ftp into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [sh ]: nologin
Home directory [/home/ftp]: /dev/null Use
password -based authentication? [yes]: no
Lock out the account after creation? [no]:
Username : ftp
Password : <disabled>
Full Name : FTP Virtual user
Uid : 1005
Class :
Groups : ftp
Home : /dev/null
Shell : /usr/sbin/nologin

Cap 4: Protocoale și servicii
45 Locked : no OK? (yes/no): yes adduser: INFO:
Successfully added (ftp) to the user database. Add another
user? (yes/no): no
Goodbye!
ns1# pure -pw useradd admin -u ftp -g ftp -d /usr/local/ ftp
Password: Enter it again:
ns1# pure -pw mkdb ns1# cd
/usr/local/etc/rc.d/ ns1#
./pure-ftpd forcestart
Starting pureftpd.
Running: /usr/local/sbin/pure -ftpd -A -c50 -B -C8 -D -E -fftp -H
-I15 -lpuredb:/usr/local/etc/pureftpd.pdb -L2000:8 -m4 -s -U133:022 u100
-k99 –Z ns1# mkdir /usr/local/ftp
ns1# chown -R ftp:ftp /usr/local/ftp/

În liniile de mai sus se remarc ă necesitatea creării unui director pentru utilizatorul
virtual, în cazul de față /usr/local/ftp.
4.5. SMTP – protocolul SMTP
SMTP (Simple Mail Transfer Protocol) este un protocol simplu, folosit pentru
transmiterea mesajelor în format electronic pe Inte rnet. SMTP folosește portul de
aplicație 25 TCP și determină adresa unui server SMTP pe baza înregistrării MX (Mail
eXchange) din configurația serverului DNS.
Protocolul SMTP specifică modul în care mesajele de poștă electronică sunt
transferate între pro cese SMTP aflate pe sisteme diferite. Procesul SMTP care are de
transmis un mesaj este numit client SMTP iar procesul SMTP care primește mesajul este
serverul SMTP. Protocolul nu se referă la modul în care mesajul ce trebuie transmis este
trecut de la util izator către clientul SMTP, sau cum mesajul recepționat de serverul SMTP
este livrat utilizatorului destinatar și nici cum este memorat mesajul sau de câte ori
clientul SMTP încearcă să transmită mesajul.
SMTP a început să fie folosit mai des la începutul anilor ‘80. La acea vreme era
mai puțin folosit decât UUCP (Unix to Unix CoPy), care era mai potrivit pentru
transmiterea emailurilor între mașini ce nu erau conectate permanent. SMTP însă
funcționează mai bine când atât expeditorul cât și destinatarul me sajului sunt legați în
rețea tot timpul. Sendmail a fost unul din primele programe care au implementat acest
protocol. Din 2001 au apărut încă cel puțin 50 de programe care implementează SMTP
(atât servere cât și clienți). Printre cele mai cunoscute server e SMTP amintim Postfix,
qmail, Novell GroupWise,Exim, Novell NetMail și Microsoft Exchange Server.
4.5.1. Funcționare
Comunicarea între client și server se realizează prin texte ASCII. Inițial clientul
stabilește conexiunea către server și așteaptă ca se rverul să -i răspundă cu mesajul “220
Service Ready” . Dacă serverul e supraîncărcat, poate să întârzie cu trimiterea acestui
răspuns. După primirea mesajului cu codul 220, clientul trimite comanda HELO prin care
își va indica identitatea. În unele sisteme mai vechi se trimite comanda EHLO, comanda
EHLO indicând faptul că expeditorul mesajului poate să proceseze extensiile serviciului
și dorește să primească o listă cu extensiile pe care le suportă serverul. Dacă clientul

Sisteme Informatice de Asistare a Deciziei
46 trimite EHLO iar serverul îi răspund e că aceasta comandă nu e recunoscută, clientul va
avea posibilitatea să revină și să trimită HELO.
Odată ce comunicarea a fost stabilită, clientul poate trimite unul sau mai multe
mesaje, poate încheia conexiunea sau poate folosi unele servicii precum ve rificarea
adreselor de email. Serverul trebuie să răspundă după fiecare comandă indicând astfel
dacă aceasta a fost acceptată, dacă se mai așteaptă comenzi sau dacă există erori în
scrierea acestor comenzi.
Pentru a trimite un mesaj se folosește comanda M AIL prin care se specifică adresa
clientului. Dacă această comandă este corecta serverul va răspunde cu mesajul “250 OK”.
Clientul trimite apoi o serie de comenzi RCPT prin care specifică destinatarii mesajului.
Serverul va răspunde cu “550 No such user he re”, sau “250 OK”, în funcție de
corectitudinea comenzii primite. După ce se specifică destinatarii, și serverul acceptă
comenzile, se trimite comanda DATA, prin care serverul e anunțat că expeditorul va
începe să scrie conținutul mesajului. Serverul poate răspunde cu mesajul "503 Command
out of sequence" sau "554 No valid recipients" dacă nu a primit comenzile MAIL sau
RCPT sau aceste comenzi nu au fost acceptate. Dacă serverul va răspunde cu mesajul
“354 Start mail input”, clientul va putea introduce text ul mesajului. Sfârșitul mesajului e
marcat cu <CR><LF>.<CR><LF>.

Un server SMTP trebuie să cunoască cel puțin următoarele comenzi :
• HELO – identificare computer expeditor;
• EHLO – identificare computer expeditor cu cerere de mod extins;
• MAIL FROM – specificare expeditorului;
• RCPT TO – specificarea destinatarului ;
• DATA – conținutul mesajului;
• RSET – Reset;
• QUIT – termină sesiunea;
• HELP – ajutor pentru comenzi;
• VRFY – verifică o adresă; • EXPN – expandează o adresă;
• VERB – informații detaliate.
4.5.2. Realizarea comunicației SMTP – exemplu
Funcționarea protocolului SMTP poate fi testată simplu prin inițierea unei
conexiuni TCP folosind un client de telnet.
telnet mailhost.domeniu.ro 25
Server: 220 mailhost.domeniu.ro ESMTP
Client: HELO host.d omeniu.ro
Server: 250 Hello host.domeniu.ro
Client: MAIL FROM: user@domeniu.ro
Server: 250 Ok
Client: RCPT TO: user@altdomeniu.ro
Server: 250 Ok
Client: DATA
Server: 354 End data with <CR><LF>.<CR><LF>
Client: Subject: test

Cap 4: Protocoale și servicii
47 Client: un mesaj test C lient:
.
Server: Mail queued for delivery.
Client: QUIT
Server: 221 Closing connection. Bye.
4.6. POP – protocolul POP
POP3 sau Protocolul Post Office – Versiunea 3 este, al ături de IMAP, unul din
protocoalele utilizate de un calculator gazdă pentru recepționarea poștei electronice
(email).
Cu siguranță, tipurile nodurilor mai mici în Internet deseori nu sunt practice să
întrețină un sistem de transport al mesajului (MTS). D e exemplu, o stație de lucru este
posibil să nu dispună de suficiente resurse (spațiu pe disc) cu scopul de a permite un
server SMTP RFC 821 și asociază un sistem local de trimitere mail pentru a fi ținut
rezident și să ruleze continuu. Similar, poate deve ni costisitor (sau imposibil) să menții
un computer interconectat la un IP -style rețea pentru o perioadă mai mare de timp (nodul
duce lipsă de resursa cunoscută ca “conectivitate”). În ciuda acestora, deseori este foarte
util să deservești poșta acestor no duri mai mici și deseori sprijină un utilizator agent (UA)
să ajute la manipularea poștei electronice. Pentru a rezolva această problemă, un nod care
întreține o entitate MTS oferă un serviciu maildrop pentru aceste noduri înzestrate mai
puțin. POP3 a inte nționat să permită unei stații de lucru acces dinamic la maildrop de pe
un server gazdă într -un mod util. De obicei, aceasta înseamnă că protocolul POP3 este
utilizat pentru a permite unei stații de lucru să primească poșta pe care serverul o
stochează. PO P3 nu a intenționat să furnizeze operații extinse de manipulare a poștei de
pe server; normal poșta este descărcată de pe server și apoi ștearsă. Un protocol mai
avansat (și mai complex), IMAP4, a fost discutat în RFC 1730. În continuare, termenul
“client gazdă” (client host) se referă la o gazdă ce utilizează serviciul POP3, cât timp
termenul “server gazdă” (server host) se referă la o gazdă care oferă serviciul POP3.
4.6.1. Operația de bază
Inițial, serverul pornește serviciul POP3 ascultând TCP portul 110. Când clientul
dorește să utilizeze serviciul, este stabilită o conexiune TCP cu serverul. Când conexiunea
s-a realizat, serverul POP3 trimite un salut. Clientul și serverul POP3 schimbă comenzi
și răspunsuri până când conexiunea este închisă sau aband onată. Comenzile în POP3 sunt
formate din caractere (modul insenzitiv), posibil să fie urmate de unul sau mai multe
argumente. Toate comenzile sunt terminate prin perechea CRLF ( \r\n). Șirul de caractere
ce formează comanda și argumentele sunt caractere AS CII. Comenzile și argumentele
sunt separate printr -un singur caracter SPACE. Comenzile au lungimea de 3 sau 4
caractere. Fiecare argument poate avea lungimea până la maxim 40 de caractere.
Răspunsurile în POP3 constau dintr -un indicator de status și o coma ndă, posibil urmată
de informații adiționale. Toate răspunsurile sunt terminate prin perechea CRLF.
Răspunsurile pot fi de lungime de până la 512 caractere, incluzând și CRLF. În mod
curent, sunt doi indicatori de status: pozitiv (“+OK”) și negativ (“ -ERR” ). Serverul
trebuie să trimită “+OK” și “ -ERR” scrise cu litere mari (upper case). Răspunsurile la
comenzi sunt multi -linie. În aceste cazuri, care sunt clar indicate mai jos, după trimiterea
primei linii a răspunsului și a perechii CRLF, orice linie adiți onală este trimisă și fiecare

Sisteme Informatice de Asistare a Deciziei
48 linie se termină cu perechea CRLF. Când toate liniile răspunsului au fost trimise, este
trimisă o linie finală, care formează un octet terminal (cod zecimal 046, “.”) și perechea
CRLF. Dacă orice linie a răspunsului multi -linie începe cu acest octet terminal, linia este
completată cu octeți terminali. Deci, un răspuns multi -linie se termină cu 5 octeți
“CRLF.CRLF”. Când examinează un răspuns multi -linie, clientul verifică să vadă dacă
linia începe cu octetul terminal. Dacă da ș i ceilalți octeți sunt CRLF, primul octet al liniei
(octetul terminal) este scos. Dacă da și dacă CRLF urmează imediat caracterul terminal,
atunci răspunsul de la serverul POP3 este terminat și linia ce conține “.CRLF” nu este
considerată parte a răspunsul ui multi -linie. O sesiune POP3 evoluează direct printr -un
număr de stări în timpul vieții ei. O dată ce conexiunea TCP a fost deschisă și severul
POP3 a trimis salutul, sesiunea întră în stare de AUTHORIZATION. În această stare,
clientul trebuie să se iden tifice serverului POP3. O dată ce clientul a făcut acest lucru cu
succes, serverul își formează resursele asociate în funcție de maildrop -ul clientului, și
sesiunea întră în starea de TRANSACTION. În această stare, clientul cere acțiuni
serverului POP3. Câ nd clientul a emis comanda QUIT, sesiunea întră în starea de
UPDATE. În această stare, serverul POP3 eliberează orice resursă dobândită în timpul
stării de TRANSACTION și spune “goodbye”. Apoi conexiunea TCP este închisă.
Serverul trebuie să răspundă la o nerecunoaștere, neimplementare sau o comandă invalidă
printr -un indicator de stare negativ. Serverul trebuie să răspundă unei comenzi cerute când
sesiunea este într -o stare incorectă, printrun indicator de stare negativ. Nu există o metodă
generală pentru un client care să distingă un server ce nu are implementată o comandă
opțională, de un server care nu dorește sau nu poate să proceseze o comandă. Un server
POP3 poate avea timp de inactivitate (autologout). Ca timp trebuie să fie cel puțin 10
minute. Prim irea oricărei comenzi de la client în timpul acelui interval, este de ajuns să
reseteze “autologout timer”. Când timpul expiră, sesiunea nu poate intra în starea de
UPDATE – serverul ar trebui să închidă conexiunea TCP fără a șterge nici un mesaj sau
fără a trimite vreun răspuns clientului.
4.6.1.1. Starea AUTHORIZATION
O dată ce conexiunea TCP a fost deschisă de un client POP3, serverul POP3 emite
o linie de salut. Acesta poate fi orice răspuns pozitiv. Un exemplu poate fi:
S: +OK POP3 server ready

Sesiunea POP3 este acum în starea de AUTHORIZATION. Clientul trebuie acum
să se identifice și să se autentifice serverului POP3. Două mecanisme posibile pentru
aceasta sunt descrise în continuare, combinația comenzilor USER și PASS și comanda
APOP. Mecanis me suplimentare de autentificare sunt descrise în RFC 1734. Cât timp
există mai multe mecanisme de autentificare acestea sunt cerute de toate serverele POP3,
un server POP3 trebuie să suporte, bineînțeles, cel puțin unul din aceste mecanisme. O
dată ce ser verul POP3 a fost determinat complet, utilizarea oricărei comenzi de
autentificare a clientului, ar trebui să -i dea acces la maildrop -ul potrivit; serverul POP3
dobândește acces exclusiv pentru blocarea maildrop -ului, fiind necesară prevenirea
modificării și ștergerii mesajelor înainte ca sesiunea să intre în starea UPDATE. Dacă
blocajul este dobândit cu succes, serverul POP3 răspunde cu un indicator de stare pozitiv.
Sesiunea POP3 intră acum în starea TRANSACTION, cu nici un mesaj marcat pentru
ștergere. D acă maildrop -ul nu a putut fi deschis din diferite motive (ex. blocajul nu a putut

Cap 4: Protocoale și servicii
49 fi realizat, clientul nu are acces la maildrop, sau maildrop -ul nu poate fi citit), serverul
POP3 răspunde cu un indicator de stare negativ. (Dacă s -a realizat blocajul și s erverul
POP3 intenționează să răspundă cu un indicator de stare negativ, atunci el trebuie să se
deblocheze înainte de respingerea comenzii). După returnarea negativă a indicatorului de
stare, serverul poate închide conexiunea. Dacă serverul nu închide con exiunea, clientul
poate emite fie o nouă comandă de autentificare și să pornească din nou, fie poate emite
comanda QUIT. După ce serverul POP3 a deschis maildrop -ul, este asociat un număr
fiecărui mesaj și se notează mărimea fiecărui mesaj în octeți. Primu lui mesaj din maildrop
îi este asociat numărul de mesaj “1”, celui de -al doilea “2” și așa mai departe, astfel încât
celui de -al n-lea mesaj îi este asociat numărul de mesaj “n”. În POP3 comenzile și
răspunsurile, toate numerele de mesaje și mărimea mesaje lor sunt exprimate în baza 10
(decimal). Iată un rezumat al comenzii QUIT în starea AUTHORIZATION:
QUIT
Argumente: nici unul
Restricții: nici una
Răspunsuri posibile: +OK
4.6.1.2. Starea TRANSACTION
O dată ce clientul s -a identificat cu succes server ului POP3, și serverul POP3 a
fost blocat și a deschis maildrop -ul corespunzător, sesiunea POP3 este acum în starea de
TRANSACTION. Clientul poate emite în acest moment oricare dintre următoarele
comenzi POP3, în mod repetat. Eventual, clientul emite coman da QUIT și sesiunea POP3
intră în starea de UPDATE.

STAT
Argumente: nici unul
Restricții: Poate fi dată doar în starea TRANSACTION

Comentariu: Serverul POP3 emite un răspuns pozitiv într -o linie care conține
informații pentru maildrop. Această lini e este numită “drop listing” pentru acea căsuță
poștală. Cu scopul de a simplifica analiza, toate serverele POP3 au nevoie să utilizeze un
format sigur pentru “drop listing”. Răspunsul pozitiv constă din “+OK” urmat de un
singur spațiu, numărul de mesaje d in maildrop, un singur spațiu, mărimea maildrop -ului
în octeți. Acest memo nu determină nici o condiție ce urmează după mărimea
maildropului. Implementările minimale ar trebui doar să sfârșească linia de răspuns.
De observat că acele mesaje marcate pentru ștergere nu sunt numărate în total.

Răspunsuri posibile:
+OK nn mm

LIST
LIST [msg]
Argumente: Un număr de mesaj (opțional), care, dacă este prezent, nu poate să se
refere la un mesaj marcat pentru ștergere.
Restricții: Pot fi date doar în starea TRANSACTION

Sisteme Informatice de Asistare a Deciziei
50 Comentariu: Dacă a fost dat un argument, serverul POP3 emite un răspuns pozitiv
cu o linie ce conține informații pentru acel mesaj. Această linie este numită “scan listing”
pentru mesajul respectiv. Dacă nici un argument nu a fost dat, serv erul POP3 emite un
răspuns pozitiv, atunci răspunsul dat este multi -linie. După +OK inițial, pentru fiecare
mesaj din maildrop, serverul POP3 răspunde cu o linie ce conține informații despre acel
mesaj. Această linie mai este numită “scan listing” pentru a cel mesaj. Dacă nu sunt mesaje
în maildrop, atunci serverul POP3 răspunde fără “scan listings” – emite un răspuns pozitiv
urmat de o linie conținând octetul terminal și perechea CRLF. În scopul simplificării
analizei, toate serverele POP3 sunt condiționate să utilizeze un format sigur pentru “scan
listings”. Un “scan listing” conține numărul de mesaj al mesajului, urmat de un singur
spațiu și mărimea exactă a mesajului în octeți. Metode pentru calcularea exactă a mărimii
mesajului sunt descrise în secțiunea Formatul Mesajului. Acest memo nu determină nici
o condiție referitoare la ce urmează după mărimea mesajului în “scan listig”.
Implementările minimale ar trebui să termine acea linie de răspuns cu perechea CRLF.
Implementările mai avansate pot include și alte informații, în urma analizei mesajului.
Notă: Acest memo descurajează puternic implementările ce furnizează informații
suplimentare în “scan listing”. Alte facilitați opționale ce permit clientului să analizeze
mesajele din maildrop sunt discutate mai târziu. De observat că mesajele marcate pentru
ștergere nu sunt listate.

Răspunsuri posibile:
+OK scan listing follows
-ERR no such message

RETR
RETR msg
Argumente: Un număr de mesaj (obligatoriu) ce nu se referă la un mesaj marcat
pentru șterge re.
Restricții: Poate fi dată doar în faza de TRANSACTION
Comentariu: Dacă serverul POP3 emite un răspuns pozitiv, atunci răspunsul dat
este multi -linie. După +OK ințial, serverul POP3 trimite mesajul corespunzator numărului
de mesaj, fiind atent la comp letarea caracterului terminal.

Răspunsuri posibile:
+OK urmat de mesaj
-ERR no such mesaj

DELE
DELE msg
Argumente: Un număr de mesaj (obligatoriu) care nu poate să se refere la un mesaj
marcat pentru ștergere.
Restricții: Poate fi dată doar în s tarea de TRANSACTION
Comentariu: Serverul POP3 marchează mesajele ca șterse. Orice viitoare referință
la numărul asociat mesajului într -o comandă POP3 generează eroare. Serverul POP3 nu
șterge efectiv mesajul până când sesiunea POP3 nu întră în starea UPD ATE.
Răspunsuri posibile:

Cap 4: Protocoale și servicii
51 +OK message deleted
-ERR no such message

NOOP
Argumente: nici unul
Restricții: Poate fi dată doar în starea TRANSACTION
Comentariu: Serverul POP3 nu face nimic, doar răspunde cu răspunsuri pozitive.
Răspunsuri posibil e: +OK

RSET
Argumente: nici unul
Restricții: Poate fi dată doar în starea TRANSACTION
Comentariu: Orice mesaj marcat de serverul POP3 pentru ștergere este demarcat.
Serverul POP3 răspunde apoi cu un răspuns pozitiv. Răspunsuri
posibile: +OK
4.6.1. 3. Starea UPDATE
Când clientul emite comanda QUIT din starea TRANSACTION, sesiunea POP3
intră în starea UPDATE. (De observat că, dacă clientul emite comanda QUIT din starea
AUTHORIZATION, sesiunea POP3 se termină, dar nu intră în starea UPDATE). Dacă o
sesiune se termină din anumite motive, altele decât emiterea comenzii QUIT, sesiunea
POP3 nu intră în starea UPDATE și nu șterge nici un mesaj din maildrop.

QUIT
Argumente: nici unul
Restricții: nici una
Comentariu: Serverul POP3 șterge toate mesajele marcate pentru ștergere din
maildrop și răspunde cu privire la starea acestei operații. Dacă există o eroare, ex. resursă
lipsă, întâmpinată în timpul ștergerii mesajelor, s -ar putea ca niște mesaje sau nici unul
din cele marcate pentru ștergere să nu fie șterse. Chiar dacă operația s -a realizat cu succes
sau nu, serverul eliberează orice acces exclusiv și închide conexiunea TCP.
Răspunsuri posibile:
+OK
-ERR some deleted message not removed

Comenzi POP3 opționale
Comenzile POP3 discutate mai sus tr ebuie să fie suportate de toate implementările
minimale de server POP3. Comenzile POP3 discutate mai jos permit clientului POP3 o
mai mare libertate în lucrul cu mesajele, păstrând o implementare simplă de server POP3.
Notă: Acest memo încurajează puternic implementări care să suporte aceste comenzi în
locul celor ce dezvoltă mărirea listelor “drop” și “scan”. În câteva cuvinte, filozofia
acestui memo este de a pune inteligența de partea clientului POP3 și nu a serverului POP3.

TOP
TOP msg n

Sisteme Informatice de Asistare a Deciziei
52 Argumente: Un număr de mesaj (obligatoriu) care nu poate să se refere la un mesaj
marcat pentru ștergere și un numar pozitiv de linii (obligatoriu).
Restricții: Poate fi dată doar în faza TRANSACTION
Comentariu: Dacă serverul POP3 emite un răspuns pozitiv, atunci răspunsul dat
este multi -linie. După inițialul +OK, serverul POP3 trimite headerele mesajului, o linie
goală separând headerele de corp și apoi un număr de linii separate indicând corpul
mesajului, fiind atent la completarea caracterul terminal. De observ at că dacă numărul de
linii cerute de clientul POP3 este mai mare decât numărul de linii ale corpului mesajului,
atunci serverul POP3 trimite întregul mesaj.
Răspunsuri posibile:
+OK top of mesaage follows
-ERR no such message

UIDL
UIDL [msg]
Argum ente: Un număr de mesaj (optional), care, dacă e prezent, nu poate să se
refere la un mesaj marcat pentru ștergere.
Restricții: Poate fi dată doar în starea TRANSACTION
Comentariu: Dacă un argument a fost dat, serverul emite un răspuns pozitiv cu o
linie conținând acel mesaj. Această linie este numita “unique -id listing” pentru acel mesaj.
Dacă nu a fost dat nici un argument și serverul emite un răspuns pozitiv, atunci răspunsul
dat este multi -linie. După +OK inițial, pentru fiecare mesaj din maildrop, se rverul POP3
răspunde cu o linie ce conține informații despre acel mesaj. În scopul simplificării
analizei, toate serverele POP3 sunt obligate să utilizeze un format sigur pentru “unique –
id listing”. O lista cu id -ul unic constă dintr -un număr de mesaj al m esajului, urmat de un
singur spațiu și de id -ul unic al mesajului. Nu urmează nici o informație id -ului mesajului
din lista de Id -uri unice. Id -ul unic al mesajului este un string determinat arbitrar de server,
conținand 70 de caractere între 0x21 – 0x7E, care identifică unic un mesaj în cadrul unui
maildrop și care persistă în timpul sesiunii. Această persistență este obligatorie chiar dacă
o sesiune se termină fară a intra în stare UPDATE. Serverul nu ar trebui să reutilizeze un
Id unic într -un maildrop a nume, atât timp cât entitatea ce utilizează Id -ul unic respectiv
există. De observat că mesajele marcate pentru ștergere nu sunt listate. Deși, în general,
este preferabil ca implementările pentru server să păstreze Id -urile unice asignate arbitrar
în mail drop, această specificare intenționează să permită ca Id -urile unice să fie calculate
ca a hash of the message. Clienții ar trebui să poată trata situația în care două copii identice
ale unui mesaj din maildrop au acelasși Id unic.
Răspunsuri posibile:
+OK urmat de lista de id -uri unice
-ERR no such message

USER
USER nume
Argumente: Un șir de caractere identificând o casuță poștală (obligatoriu), care
este semnificativ doar serverului.
Restricții: Poate fi dată doar în starea de AUTHORIZATION după mesajul de
salut al serverului POP3 sau după una din comenzile USER sau PASS terminate cu eroare.

Cap 4: Protocoale și servicii
53 Comentariu: Pentru autentificare utilizând comenzile USER și PASS, clientul
trebuie să emită mai întâi comanda USER. Dacă serverul POP3 răspunde cu un indica tor
pozitiv (“+OK”), atunci clientul poate emite fie comanda PASS să completeze
autentificarea, fie comanda QUIT să termine sesiunea POP3. Dacă serverul POP3
răspunde cu un indicator negativ de stare (“ -ERR”) pentru comanda USER, atunci clientul
poate emit e fie o comandă nouă de autentificare, fie comanda QUIT. Serverul poate
returna un răspuns pozitiv chiar dacă nu există nici o casuță poștală. Serverul poate returna
un răspuns negativ dacă căsuța poștală există, dar nu permite autentificare de parolă tip
plaintext.
Răspunsuri posibile:
+OK nume is a valid mailbox
-ERR never heard of mailbox nume

PASS
PASS șir caractere
Argumente: O parolă de server/căsuță poștală(obligatoriu).
Restricții: Poate fi dată doar în starea de AUTHORIZATION imediat după o
comandă USER încheiată cu succes.
Comentariu: Când un client emite comanda PASS, serverul POP3 utilizează
perechea de argumente de la USER și comenzile PASS să determine dacă clientului ar
trebui să i se permită accesul la maildrop -ul respectiv. Deoarec e comanda PASS are exact
un argument, serverul POP3 poate trata spațiile în argument ca parte a parolei, în loc de
separatoare de argument.
Răspunsuri posibile:
+OK maildrop locked and ready
-ERR invalid password
-ERR unable to lock maildrop

APOP
APOP nume rezumat
Argumente: Un șir de caractere identificând căsuța poștală și un rezumat MD5
(amandouă obligatorii).
Restricții: Poate fi dată doar în starea de AUTHORIZATION după salutul
serverului POP3 sau după una din comenzile USER sau PASS terminat e cu insucces.
Comentariu: În mod normal, fiecare sesiune POP3 începe cu USER/PASS.
Aceasta sfârșește serverul / id -ul user -ului specific, parola fiind trimisă în rețea. Multe
implementări de client POP3 se conectează la un server POP3 în mod obișnuit – pentru a
verifica mail -ul nou. În plus intervalul sesiunii inițiate poate fi de 5 minute. Deci, riscul
capturării parolei este mare. Este necesară o metodă alternativă de autentificare, care să
furnizeze cele două metode originale de autentificare și protej are a răspunsului, care să
nu implice trimiterea parolei neprotejate în rețea. Comanda APOP furnizează această
funcționalitate. Un server POP3 care implementează comanda APOP va include o marcă
de timp în banner -ul mesajului de salut. Sintaxa acestei marcă ri a timpului corespunde lui
“msg -id” din RFC 822 și trebuie să fie diferită de fiecare dată când serverul POP3 emite
un banner de salut. De exemplu, într -o implementare UNIX în care sunt utilizate procese
UNIX separate pentru fiecare instanță a serverului POP3, sintaxa unei mărci de timp poate

Sisteme Informatice de Asistare a Deciziei
54 fi: process -ID.clock@hostname unde “process -ID” este o valoare zecimală a PID -ului
procesului, “clock” este o valoare zecimală a timpului sistemului și “hostname” este
numele complet al domeniului corespunzător gazde i unde rulează serverul POP3. Clientul
POP3 ia la cunoștință de această marcă de timp și apoi emite comanda APOP. Parametrul
“nume” are aceași semantică exact ca parametrul “nume” din comanda USER. Parametrul
“rezumat” este calculat prin aplicarea algoritm ului MD5 RFC 1321 unui șir de caractere
compus din marca de timp (incluzând parantezele – unghiulare) urmat de informația
secretă. Informația secretă (shared secret) este un șir de caractere cunoscut numai de
clientul și serverul POP3. Mare atenție ar treb ui acordată pentru a împiedica o dezvăluire
neautorizată a secretului, cunoașterea secretului va permite oricarei entitați să se ascundă
sub acel nume de user. Parametrul “rezumat” este o valoare pe 16 octeți care este trimisă
în format hexazecimal, utiliz ând caracterele ASCII lower -case. Când serverul POP3
primește comanda APOP, verifică rezumatul furnizat. Dacă rezumatul este corect serverul
POP3 emite un răspuns pozitiv și sesiunea POP3 intră în starea TRANSACTION. Altfel,
un răspuns negativ este emis și sesiunea POP3 rămâne în starea AUTHORIZATION. De
observat că, lungimea informații secrete crește, deci și dificultatea. Ca atare, informațiile
secrete ar trebui să fie de lungime mare (mult mai mult de 8 caractere ca în ex. de mai
jos).
Răspunsuri posibi le:
+OK maildrop locked and ready
-ERR permission denied

4.6.2. Concluzii
De când caracteristicile principale descrise mai sus au fost adăugate la protocolul
POP3, s -a acumulat experiență în utilizarea lor pe scară largă în operații de “post office”
unde cei mai mulți utilizatori nu se cunosc unii cu ceilalți. În aceste situații și altele,
utilizatorii și vânzătorii de clienți POP3 au descoperit că o combinație între comanda
UIDL și neemiterea comenzii DELE, poate furniza o versiune slabă de “depozit maildrop
semi -permanent” având o funcționalitate normală asociată cu IMAP. Desigur alte calități
IMAP, așa cum verificând o conexiune existentă pentru mesajele noi sosite și suportând
foldere multiple pe server, nu sunt prezente în POP3. Când aceste facili tăți sunt utilizate
ocazional de către utilizatori, există o tendință de recitire a mesajelor acumulate pe server
fară limită. Acesta este clar un tip de comportament nedorit din punctul de vedere al
operatorului de server. Această situație este agravată d e faptul că posibilitățile limitate ale
POP3 -ului nu permit manipularea eficientă a maildrop -urilor care au mii de mesaje. În
consecință, este recomandat ca operatorii de servere multiusers la scară largă, în special
cei care au acces la maildrop doar via POP3, să considere următoarele alternative:
Impunând alocarea de spațiu de depozitare a maildrop -ului. Un dezavantaj al
acestei opțiuni este că acumularea de mesaje poate provoca neputința utilizatorului de a
primi noi mesaje în maildrop. În situațiile în care se alege această opțiune ar trebui să se
asigure informarea utilizatorilor asupra acestui impediment sau epuizarea spațiului, poate
prin inserarea unui mesaj potrivit în maildrop -ul userului.
Impunând o poliță de asigurare privind păstrarea pe serve r. Utilizatorii sunt liberi
să stabilească această poliță de asigurare privind depozitarea și păstrarea mesajelor pe
server, cele citite și cele necitite. De exemplu, un utilizator poate șterge mesajele necitite

Cap 4: Protocoale și servicii
55 de pe server după 60 de zile și pe cele citi te după 7 zile. Ștergerile de mesaj sunt în afara
protocolului POP3 și nu sunt considerate o violare de protocol. Operatorii de server
impunând polițele de asigurare cu privire la ștergerea mesajelor ar trebui să aibă grijă să
facă toți utilizatorii conști enți de puterea acestora. Clienții nu trebuie să presupună că o
poliță va șterge automat mesajele și ar trebui să continue să șteargă explicit mesajele
utilizând comanda DELE când este cazul. De notat că impunerea acestor polițe de
asigurare de ștergere po ate fi confuză pentru utilizatorii simpli, deoarece clientul lor POP3
poate conține opțiuni de configurare de a șterge mailul de pe server, care nu va fi de fapt
suportat de server. Un caz special al polițelor este că mesajele pot fi doar download -ate
odată de pe server și sunt șterse după ce acesta a terminat operația. Aceasta ar putea fi
implementată de un server POP3 prin următorul mecanism: ”urmărind un login de client
POP3 care a terminat prin QUIT, șterge toate mesajele download -ate în timpul sesiunii
cu comanda RETR”. Este important să nu se șteargă mesajele dacă conexiunea s -a
încheiat printr -un eveniment anormal (ex. dacă QUIT nu a fost primit de la client)
deoarece clientul poate nu a primit sau nu a salvat cu succes mesajele). Serverele ce
impleme ntează polițele downloadează -și-șterge pot de asemenea să dorească să
dezactiveze sau să limiteze comanda TOP, deși ar putea fi utilizată ca un mecanism
alternativ pentru a downloada toate mesajele.
4.6.3. protocolul IMAP
Protocolul IMAP4 (Internet Messa ge Access Protocol) permite accesul la mesaje
din foldere de mail de pe un server. Spre deosebire de POP3, care este proiectat pentru a
transfera și șterge e -mail-urile de pe server, scopul IMAP este de a le stoca pe toate pe
server și să poată fi accesate din orice loc. Mesajele pot fi stocate pe server, transferate
sau mutate între foldere.

4.7. Protocoale criptografice SSL și TLS
Secure Sockets Layer (SSL) și Transport Layer Security (TLS), succesorul său,
sunt protocoale criptografice care permit co municații sigure pe Internet. Există anumite
diferențe între SSL 3.0 și TLS 1.0, dar protocolul rămâne aproximativ același. Termenul
"SSL" folosit aici se poate referi la ambele protocoale, excepție făcând cazurile
specificate prin detalierea contextului.
4.7.1. Descriere și funcționare
SSL asigură autentificarea endpoint -urilor și confidențialitatea comunicației prin
Internet folosind criptografia. În utilizările uzuale, numai server -ul este autentificat
(identitatea sa este certificată) în timp ce clien tul rămâne neautentificat; autentificarea
mutuală presupune existența unei mecanism de distribuție a cheie publică (PKI) către
clienți. Protocolul permite aplicațiilor client/server să comunice securizat pentru a
împiedica eavesdropping, tampering și messa ge forgery. SSL implică mai multe faze
intermediare:
• verificarea mutuală de suportare a protocolului;
• schimbarea cheilor prin intermediul criptării prin metoda cu chei publice și
autentificare pe baza de certificate;
• transmiterea de trafic criptat prin sistemul cheilor simetrice.

Sisteme Informatice de Asistare a Deciziei
56
În timpul primei faze a protocolului serverul și clientul negociază asupra
algoritmului de criptare ce va fi folosit. Implementările curente permit următoarele
posibilități:
• criptografia bazată pe chei publice: RSA, Diffie -Hellman, DSA sau Fortezza; •
pentru codări simetrice: RC2, RC4, IDEA, DES, Triple DES sau AES;
• pentru funcții de hash unidirecțional: MD5 sau SHA.

Protocolul SSL permite schimbul de înregistrări; fiecare înregistrare poate fi, în
mod opțional, compresat ă, criptată și împachetată cu un cod de autentificare al mesajului
(engleză: message authentication code – MAC). Fiecare înregistrare are un câmp numit
content_type care specifică care protocol superior este folosit.
Când conexiunea demarează, nivelul înr egistrare încapsulează un alt protocol, de
tip handshake protocol, pentru care câmpul content_type are valoarea 22.
Clientul trimite și primește mai multe structuri de handshake:
Trimite un mesaj ClientHello în care specifică lista de metode de criptare care sunt
suportate, metodele de compresie și cea mai actuală versiune a protocolului cunoscută.
De asemenea transmite o secvență aleatoare de biți care va fi folosită ulterior.
Primește mai apoi un ServerHello, în care serverul alege parametrii conexiuni i din
mulțimea de opțiuni oferită de client mai devreme.
Când parametrii conexiunii sunt cunoscuți, clientul și serverul schimbă
certificatele (în funcție de algoritmul de codare pentru chei publice ales). Aceste
certificate sunt în prezent de tip X.509, dar exista de asemenea un document care specifică
utilizarea certificatelor bazate pe OpenPGP.
Serverul poate solicita un certificat clientului, astfel încât conexiunea să fie mutual
autentificată.
Clientul și serverul negociază un secret comuni numit "m aster secret", existând
aici opțiunea folosirii rezultatului schimbului Diffie -Hellman, sau mai simplu prin
criptarea secretului cu cheia privată și decriptarea acesteia cu cheia privata a partenerului.
Toate datele legate de chei sunt derivate din acest " master secret" (și de valori generate
aleator de către client sau de către server), care sunt schimbate atent prin funcția atent
proiectată de "Funcții pseudoaleatore".

TLS/SSL au o varietate de măsuri de securitate:
• numerotarea tuturor înregistrăril or cu numere de secvență în MAC -uri;
• folosirea unui mecanism de sumarizare a mesajului extins prin folosirea unei chei
(numai dacă se cunoaște cheia se poate verifica MAC. Acest lucru este specificat
în RFC 2104);
• protecție împotriva unor tipuri cunoscut e de atacuri (incluzând atacuri de tip "man
in the middle"), precum cele de tip forțare la folosirea a unor versiuni mai vechi
(și mai puțin sigure) ale protocolului, sau versiuni mai puțin sigure ale algoritmilor
de codare.
• mesajul care încheie handshake ("Finished") care trimite un hash all tuturor
datelor schimbate între cele două părți.

Cap 4: Protocoale și servicii
57 Funcțiile pseudoaleatore împart datele în două jumătăți și le procesează cu doi
algoritmi diferiți de hash (MD5 și SHA), și apoi face un XOR între ele. În acest fel se
protejează și în cazul în care pentru unul dintre aceste două algoritme se găsește o
vulnerabilitate.
4.7.2. Aplicații ale SSL
SSL rulează la un nivel care este inferior protocoalelor aplicație precum HTTP,
SMTP și NNTP, dar care este superior protoco alelor de transport precum TCP sau UDP,
care sunt componente ale suitei de protocoale internet TCP/IP. Deși SSL poate adăuga
securitate pentru orice protocol care folosește conexiuni statefull (precum TCP -ul), el este
cel mai adesea folosit împreună cu HTT P, formând astfel HTTPS.
HTTPS este utilizat pentru a securiza paginile web pentru aplicații gen comerț
electronic. HTTPS folosește certificatele cu chei publice pentru a verifica identitatea
utilizatorilor finali.
Deși din ce în ce mai multe produse of eră suport nativ pentru SSL, sunt multe care
încă nu au acest protocol. În astfel de cazuri, utilizatorii pot folosi produse separate
precum Stunnel, care să asigure criptarea. Totuși, Internet Engineering Task Force a
recomandat în 1997 ca aplicațiile să ofere posibilitatea includerii TLS -ului, decât să
folosească un port separat pentru comunicații criptate – limitând astfel folosirea
produselor adiționale precum Stunnel.
SSL poate fi folosit de asemenea pentru tunelare creând astfel o nouă rețea privată
(VPN, precum [OpenVPN].

Istoria și dezvoltarea
Dezvoltat de către Netscape, versiunea SSL 3.0 a fost lansată în 1996, care mai
apoi a devenit baza dezvoltării versiunii 1.0 a TLS, un protocol standard IETF definit
pentru prima dată în RFC 2246. Visa, M asterCard, American Express și alte câteva
instituții financiare au susținut utilizarea SSL pentru comerțul prin Internet.
SSL este conceput modular: autorii săi l -au proiectat pentru a fi extins și pentru a
suporta compatibilitatea înainte și înapoi, pre cum și cu negociere între enpoint -urile aflate
în conversație.

Chei slabe mai vechi
Câteva implementări inițiale ale SSL putea folosi o cheie cu o lungime maximă a
cheii simetrice de 40 de biți datorată restricției guvernului american de export a
tehno logiei criptografice. Guvernul american a impus în mod explicit o cheie maximă de
40 de biți care putea fi spartă prin brute -force de către agențiile de impunere a legilor care
doreau să intercepteze traficul criptat și care totuși împiedicau atacatorii cu motive mai
puțin întemeiate. O limitare asemănătoare a fost impusă și pentru Lotus Notes în
versiunile pentru export. După ani de controverse publice, o serie de procese și eventuala
recunoaștere a guvernului pentru cererea pieței de produse criptografice mai performante
produse în afara Statelor Unite, autoritățile americane au relaxat legislația pentru
restricțiile de export. Limitarea lungimii cheii la 40 de biți a dispărut în acest fel.
Implementările moderne folosesc o lungime a cheii de 128 de biți ( sau chiar mai mare de
atât) pentru algoritmii de criptare cu chei simetrice.

Sisteme Informatice de Asistare a Deciziei
58 Utilizări incorecte
Anumite pagini web au fost criticate pentru folosirea incorectă a SSL și prin
urmare a tuturor beneficiilor care decurg din comunicațiile securizate. Astfe l de utilizări
incorecte includ:
• securizarea numai a paginilor care presupun completarea de formulare, dar
nesecurizarea paginii de autentificare a utilizatorilor;
• afișarea de pagini securizate împreună cu conținut nesecurizat.

59 5. Limbaje de progra mare și tehnologii Web
5.1. Introducere
Tehnologiile utilizate în aplicațiile Web reprezintă în general, acele limbaje de
programarea utilizate la crearea de site -uri web complexe, interactive, al căror concept
presupune stăpânirea cât mai detaliată a u nor limbaje de scripting sau de programare și
baze de date. În categoria tehnologiile Web se pot include o multitudine de limbaje de
programare, cum ar fi PHP, JavaScript, ASP etc., iar ca baze de date pot fi utilizate
MySQL, MsSQL, Access etc.
Câteva ap licații Web întalnite mai des sunt portalurile, forumurile, magazinele
virtuale, formularele de înscriere, licitațiile on -line etc.
Acum câțiva ani, tehnologiile Web erau folosite doar de marile companii datorită,
în principal, costurilor ridicate ale li cențelor programelor de dezvoltare. În prezent,
datorită dezvoltării tot mai accentuate a soluțiilor Open Source, oricine își poate permite
realizarea aplicații web.
Se pot enumera o serie de tehnologii folosite mai des în programarea aplicațiilor
web di namice, și anume:
• HTML – Apărut la începutul anilor '90, datorită lipsei unui limbaj universal care
să permită publicarea informației la nivel global, HTML a determinat dezvoltarea
spectaculoasă a Internetului.HTML ( Hypertext Markup Language ). Marcajel e de
tip HTML din cadrul documentului spun browser -ului cum să afișeze conținutul
util al fișierului;
• XHTML – reprezintă prescurtarea de la EXtensible HyperText Markup Language
(denumirea oficiala a standardului). Practic este un înlocuitor modern al mai
vechiului limbaj HTML;
• CSS – Fișierul CSS (cascading style sheet – foi de stil în cascadă). Un fișer CSS
este un fișier text cu extensia ".css" definind stiluri pentru paginile HTML.
Fișierele CSS permit stilizarea în bloc a documentelor HTML cu un efort
semnificativ mai mic decât în cazul stilizării elementelor de pagină în cadrul
fiecărui document HTML în parte, prin intermediul atributelor tagurilor.
• JAVASCRIPT – este un limbaj de scripting dezvoltat la origine de Netscape,
permițând scrierea de secven țe de program care se execută la apariția unui
eveniment utilizator.
• FLASH : este un mediu de lucru dezvoltat de compania Macromedia, cu ajutorul
FLASH -ului se poate realiza un design de calitate, conținut interactiv, animații
profesionale.
• MYSQL este un sistem de gestiune a bazelor de date relaționale, fiind o
componentă cheie a limbajului PHP
• CGI – Common Gateway Interface – sunt scripturi scrise în orice limbaj de
programare indiferent dacă este compilat sau interpretat, scripturi care sunt
executate pe server;
• ISAPI – Internet Server API – reprezintă alternativa celor de la Microsoft la CGI
(Common Gateway Interface), rulabilă bineînțeles pe platforme Windows. Acesta
poate fi scris în orice limbaj cu suport pentru dll -uri. Rezultatul compilării va fi un
fișier .dll. ISAPI are o serie de avantaje fata de CGI. O alternativă la ISAPI este
NSAPI. Acesta se utilizează în cadrul serverului Netscape;

Sisteme Informatice de Asistare a Deciziei
60 • PHP și ASP apărute în 1994, respectiv 1996, sunt două limbaje puternice care au
adus o schimbare în design -ul aplicațiilor web. Acestea, deși sunt diferite, au totuși
o serie de similarități: ambele sunt interpretate, ambele generează scripturi (.php
respectiv .asp), care pot fi combinate cu HTML, date de tip text etc. Limbajele
oferă suport și pentru lucrul cu baze de date (MySQL, MsSQL, PostgreSQL,
Oracle) – de fapt sunt intens folosite în acest sens. Limbajul ASP nu este un concept
nou ci se bazează pe limbajele VBScript și JScript. Principalul dezavantaj al
acestor doua limbaje este viteza. Acestea sunt lente deoarece fiecare accesare
presupune procesarea și interpretarea lor și nu pot construi controale reutilizabile.
• JSP – Java Server Pages – reprezintă o tehnologie de design al aplicațiilor web ce
permite crearea acestor aplicații independente de platform ă. Tehnologia se bazează
pe limbajul de programare Java și marcatori XML. Avantajul JSP este reprezentat
de administrarea facilă, independentă de platformă, separarea logicii aplicației de
partea de interfață utilizator, performanța;
• ASP.NET – este o nouă tehnologie pentru aplicații web elaborată de Microsoft,
dar despre care nu se poate spune dacă este o urmare a ASP -ului, cu toate că
păstrează compatibilitatea cu acesta

Există o serie de alte medii pentru proiectarea aplicațiilor web, fiecare cu
avan tajele și dezavantajele sale, dar cu un singur scop: crearea unor aplicații web
interactive, securizate, cu timp de răspuns cât mai redus, dar care să ofere și o interfață
grafică plăcută.

5.2. HTML
5.2.1. Introducere
HyperText Markup Language (HTML) este un limbaj de marcare utilizat pentru
crearea paginilor web ce pot fi afișate într -un browser (sau navigator). Scopul HTML este
mai degrabă prezentarea informațiilor – paragrafe, fonturi, tabele ș.a.m.d. – decât
descrierea semanticii documentului.
Specificațiile HTML sunt dictate de World Wide Web Consortium (W3C).
HTML este un format text proiectat pentru a putea fi citit și editat de oameni
utilizând un editor de text simplu. Totuși scrierea și modificarea paginilor în acest fel
solicită cunoștințe solide de HTML și este consumatoare de timp. Editoarele grafice cum
ar fi Macromedia Dreamweaver, Adobe GoLive sau Microsoft FrontPage permit ca
paginile web sa fie tratate asemănător cu documentele Word, dar cu observația că aceste
programe generează un c od HTML care este de multe ori de proastă calitate.
HTML se poate genera direct utilizând tehnologii de codare din partea serverului
cum ar fi PHP, JSP sau ASP. Multe aplicații ca sistemele de gestionare a conținutului,
wiki-uri și forumuri web generează pagini HTML.
HTML este de asemenea utilizat în email. Majoritatea aplicațiilor de email folosesc
un editor HTML încorporat pentru compunerea email -urilor și un motor de prezentare a
email -urilor de acest tip. Folosirea email -urilor HTML este un subiect co ntroversat și
multe liste de mail le blochează intenționat.

Cap 5: Limbaje de programare și Tehn ologii Web
61 5.2.2. Operatori, cuvinte cheie HTML
Caracteristicile și elementele componente ale unui document HTML:
• <html> și </html> – orice document începe și se termină aceste tag -uri;
• <head>…</head> – reprezintă porțiunea de antet a documentului, aici se poate
introduce titlul documentului între tag -urile <title> și </title> , precum și alte
elemente;
• <body>…</body> – corpul documentului, cuprinde conținutul paginii HTML,
ceea ce va fi afișat pe ecr an;
• "<" și ">" – marcaje în document;
• <br> – întrerupere de linie, de la "line break", echivalentul lui Enter;
• <p> – paragraf nou;
• <hr> introduce o linie orizontala și trecerea la un rând nou;
• <pre>…</pre> – blocuri preformate – browser -ul va inter preta corect caraterele
"spațiu", "tab" și "enter" pentru un text introdus între aceste tag -uri;
• <! ….> – introduce un ceomentariu.

Astfel, un document HTML are următoarea structură generală:
<html>
<head> <title>Titlu</title> </head>
<body>
Conținut pagină
<!– Acesta este un comentariu in HTML –>
</body>
</html>

Culoarea de fond
O culoare poate fi precizată în două moduri:
• printr -un nume de culoare. Sunt disponibile cel puțin 16 nume de culori: aqua,
black, fuchsia, gray, green lime, maroon, navy, olive, purple, red, silver, teal, white
și yellow.
• prin construcția " #rrggbb " unde r (red), g (green), sau b (blue) sunt cifre
hexazecimale și pot lua valorile: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, A, b, B, c, C, d, D, e,
E, f, F; se pot defi ni astfel 65536 de culori.

Culoarea unei pagini se precizează prin intermediul unui atribut al etichetei
<body> . Culoarea fondului paginii Web se stabilește cu atributul bgcolor al etichetei
<body> , de exemplu: <body bgcolor = culoare> .

Culoarea t extului
Acest lucru se face prin intermediul atributului text al etichetei <body> după sintaxa
<body text=culoare> .

Pe o singură linie de comandă, se pot stabili mai multe atribute, de exemplu și
culoarea de fundal și cea a fontului:
<body bgcolor = culoare1 text=culoare2>

Sisteme Informatice de Asistare a Deciziei
62 Textul afișat este caracterizat de următoarele atribute: Mărime ( size ), Culoare
(color ), Font (style ). Acestea sunt atribute ale etichetei <basefont> . Este o etichetă
singulară (fără delimitator de sfârșit de bloc).
<basefont s ize = numar color = culoare style = font> unde:
• numar – poate fi 1, 2, 3, 4, 5, 6 sau 7; (1 pentru fontul cel mai mic si 7 pentru fontul
cel mai mare);
• culoare – este o culoare precizată prin nume sau printr -o construcție RGB;
• font – poate fi un fon t generic ca "serif", "san serif", "cursive", "monospace",
"fantasy" sau un font specific instalat pe calculatorului clientului, ca "Times New
Roman", "Helvetica" sau "Arial". Se acceptă ca valoare și o listă de fonturi
separate prin virgulă, de exemplu: " Times New Roman, serif, monospace ".

Domeniul de valabilitate al caracteristicelor precizate de această eticheta se întinde
de la locul în care apare eticheta până la sfârșitul paginii sau până la următoarea etichetă
<basefont> .
5.2.3. Fonturi
Un font este caracterizat de următoarele atribute:
• culoare (stabilită prin atributul color );
• tipul sau stilul (stabilit prin atributul face ) o familii generice: serif, sans
serif, cursive, monospace și fantasy; o instalate pe calculator;
• mărimea (defin ita prin atributul size ) ; o 1, 2, 3, 4, 5, 6, 7 ( 1 pentru cel mai mic
font și 7 pentru cel mai mare); o +1, +2, etc. pentru a mari dimensiunea fontului
cu 1, 2, etc. față de valoarea curentă;
o -1, -2, etc. pentru a micșora dimensiunea fontului cu 1, 2 , etc. față de valoarea
curentă.
• mărimea în puncte tipografice (stabilită prin atributul point-size );
• grosime (definită prin atributul weight ), valori posibile: 100, 200, 300, 400, 500,
600, 700, 800 și 900 (100 pentru fontul cel mai subțire și 900 pent ru cel mai gros).
5.2.4. Blocuri de text
Aceste etichete nu se referă la particularitățile caracterelor ce compun textul, ci la
funcțiile pe care le poate avea un bloc de text în cadrul paginii Web. Toate aceste etichete
produc automat trecerea la un rând nou și adăugarea unui spațiu suplimentar.
<address>…</address> – această etichetă introduce un bloc adresă;
<blockquote>…</blockquote> – textul introdus între aceste etichete este identat –
marginea din stânga textului este deplasată la dreapta la o anumită distanță față de
marginea paginii;
<pre>…</pre> – bloc preformat – este indicat pentru a insera rânduri vide (spațiu
între rândurile succesive). Caracterul " spațiu " poate fi luat în considerare de browser dacă
este inserat explicit prin &nbsp; .

Într-un fișier HTML, caracterele " <" și " >" au o semnificație specială pentru
browser. Ele încadrează comenzile și atributele de afișare a elementelor într -o pagină.

Cap 5: Limbaje de programare și Tehn ologii Web
63 Dacă dorim ca un fragment de text să conțină astfel de caractere, acest fragme nt trebuie
încadrat de una dintre perechile de etichete:
• <xmp>…</xmp> ( 80 de caractere pe rând ); • <listing>…</listing> ( 120 de
caractere pe rând ).

Blocuri paragraf
Cu ajutorul etichetei paragraf <p> este posibil trecerea la o linie nouă ș i permite:
• inserarea unui spațiu suplimentar înainte de blocul paragraf;
• inserarea unui spațiu suplimentar după blocul paragraf, dacă se folosește
delimitatorul </p> (acesta fiind opțional);
• alinierea textului cu ajutorul atributului align , având val orile posibile "left",
"center" sau "right".

Blocuri de titlu
Într-un text titlurile ( headers ) de capitole pot fi introduse cu ajutorul etichetelor
<h1>, <h2>, <h3>, <h4>, <h5>, <h6> .
Toate aceste etichete se refera la un bloc de text și trebuie î nsoțite de o etichetă de
încheiere similară </h1>, </h2>, </h3>, </h4>, </h5>, </h6> .
Aceste etichete acceptă atributul align pentru alinierea titlului blocului de text la
stânga (în mod prestabilit), în centru și la dreapta. Tag -ul <h1> permite scrierea unui titlu
cu caractere mai mari și aldine, pe când <h6> folosește caracterele cele mai mici.

Linii orizontale
Într-o pagină Web pot fi inserate linii orizontale. Acest lucru se face cu ajutorul
etichetei <hr> . Pentru a configura o linie orizontală se utilizează următoarele atribute ale
etichetei <hr> :
• align permite alinierea liniei orizontală. Valorile posibile sunt " left " ," center "
și " right ";
• width permite alegerea lungimii liniei;
• size permite alegerea grosimii liniei;
• noshade când es te prezent definește o linie fără umbră;
• color permite definirea culorii liniei.

Blocuri <center>
Blocul introdus de etichetele <center>…</center> aliniază centrat toate
elementele pe care le conține.

Blocuri <nobr>
Blocul de text cuprins înt re etichetele <nobr>…</nobr> va fi afișat pe o singură
linie.

Blocuri <div>
Modalitatea cea mai eficientă de delimitare și de formatare a unui bloc de text este
folosirea delimitatorilor <div>…</div> . Un parametru foarte foarte util pentru stabili rea
caracteristicilor unui bloc <div> (diviziune) este align (aliniere).

Sisteme Informatice de Asistare a Deciziei
64 Valorile posibile ale acestui parametru sunt:
• " left " ( aliniere la stânga );
• " center " ( aliniere centrală );
• " right " ( aliniere la dreapta ).
Un bloc <div>…</div> poate include alte subblocuri. În acest caz, alinierea
precizată de atributul align al blocului are efect asupra tuturor subblocurilor incluse în
blocul <div> ;
Un bloc <div>…</div> admite atributul "nowrap" care interzice întreruperea
rândurilor de către browser.
Exemplu:
<html>
<head>
<title> Blocul <div></title>
</head>
<body>
Paragraf normal urmat de paragraf aliniat la dreapta.
<div align="right">
paragraf pe o singura linie aliniat la dreapta.<br>
</div>
<div align="center">
Paragraf al iniat pe centru.<br>
</div>
</body>
</html>

5.2.5. Imagini
Imaginile sunt stocate în fi șiere cu diverse formate. Formatele acceptat de browsere
pentru fișierele imagine sunt:
• GIF (Graphics Interchange Format) cu extensia .gif;
• JPEG (Joint Photographic Experts Group) cu extensia .jpeg sau .jpg;
• XPM (X PixMap) cu extensia .xmp;
• XBM (X BitMap) cu extensia .xbm;
• BMP (BitMap) cu extensia .bmp (numai cu Internet Explorer);
• TIFF (Tagged Image File Format) cu extensia .tif sau .tiff;

Cele mai răspândite formate sunt GIF(8biți pentru o culoare, 256 culori posibile)
și JPEG (24biți pent ru o culoare, 16777216 de culori posibile).

Tag-ul folosit pentru inserarea unei imagini în pagină este <img> și are
următoarele atribute:
• src = sursa, locul unde se afla imaginea, adresa URL("Uniform Resourse Locator"
= identificator unic al resursei ); Dacă imaginea se afla în același director cu fișierul
HTML care face referire la imagine, atunci adresa URL a imaginii este formată
numai din numele imaginii, inclusiv extensia.
• width = lățimea imaginii;
• height = înălțimea imaginii;

Cap 5: Limbaje de programare și Tehn ologii Web
65 • alt = numele car e înlocuiește imaginea până aceasta se încarcă sau când nu a fost
găsită;
• border = chenar (0 = lipsă bordură)
• align = "center, right, left, top, middle, bottom" – alinierea imaginii în pagină
• hspace =" nr.întreg ", vspace =" nr.întreg " – precizează dis tanța în pixeli pe
orizontală, respectiv verticală, dintre imagine și restul elementelor din pagină.

Exemplu:
<html>
<head><title> Imagine cu chenar și mărită </title></head>
<body> O imagine cu chenar si de 200 pixeli X 15 % <img
src="imagie.jpg" a lign="center" border="5" width="350"
height="25%"> Text după imagine.
</body>
</html>

Utilizări speciale ale imaginilor
Imaginile pot fi utilizate pentru a obține efecte deosebite într -o pagină web.
Printre aceste utilizări speciale putem enumera:
1. Linii orizontale formate cu ajutorul imaginilor .
2. Simboluri speciale pentru elementele unei liste neordonate.
5.2.6. Legături (Link -uri)
Legăturile (link -urile) reprezintă partea cea mai importantă a unei pagini Web. Ele
transformă un text obișnuit în hipertext sau hiperlegatură , care permite trecerea rapidă de
la o informație aflată pe un anumit server la altă informație memorată pe un alt server aflat
oriunde în lume.
Legăturile sunt zone active într-o pagină Web, adică zone de pe ecran sensibil e la
apasarea butonului stâng al mouse -ului.
O legătură (link) este definită cu ajutorul etichetelor (tag -urilor) <a>…</a>, (de la
"anchor"=ancora) textul, imaginea sau paragraful plasat între aceste etichete formând link –
ul, și are atributele:
• href – adresa fișierului destinație;
• target – în ce fereastră se va deschide fișierul destinație:
o _blank pagina va fi încărcata într -o nouă fereastra; o
_parent pagina va fi încărcată în fereastra părinte; o
_top pagina va fi încărcată în fereastra top a cadru lui; o
_self pagina va fi încărcată în aceeași fereastră.
• title – mică descriere asociată legăturii afișată în momentul în care mouse -ul se
află deasupra legăturii

Legătura poate fi:
• o pagină aflată în același director, realizată cu ajutorul atributu lui href, astfel:
<a href="nume_fisier_2.html">;
• o pagină de pe același disc local – se folosește adresa relativă la acel fișier :
<a href="exemple/list/listex_11.html"> ;

Sisteme Informatice de Asistare a Deciziei
66 • o legătură către un site particular: <a href="http://www.ub.ro">;
• o imagin e;
• o adresă de e -mail: <a href='mailto:test@test.ro?subject="subiect
prestabilit"'>Trimite e -mail</a> ; • către un fișier oarecare: <a
href="fisier.zip">

ANCORE
Într-o pagină foarte lungă pot exista puncte de reper către care se definesc legături.
O ancoră se definește de asemenea prin eticheta <a>. Pentru a defini ancoră se utilizează
atributul name care primește ca valoare un nume atribuit ancorei (de exemplu "leg1").
• Pentru a insera o legătura către "leg1" definită în aceeași pagină se utilizează
eticheta <a> având atributul href de valoare "#leg1".
• Pentru a introduce o legătură către o ancoră definită în alt document (altă pagină)
aflat în același director, atributul href primește o valoare de forma
"nume_fisier.html#nume_ancora". Exemplu:
Ancora (definirea ei) <a name="nume">Ancora</a>
Link către ancora aflata în aceeași pagină <a href="#nume">Înapoi la ancora</a>
Link către ancora aflata în alta pagină <a href="pagina.html#nume">Inapoi la
ancora din pagina.html</a>
5.2.7. Liste
Unul din cele mai obișnuite elemente din documentele cu mai multe pagini este un
set de definiții, referințe sau indexuri. Glosarele sunt exemple clasice în acest sens;
cuvintele sunt listate în ordine alfabetică, urmate de definiții ale termenilor respectiv i. În
HTML, întreaga secțiune a unui glosar va fi gestionată printr -o lista de definitii , care este
inclusă într -o pereche de marcaje de lista de definiții : <dl>…</dl> (de la "definition list"
= lista de definiții). Observații:
• un termen al listei este inițiat de eticheta <dt> (de la "definition term" = termen
definit);
• definiția unui termen este inițiata de eticheta <dd> (de la "definition description"
= descrierea definitiei);
• definiția unui termen începe pe o linie nouă și este indentată;

Liste neordonate
O listă neordonată este un bloc de text delimitat de etichetele corespondente
<ul>…</ul> ("ul" vine de la "unordered list" = listă neordonată). Fiecare element al listei
este inițiat de eticheta <li> (list item).
Lista va fi indentată fa ță de restul paginii Web și fiecare element al listei începe pe
un rând nou.
Tag-urile <ul> și <li> pot avea un atribut type care stabilește caracterul afișat în
fața fiecărui element al listei. Valorile posibile al acestui atribut sunt: o "circle" (cer c)
• "disc" (disc plin) (valoarea prestabilita);
 "square" (patrat)

Cap 5: Limbaje de programare și Tehn ologii Web
67 Listele neordonate pot fi imbricate pe mai multe niveluri : Exemplu:
<html>
<head><title> liste_1</title></head>
<body><h1 align="center"> O listă neordonată: </h1><hr>
<ul>
<li type = "square">Rosu</li> <li type = "circle">Galben</li>
<li type = "disc">Albastru</li> </ul>
</body> </html> Liste
ordonate
O listă ordonată de elemente este un bloc de text delimitat de etichetele
corespondente <ol>…</ol> ("ol" vine de la "or dered list" = listă ordonată). Fiecare
element al listei este inițiat de eticheta <li> (list item).
Tag-urile <ol> și <li> pot avea un atribut type care stabilește tipul de caractere
utilizate pentru ordonarea listei. Valorile posibile sunt:
• " A " pent ru ordonare de tipul A , B , C , D etc. ( litere mari );
• " a " pentru ordonare de tipul a , b , c , d etc. ( litere mici );
• " I " pentru ordonare de tipul I , II , III , IV etc. ( cifre romane mari );
• " i " pentru ordonare de tipul i , ii , iii , iv etc. ( cifre romane mici );
• " 1 " pentru ordonare de tipul 1 , 2 , 3 , 4 etc. ( cifre arabe – optiune prestabilita );

Tag-ul <ol> poate avea un atribut start care stabile ște valoarea inițială a secvenței
de ordonare.Valoarea acestui atribut trebuie să fie un număr întreg pozitiv.
Tag-ul <li> poate avea un atribut value care stabilește valoare pentru elementul
respectiv al listei. Valoarea acestui atribut trebuie să fie u n număr întreg pozitiv.
Listele ordonate pot fi imbricate între ele sau cu liste neordonate, ca în exemplul
următor.
<html>
<head><title>listex_8</title></head>
<body><h1 align="center">O lista ordonata de liste ordonate si
neordonate</h1><hr>

Sisteme Informatice de Asistare a Deciziei
68 <ol>Un sistem informatic include:
<li>Hardware:
<ol>
<li>placa de baza
<li>procesor
<li>memorie
<li>harddisk
</ol>
<li>Software:
<ul>
<li>Linux
<li>Windows
<li>OS/2
<li>Unix
</ul>
<li>Software de aplicatie:
<ul type="disc">
<li>VisualC++
<li>Java
<li>SQL
<li>CorelDraw
</ul>
</ol>
</body>
</html>
O listă de meniuri este un bloc delimitat de etichete corespondente
<menu>…</menu> . Fiecare element al listei este inițiat de eticheta <li> (list item).
Cele mai multe browsere afișează lista de meniuri ca pe o listă neordonată .
O listă de directoare este un bloc delimitat de etichete corespondente
<dir>…</dir> (de la " director "). Fiecare element al listei este initiat de eticheta <li> (list
item). Cele mai multe browsere afișează lista de directoare ca pe o listă neordonat ă.
5.2.8. Tabele
Tabelele ne permit să creăm o rețea complexă de câmpuri (celule), iar tabelele stau
la baza construirii marii majorități a paginilor Web. Fiecare celulă a tabelului are propriile
opțiuni pentru culoarea fondului, culoarea textului, ali nierea textului etc. Instrucțiuni:
• <table>…</table> – inserează un tabel;
• <tr>…</tr> – inserează un rând (tabel row);
• <td>…</td> – inserează o celulă cu date;

Atributele tabelului (tabel/rând/celulă):
• border – un număr întreg ce definește grosimea b ordurii tabelului (poate fi 0 =
lipsă bordură – valoare implicită) : <table border="4"> ;
• align – aliniază tabelul în pagina Web, și poate lua valorile left, center și right:
<table align="left"> ;
• hspace și vspace – dau distanța dintre tabel și celelal te elemente din pagina Web;
• bgcolor – determină culoarea de fundal a tabelului sau a celulei, cu următoarea
prioritate: celulă (<td>), linie (<tr>) și tabel (<table>):
<table border="3" bgcolor="green"> <tr bgcolor="blu e"> <td

Cap 5: Limbaje de programare și Tehn ologii Web
69 bgcolor="red">; Culoarea textului din fiecare celula se poate stabili cu ajutorul
expresiei: <font color="white">…</font> . ;
• cellspacing – atribut al tag -ului <table>, ce definește distanța (în pixeli) dintre
celulele tabelului – valoarea impli cită este 2: <table cellspacing="4"> ;
• cellpadding – definește distanța dintre marginea unei celule și conținutul ei,
valoarea implicită este 1: <table border="0" cellpadding="20"> ;
• width și height – stabilesc lățimea și înălțimea unui tabel/celulă – pot fi nr întregi
sau procente din dimensiunea paginii: <table width="200" height="50%"> ;
• <caption> – atribuie un titlu tabelului, și poate lua valorile: bottom, top, left și
right: <table border="0"><caption align="top">Titlu_tabel ;
• <th> – table header – definește celule cap de tabel, conținutul lor este scris cu
caractere aldine și centrat: <th>Cap_tabel</th> ;
• align – aliniază pe orizontală conținutul unei celule, și poate lua valorile: left,
center, right, char (aliniere față de un caracter):
<td align="left">stanga</td> ;
• valign – aliniază conținutul celulei pe verticală: baseline, bottom, middle, top :
<td valign="bottom"> jos</td> ;
• colspan – împreună cu <td> și <th> extinde o celulă peste celulele din dreapta s a
– 3 celule unite: <td colspan="3">celule</td> ;
• rowspan – împreună cu <td> și <th> extinde o celulă peste celulele de dedesubt –
4 celule unite: <td rcwlspan="4">celule</td> ;
• nowrap – aparține elementelor <td> și <th> și interzice întreruperea unei lin ii de
text  o coloană cu o lățime oricât de mare: <td nowrap>celula_mare</td> ;
• &nbsp – introduce caracterul spațiu într -o celulă, astfel încât aceasta sp aibă
chenar (celulele vide nu au chenar) – se folosește cu <td>;
• <br> – are același efect ca și &nb sp;
• frame – specifică părțile din chenar care vor fi afișate, și ia valorile:
o void – elimină toate muchiile exterioare ale tabelului; o above – afișează o
muchie în partea superioară a cadrului tabelului; o below – afișează o muchie
în partea inferioar ă a cadrului tabelului; o hsides – afișează cate o muchie în
partea superioară și inferioară cadrului tabelului;
o lhs – afișează o muchie în partea din stânga a cadrului tabelului; o rhs –
afișează o muchie în partea din dreapta a cadrului tabelului; o vsides – afișează
o muchie în partea din stânga și din dreapta a cadrului tabelului;
o box – afișează o muchie pe toate laturile cadrului tabelului; o border –
afișează o muchie pe toate laturile cadrului tabelului;

Exemplu Tabel_1:
<html>
<head><t itle>tabelex_4</title></head>
<body><h1 align=center>Un tabel simplu colorat</h1><hr>
<table border="3" bgcolor="green">
<tr> <td>verde 11</td> <td bgcolor="red">rosu 11</td></tr>
<tr bgcolor="blue"> <td>albastru 21</td> <td bgcolor="yellow">galben
22</td></tr>
<tr bgcolor="cyan"> <td>cell 31</td> <td>cell 32</td></tr>

Sisteme Informatice de Asistare a Deciziei
70 <tr> <td>cell 41</td> <td bgcolor="white">cell 42</td></tr>
</table>
</body>
</html>

Exemplu Tabel_2: cu titlu și cap de tabel
<html>
<head><title> Tabel_2</title></head>
<body><h1 align=left>Tabel cu titlu</h1>
<table border="3"><caption align="top"> Catalog
<tr><th>Student</th> <th>Matematica</th> <th>Romana</th>
<th>Fizica</th> <th>Chimie</th></tr>
<tr align="center" bgcolor="red"><th>Popescu Vasile</th> <td>10</td>
<td>10</td><td>10</td><td>6</td></tr>
<tr align="center"><th bgcolor="blue"> <font color="white">Ionsecu
Sorin</font></th> <td>9</td> <td>6</td><td>8</td><td>9</td></tr>
</table>
</body>
</html>

5.2.9. Ferestre sau cadre în HTML
Ferestrele sau (cadrele) permit definirea în fereastra principal ă a unor subferestre
în care să fie încărcate documente HTML diferite.
Sub-ferestrele sunt definite într -un fișier HTML special, în care blocul
<body> …</body> este înlocuit de blocul <frameset> …</frameset> .
În interiorul acestui bloc, fiecare cadru este introdus prin eticheta <frame> .
Un atribut obligatoriu al etichetei <frame> este src, care primește ca valoare
adresa URL a documentului HTML care va fi încărcat în acel frame. Definirea cadrelor se
face prin împărțirea ferestrelor (și a sub -ferestr elor) în linii și coloane astfel:
• împărțirea în linii se face cu atributul rows al etichetei <frameset> ;
• împărțirea în coloane se face cu atributul cols al etichetei <frameset> ;
• valoarea atributelor cols și rows este o listă de elemente despărțite prin virgulă,
care descriu modul în care se face împărțirea, și pot fi: o un număr întreg de pixeli;
o procente din dimensiunea ferestrei (1 ÷ 99 %); o
n* care înseamnă n părți din spațiul rămas;

Exemplu 1 : Se creează o pagină Web cu trei cadre mixte. Se împarte fereastra în două
subferestre orizontale, se umple prima subfereastră cu fișierul index.html, după care se

Cap 5: Limbaje de programare și Tehn ologii Web
71 împarte a doua subfereastră în două coloane, una se umple cu winxp.gif și cealaltă cu
index2.html.
<html>
<head><title>cadre</title></hea d>
<frameset rows="*,*">
<frame src="index.html">
<frameset cols="35%,*">
<frame src="winxp.gif">
<frame src="index2.html">
</frameset>
</frameset>
</body>
</html>

Atribute ale chenarelor:
• culori pentru chenare: bordercolor – are valori specifice pentru culori, și pot însoți
etichetele <frameset> și <frame> ;
• dimensionarea chenarului unui cadru : border – pentru <frameset> – are valoarea
în pixeli, 0 = cadru fără chenar.;
• frameborder = 0 – nu se afișează chenarul cadrului;
• bare de defilare – scrolling – pentru <frame> – adaugă unui cadru o bară de
derulare, valori posibile: "yes", "no" și "auto";
• noresize – împiedică redimensionarea cadrului cu mouse -ul;
• marginheight și marginwidth – stabilesc distanța în pixeli dintre conținutul
cadrului și marginile vertical e/orizontale, și pot lua valorile: număr de pixeli sau
procent din lățime/înălțimea cadrului;

Cadre interne
Un cadru intern este specificat prin intermediul blocului <iframe>…</iframe> .
Un cadru intern se inserează într -o pagina Web în mod asemănăt or cu o imagine
așa cum rezultă din următorul exemplu:
<iframe src="pagina1.html" height=40% width=50%> </iframe>
În acest caz, s -a specificat o fereastră de cadru intern care are 40% din înălțimea și
50% din lățimea paginii curente.
Atributele accep tate de eticheta <iframe> sunt în parte preluate de la etichetele
<frame> și <frameset> , cum ar fi: rc, border, frameborder, bordercolor,
marginheight, marginwidth, scrolling, name, noresize; sau de la eticheta
<img> vspace, hspace, align, width, heig ht;

<html>
<head><title>Cadre_interne</title> </head>
<body>
<a href="index1.html" target="icad">Pagina1</a><br>
<a href="index2.html" target="icad">Pagina2</a><br>
<a href="index3.html" target="icad">Pagina3</a><br>
<a href="index.html" targe t="icad">Acasă</a><br>
<center><iframe width="60%" height="50%" border=2 bordercolor=red
name="icad" src="acasa.html">
Dacă vedeți acest text înseamnă că browserul dumnevoastră nu suportă cadre interne.

Sisteme Informatice de Asistare a Deciziei
72 <a href="p0.html">Pagina fara cadre interne</a > </iframe></center>
</body>
</html>

5.2.10. Formulare
Un formular este un ansamblu de zone active alcătuit din butoane, casete de
selecție, câmpuri de editare etc.
Formularele ajută la realizarea paginilor Web care permit utilizatorilor să intr oducă
informații și să le transmită serverului. Formularele pot fi de la simple la foarte complicate.
Un formular este definit într -un bloc delimitat de etichetele corespondente <form>
și </form> .

Elementul FORM
<form [action=url] [method=get/post] [ enctype=MIMEType]
[onsubmit=script] [onreset=script] [acceptcharset= set_caractere]
[core] [international] [events]>
Elementele formularului
</form>

Elementul INPUT
<input
[type=text|password|checkbox|radio|submit|image|reset|button|hidden|
file] [name=nume]
[value=valoare] [checked] [disabled] [readonly] [size=latime]
[maxlength=cuvinte_maxime] [src=url]
[alt=altText] [usemap=url] [align=left|center|right|justify]
[tabindex=numar] [accesskey=keyCombo]
[onfocus=script] [onblur=script] [onselec t=script] [onchange=script]
[accept=set_caractere] [core] [international] [events]>
Acest element input este cel mai important in utilizarea formularelor.

Atributele esențiale ale elementului <form> sunt:
• action precizează ce se va întâmpla cu datele formularului odată ce acestea ajung
la destinație. <form action="http://www.yahoo.com/cgi –
bin/nume_fis.cgi">. Script -urile pot fi scrise in limbajele Perl,C,PHP,Unix
shell.
• method precizează metodă utilizată de browser pentru expedierea datelor
formula rului. Sunt posibile următoarele valori: o get (implicit) – caz în care datele
din formular sunt adăugate la adresa URL precizată de atributul action ; nu sunt
permise cantități mari de date (maxim 1 Kb) – între adresa URL și date este inserat
un "?". o post – caz în care datele sunt expediate separat. Sunt permise cantități
mari de date (ordinul MB)
Pentru ca un formular să fie funcțional, trebuie precizat ce se va întâmpla cu el
după completarea și expediere.
Cel mai simplu mod de utilizare a unui for mular este expedierea acestuia prin poșta
electronică (e -mail).

Cap 5: Limbaje de programare și Tehn ologii Web
73 Pentru aceasta se folosește un atribut al etichetei <form> sș anume action care
primește ca valoare "mailto:" concatenat cu o adresa validă de e -mail către care se va
expedia formularul comp letat.

Elementele unui formular sunt definite cu eticheta <input> , care are următoarele
atribute:
• type – indică tipul datelor care vor fi introduse:
o text = text, o submit = buton de trimitere / validare, o reset = buton de
reset / ștergere,
o passw ord = parola, acest câmp de editare nu afișează caracterele în clar, ci
numai caractere *, care ascund de privirile altui utilizator aflat în apropiere
valoarea introdusă într -un asemenea câmp.
o hidden = nu este vizibil,
o checkbox = caseta de validare, (c heckbox) permite selectarea sau
deselectarea unei opțiuni;
o radio = buton radio, permit alegerea, la un moment dat, a unei singure
variante din mai multe posibile;
o file = fișier pentru upload;
o select = listă de selecție – permite utilizatorului să aleagă unul sau mai
multe elemente dintr -o listă finită.
Majoritatea tipurilor date de type pot primi următorii parametri:
– name – permite atașarea unui nume fiecărui element al formularului;
– value – permite atribuirea unei valori inițiale unui element al for mularului
– size – numărul de caractere vizibile din câmp, dacă se depășește numărul de
caractere introduse, are loc o derulare a textului;
– maxlenght – numărul maxim de caractere introduse în câmpul de editare,
caracterele introduse în plus sunt neglijate;
– readonly – datele prezente în câmp nu pot fi modificate.

Exemplu 1: Formular cu câmp de editare și buton de
expediere:
<html>
<head><title>Formular_1 </title></head>
<body> Formular cu un camp de editare<hr>
<form action="mailto:xxxxx@xxx.c om"
method="post">
Numele: <input type="text" name="numele" value="Popescu Vasile"><br>
<input type="submit" value="expedieaza">
</form>
</body>
</html>
Exemplu 2: Buton RESET
<input type="reset" value="RESET">

Exemplu 3: Editare parolă :

Sisteme Informatice de Asistare a Deciziei
74
Password:<input type="password" name="parola" >

Exemplul 4: Butoane radio:
Alegeti sexul<br>
Masculin:<input type="radio" name="sex" value="b"><br>
Femeiesc:<input type="radio" name="sex" value="f"><br>

Exemplul 5: Casete de validare:
Alegeti meniul:<br>
Pizza <input type="checkbox" name="pizza" value="o portie">
Nectar <input type="checkbox" name="nectar" value="un pahar">
Bere <input type="checkbox" name="bere" value="o sticla">
Cafea <input type="checkbox" name="cafea" value="o ceasca"><br>

Exemplul 6: Casete de fișiere
Alegeti fisierul:<input type="file" name="fisier"
enctype="multipart/form -data"><br>

Exemplul 7: Liste de selecție
Judetul Resedinta:<br>
<select name="Judetul" size="3">
<option value="AB"> Alba
<option value="AR " selected> Arad
<option selected value="BC" selected> Bacau
<option value="B"> Bucuresti
<option value="BV"> Brasov
</select><br><br>

Exemplul 8: Câmpuri de editare multilinie – acestea pot fi introduse cu tag -ul
<textarea> , care suportă următoa rele atribute:
• cols – specifică numărul de caractere afișate pe o linie;
• rows – specifică numărul de linii afișate simultan;
• name – atașează un nume câmpului de editare multilinie;
• wrap – (world wrap) – trecerea cuvintelor pe rândul următor : determină
comportamentul câ,pului de editare față de sfârșitul de linie, și poate fi: o off =
întreruperea cuvintelor la marginea dreaptă a editorului se produce numai când
dorește utilizatorul; caracterul de sfârșit de linie este inclus în textul transmis
serverul ui o dată cu formularul
o hard = se produce întreruperea cuvintelor la marginea dreapta a editorului
; caracterul de sfârșit de linie este inclus în textul transmis serverului o dată
cu formularul;
o soft = se produce întreruperea cuvintelor la marginea drea ptă a editorului;
nu se include caracterul de sfârșit de linie în textul transmis serverului o
dată cu formularul.

Cap 5: Limbaje de programare și Tehn ologii Web
75
<textarea name="text multilinie"
cols="30" rows="5" wrap="off">
Prima linie din textul initial. A
doua linie din textul initial.
</textarea>

Exemplu final:
În exemplul următor este prezentat un formular conținând elemente prezentate
anterior. Câmpurile formularului sunt incluse în celule unui tabel pentru a obține o
aliniere dorită.
<html>
<head><title>formex_10</title></head>
<body><h1>Un formular complex</h1> <hr>
<center><table bgcolor="orange"> <form action="mailto:xxxxx@xxx.com"
method="post">
<caption align="top">MENIU</caption>
<tr align=left><th>Numele:
<td><input type="text" name="numele">
<tr align=left><th>Preumele:
<td><input type="text" name="prenumele"> <tr align=left><th>Telefonul:
<td><input type="text" name="telefonul"> <tr align=left><th>Alegeti
pizza:
<td><input type="checkbox" name="ciuperci">cu ciuperci
<input type="checkbox" name="mexicana">mexicana <i nput type="checkbox"
name="europeana">europeana
<tr align=left><th>Alegeti plata:<td>
<ul style="background -color:lightblue;"> <li><input type="radio"
name="plata">cash <li><input type="radio" name="plata">card </ul> <tr
align=left><th>Comentarii:
<td> <textarea name="comentarii" cols="30" rows="5" wrap="off">
Inserati aici aprecierile dumneavoastra legate de calitatea
serviciilor noastre </textarea> <tr align=left valign=top><td>
<input type="reset" value="sterge"><td> <input type="submit"
value="exped ieaza"> </form></table></body>
</html>

Observații:
• elementul <form> poate avea un atribut target , care primește ca valoare numele
unei ferestre a browserului în care va fi încărcat răspunsul trimis serverului WWW
la expedierea unui formular.
• toate elementele cuprinse într -un formular pot avea un atribut disabled care
permite dezactivarea respectivului element.
• toate elementele de tip text cuprinse într -un formular pot avea un atribut readonly
care interzice modificarea conținutului acestor element e.

http://www.worklance.com/htmltutorial/
http://www.drogoreanu.ro/tutorials/index.php

Sisteme Informatice de Asistare a Deciziei
76 5.3. Limbajul XML
eXtensible Markup Lang uage(XML) este un meta -limbaj de marcare recomandat
de Consor țiul Web pentru crearea de alte limbaje de marcare, cum ar fi XHTML, RDF,
RSS, MathML, SVG, OWL etc. Aceste limbaje formează familia de limbaje XML. Meta –
limbajul XML este o simplificare a limbajului SGML (din care se trage și HTML) și a fost
proiectat în scopul transferului de date între aplicații pe internet. XML este acum și un
model de stocare a datelor nestructurate și semistructurate în cadrul bazelor de date native
XML.

5.4. XHTML
eXtensible HyperText Markup Language, sau XHTML, este un limbaj de marcare
ce are aceleași capabilități expresive ca și HTML, dar cu o sintaxă mai strictă. XHTML
poate fi considerat ca încrucișarea dintre HTML și XML în multe privințe, fiind o
reformulare a HTML în XML. XHTML 1.0 a devenit o recomandare World Wide Web
Consortium (W3C) pe data de 26 ianuarie 2000
5.5. CSS
5.5.1. Introducere în css
Fișierul CSS (cascading style sheet = foi de stil în cascada) permite separarea
conținutului (X)HTML de stilul de afișare în pagina. Se utilizează codul (X)HTML pentru
aranj area conținutului în pagina, însă toată prezentarea (fonturi, culori, fundaluri, borduri,
etc) se realizează din fișierul CSS. În acest moment, se pot folosi CSS -uri în două moduri,
și anume interne sau externe.

Stilurile interne
În acest caz, codul CS S va fi plasat în interiorul fiecărei pagini html în care vom
folosi stilurile respective, și v codul CSS va fi scris între tagurile <head>…</head> . Acest
lucru se face după cum se poate vedea în exemplul de mai jos:
<head>
<title>titlu pagina</title>
<style type="text/css"> Aici se definesc stilurile CSS </style>
</head>

Folosind această metodă (stilurile interne), fiecare fișier (X)HTML va conține
codul CSS folosit la stilizare. Asta înseamnă că atunci când se dorește realizarea unei
schimbări de sti l, (mărimea fontului, culoare, etc) va trebui să se opereze modificarea în
toate paginile ce conțin acel stil. Metoda descrisă până acum este bună atunci când avem
de stilizat două, trei pagini, însă când avem de a face cu siteuri de zeci sau sute de pagin i
este destul de neplăcut să modificăm toate paginile.

Stilurile externe
În acest caz, se creează un fișier CSS extern (cu orice editor de text simplu:
Notepad, Wordpad) sau cu editoare avansate. De reținut că fișierul CSS va conține doar
cod CSS și tr ebuie salvat cu extensia *.css.

Cap 5: Limbaje de programare și Tehn ologii Web
77 Inserarea acestui fișier .css în pagina (X)HTML se face foarte simplu, prinplasarea
unui link în secțiunea <head>…</head> a fiecărei pagini în care dorim să folosim stilul
respectiv. Iată un exemplu de inserare a unui fiș ier extern .css într -o pagină (X)HTML:
<link rel="stylesheet" type="text/css" href="Calea catre fisierul.css"
/> sau se poate folosi metoda de import după cum urmează:
<style type="text/css">@import url( Calea catre fisierul.css )</style>

Oricare din tre metode este bună și se obține plasând unul dintre codurile de mai
sus în secțiunea <head> </head> a paginii, după cum se exemplifică mai jos:
<head>
<title> titlu pagina </title>
<link rel="stylesheet" type="text/css" href="stil.css" />
</head>
sau
<head>
<title> titlu pagina </title>
<style type="text/css"> @import url( Calea catre fisierul.css )
</style>
</head>
Folosind metoda fișierelor CSS externe, toate paginile (X)HTML vor folosi același
fișier de stil. Asta înseamnă că dacă doriți să faceți o schimbare care să aibă efect în toate
paginile, este de ajuns să modificați un singur fișier, și anume cel de stil (.css), și efectul
se va observa pe toate paginile (X)HTML ce folosesc acel fișier. Astfel faceți schimbări
în tot siteul, indiferen t de câte pagini are, fără efort și mai ales foarte repede.
Iată câteva motive pentru care aceasta metodă este mai bună:
• întreținere mai ușoară;
• dimensiuni reduse ale paginilor;
• economie de bandă internet;
• flexibilitate;
• ordinea cascadelor

De reți nut că se pot folosi atât stilurile externe cât și cele interne simultan, dar mai
există o posibilitate, și anume a stilurilor în linie (inline style).

Stilurile in linie
Acest tip de stil (nu tocmai recomandat) se definesc chiar în codul (X)HTML, în
elementul pe care dorim să îl stilizăm, așa cum se vede mai jos:
<p style="color: #ff0000;">Text roșu</p>
Text roșu

Stilurile în linie nu permit schimbări rapide și facile, pe mai multe fișiere în același
timp, fiecare element necesitând atenția dvs, pe toate paginile, etc.

Metoda cea mai bună este , în mod firesc, aceea care ne avantajează cel mai mult.
Trebuie reținută ordinea folosirii lor pentru o interpretare corectă de către browsere. Toate
metodele, se vor executa în cascada, într -o "pseudofo aie de stil", în ordinea următoare:
• stiluri în linie;

Sisteme Informatice de Asistare a Deciziei
78 • foaie de stil internă;
• foaie de stil externă.

Dacă ne referim la "care este mai bună", putem spune că depinde de ceea ce vați
propus să realizați/obțineți. Dacă aveți o singură pagină pe care treb uie să o stilizați, puteți
folosi metoda stilurilor interne fără nici o problemă. Pe de altă parte, dacă aveți de stilizat
un număr mare de pagini, cel mai bine este să folosiți foile de stil externe. Modul în care
se vor implementa foile externe în pagini rămâne la latitudinea proiectantului, și se poate
alege între metoda cu link sau metoda cu @import , după cum sa exemplificat mai sus.
Trebuie specificat însă că metoda importului (@import) va fi un pic mai greoaie,
fiind posibil să dureze o secundă, două , până se încarcă foaia de stil, timp în care conținutul
este afișat nestilizat.
Utilizatorii cu dizabilități
Folosirea foilor de stil externe mai are un avantaj major, și anume permit
vizualizarea conținutului paginii html și de către utilizatorii cu di sabilități. De exemplu,
utilizatorul respectiv, poate renunța la folosirea foii de stil pe care ați definit -o dvs și poate
aplica o foaie de stil specială, a lui, care îl ajută să vizualizeze pagina într -un mod facil.
Poate mări fontul, poate schimba culor ile, etc.
Probleme de browser : nu toate browserele interpretează la fel stilurile. CSS -ul va
fi interpretat diferit de browsere, ceea ce va cauza dureri de cap. Există totuși metode de
rezolvare a acestor probleme, care vor fi explicate la momentul potri vit.
5.5.2. Sintaxa css
Sintaxa CSS -ului este diferită de cea a (X)HTMLului, însă nu este foarte dificil de
înțeles
Sintaxa CSS -ului este compusă doar din 3 părți:

Selectorul:
selector { proprietate: valoare }

Selectorul este elementul (X)HTML p e care dorești să îl stilizezi. Proprietatea este
chiar titlul (numele) proprietății respective, iar valoarea reprezintă stilul pe care îl aplici
proprietății.
Fiecare selector poate avea multiple proprietăți, si fiecare proprietate din acel
selector are valori independente.
Proprietatea este separată de valoare cu semnul " :". Toate proprietățile împreună
cu valorile lor, aparținând aceluiași selector sunt cuprinse între acolade " {…}". Multiplele
valori din aceeași proprietate sunt separate prin virgulă " ," și dacă o valoare conține mai
mult de un cuvânt, acestea se cuprind între ghilimele '"'.
Exemplu:
body { background:
#eeeeee;
fontfamily: "Trebuchet MS", Verdana, Arial, serif;
}

Cap 5: Limbaje de programare și Tehn ologii Web
79 După cum se observă, culoarea fundalului (background) este separat ă de font
(fontfamily) cu ajutorul semnului " ;" și un tab (semicoloana), diferitele valori pentru font
sunt despărțite prin virgule, iar valoarea "Trebuchet MS", deoarece conține două cuvinte,
este cuprinsă între ghilimele.
Aplicând acest stil vom obține un corp de pagina (body) de culoare gri deschis, iar
fontul folosit va fi unul despre care suntem siguri că majoritatea utilizatorilor îl au instalat
pe sistemele lor.
Layoutul codului se poate modifica, însă este mai ușor de citit dacă fiecare
proprietat e este pe o linie separată, una sub alta, fiecare cu un tab în față.

Moștenirea:
Atunci când se plasează un element în interiorul altuia, elementul plasat va moșteni
proprietățile elementului în care a fost plasat. Asta doar daca nu se atribuie aceleaș i
proprietăți însă cu valori diferite fiecărui element. De exemplu, un font specificat pentru
corp (body) va fi folosit în toată pagina, indiferent de elementul unde este folosit, doar
dacă nu se specifică un font diferit pentru elementul respectiv.

body {fontfamily: Verdana, serif;}

În acest caz, tot textul din fișierul (X)HTML va folosi fontul Verdana. Dacă se
dorește folosirea unui alt font pentru un element anume (de exemplu pentru paragraf sau
pentru H1), va trebui să se definească acest lucru, cum este și în exemplul de mai jos:

h1 {fontfamily: Georgia, sansserif;} p
{fontfamily: Tahoma, serif;}

Acum toate tagurile vor folosi fontul Georgia și toate paragrafele (<p>) vor folosi
Tahoma, lăsând totuși restul textului (din alte taguri) neschi mbat, folosind în continuare
Verdana.
Există însă și cazuri în care elementele plasate în interiorul altor elemente, nu
moștenesc proprietățile acestora din urmă. De exemplu, dacă marginea pentru corp este
setată la valoarea de 20 pixeli, celelalte elemen te din pagina nu vor avea și ele marginea
setată la 20 de pixeli.
body {margin: 20px;}

Combinarea selectorilor
Se pot combina elementele unui selector astfel:
h1, h2, h3, h4, h5, h6 { color:
#009900;
fontfamily: Georgia, sansserif;
}
După cum se o bservă în exemplul de mai sus, am grupat toate elementele de tip
header într -un singur selector. Ele sunt separate de virgule. Rezultatul acestui stil este acela
că toate tagurile header vor fi de culoare verde cu font Georgia. Dacă un utilizator nu are
instalat pe sistem primul font (Georgia), atunci se va folosi în mod automat următorul font,
și anume sansserif.

Sisteme Informatice de Asistare a Deciziei
80 Tagurile de comentarii
Comentariile, ca și în cazul programării în alte limbaje, sunt foarte folositoare, și
pot ajuta la identificarea rapidă a unui anume element sau rolul pe care acel element îl are.
Se pot folosi comentariile și în fișierele .css, după cum se exemplifică în continuare: /*
Acesta este un comentariu si nu va fi interpretat de browsere */

se poate observa că modul de inserare al comentariilor este identic ca în C++ și
php, testul este introdus între caracterele /* … */.
5.5.3. Clasele css
Clasele ne permit să stilizăm anumite taguri sau elemente din codul (X)HTML,
diferențiat. Similar cu metoda "in linie" din introducere în css. Excepția în cazul claselor
constă în faptul că stilurile pot fi schimbate prin schimbarea foii de stil. Astfel se poate
folosi același selector în fișierul (X)HTML și totuși pagina va arăta diferit, în funcție de
foaia de stil utilizată.

Exemplu:
Ca să o spunem cat mai simplu, propoziția pe care o citiți, este definită în
foaia de stil CSS astfel: p { fontsize: small; color: #333333;
}

Simplu, însă, dacă doresc să schimb culoarea cuvântului "propozitia" în verde,
bold, lăsând însă restul propo ziției neschimbată? Se va folosi următorul cod în fișierul
(X)HTML:
Ca sa o spunem cat mai simplu , <span class = "verdeboldtext"> "propoziția"
</span> pe care o citiți, este definită în foaia de stil CSS astfel:
.verdeboldtext {
fontsize: small;
color: #008080;
fontweight: bold;
}

Rezultatul final arăta așa:
Ca să o spunem cât mai simplu, " propoziția " pe care o citiți, este definită
în foaia de stil CSS astfel

De reținut că că definirea unei clase începe cu semnul punct (.). Numele de
"verdeboldt ext" este dat doar de exemplu, se poate folosi orice denumire, însă
recomandarea este să se folosească denumiri intuitive, care să spună rapid cum arată stilul
respectiv. Se poate folosi clasa ".verdeboldtext" ori de câte ori este nevoie.

5.5.4. IDurile css
IDurile sunt similare cu clasele, cu excepșia ca un ID nu poate fi folosit pe aceeași
pagină (X)HTML decât o singură dată. În general, ID -urile se folosesc pentru stilizarea

Cap 5: Limbaje de programare și Tehn ologii Web
81 elementelor dintr -o pagină care apar doar o singură dată, altfel, folosirea claselor este
recomandată. Containerul principal al paginii din exemplul de mai jos, este definit astfel:
<div id="container">
Tot conținutul paginii este plasat în acest container.
</div>

Sa folosit ID -ul în loc de clasă, deoarece elementul respecti v apare o singură dată
pe pagină. Urmează codul din fișierul CSS, care arata astfel:
#container { width: 80%;
margin: auto; padding:
20px; border: 1px solid
#666; background:
#ffffff;
}
De observat că selectorul IDurilor începe cu semnul diez (#) și nu cu punct (.) cum
se întâmplă în cazul claselor.

5.5.5. Utilizarea css în paginile (X)HTML.
5.5.5.1. Divizii
Divizia poate fi definită ca: element de tip bloc folosit pentru definirea unor zone
din fișierul (X)HTML. O divizie poate conține toate părțil e care alcătuiesc siteul dvs.,
incluzând alte divizii, spanuri, imagini, text, etc. Se poate defini o divizie într -un fișier
(X)HTML, plasând următorul cod între tagurile <body>… </body> :
<div>
Conținutul sitului este plasat aici
</div>

Bineînțeles, acesta poate fi stilizat un pic. Se modifică în acest caz, astfel:
<div id="container">
Conținutul sitului este plasat aici
</div>

Iar în fișierul css avem următorul cod:
#container{ width:
70%; margin: auto;
padding: 20px; border:
1px solid #666 ;
background: #ffffff;
}

Acum, tot conținutul din divizia noastră va fi stilizat după regula "container", pe
care am definit -o în fișierul css. O divizie, realizează implicit o trecere la linie nouă
(linebreak). Se pot folosi atât ID -urile cât și clase le pentru stilizarea unei divizii în cadrul
siteului.

Sisteme Informatice de Asistare a Deciziei
82 5.5.5.2. Spanul css
Spanurile sunt similare diviziilor cu excepția că sunt de tipul "in linie" și nu de tip
"bloc". Spanurile nu execută implicit linie nouă după inserarea lor. Se poate folosi spanu l
pentru stilizarea unor zone de text, după cum urmează:
<span class="italic"> Acest text este italic </span>

În fișierul CSS avem:
.italic{
fontstyle: italic;
}

Rezultatul final este: Acest text este italic .
5.5.5.3. Marginile css
Moștenite: NU
După cum probabil vă dați seama, proprietatea "margine" se referă la marginea
(spațiul) dintre un element (X)HTML și celelalte elemente din jurul lui. Marginea poate fi
setată pentru extremitățile "sus", "stânga", "dreapta" și "jos" ale unui element. Vezi
exemplul de mai jos:
margintop: lungime / procente sau auto;
marginleft: lungime / procente sau auto;
marginright: lungime / procente sau auto;
marginbottom: lungime / procente sau auto;

După cum se observă în exemplul de mai sus, avem la dispoziție 3 variante pentru
valori pentru margine: lungime, procent, auto. De asemenea, se pot declara toate cele 4
margini într -o singura proprietate:
margin: 10px 10px 10px 10px;

Dacă se folosește varianta din urmă, ordinea marginilor este următoarea:
1. sus
2. dreapta
3. jos
4. stânga

Dacă este declarată o singură valoare, aceasta este valabilă pentru toate cele 4
margini:
margin: 10px;

În cazul în care se declară doar două sau trei dintre margini, valorile nedeclarate
sunt "luate" din partea opusă:
margin: 10p x 10px; /* 2 valori */
margin: 10px 10px 10px; /* 3 valori */

Se poate seta marginea și cu valori negative. În cazul în care nu se declară
marginile unui element, acestea sunt în mod implicit egale cu zero.
margin: 10px;

Cap 5: Limbaje de programare și Tehn ologii Web
83
Elementele precum paragrafel e (<p>) au margini implicite în anumite browsere,
așa că va trebui să fie declarată marginea egală cu zero ca sa nu existe diferențe de randare
în browsere diferite. Acest lucru se obține astfel:
p {margin: 0;}

NOTĂ : dacă valoarea care se atribuie marg inii este egală cu zero, nu mai este necesară
specificarea unității de măsură, fie ea pixel, punct, sau oricare alta.
Se poate observa în exemplul de mai jos, cum elementele sunt setate la 20px
(pixeli) față de corp (body).
body{ margin: 20px;
background: #eeeeee;
fontsize: small;
fontfamily: Tahoma, Arial, "Trebuchet MS", Helvetica, sansserif;
textalign: left;
}

5.5.5.4. Padding css
Mostenit: NU
Paddingul este distanța dintre bordura unui element (X)HTML și conținutul lui.
Majoritatea re gulilor de la marginile css se aplica și la padding, cu excepția că aici nu
există valoarea "auto" și nu pot fi declarate valori negative.
paddingtop: lungime / procent;
paddingleft: lungime / procent;
paddingright: lungime / procent;
paddingbottom: lungi me / procent;

Se poate observa în exemplul de mai sus, că avem la dispoziție două posibilități
pentru proprietatea "padding": lungime și procent. Este posibil să se declare paddingul
pentru un element într -o singură proprietate, astfel:
padding: 10px 1 0px 10px 10px;

Daca se declară toate cele patru valori, ca în exemplul de mai sus, ordinea lor este
următoarea: 1. sus; 2. dreapta; 3. jos; 4. stânga
În cazul în care se declară o singura valoare, aceasta este valabila pentru toate cele
patru laterale ale elementului respectiv.
padding: 10px;
Dacă se declară doar două sau trei valori, valorile nedeclarate sunt luate din părțile
opuse:
padding: 10px 10px; /* 2 valori */
padding: 10px 10px 10px; /* 3 valori */

După cum știți ordinea celor 4 valori e ste: sus, dreapta, jos, stânga. Când declarați
doar primele două înseamnă ca ați declarat valoarea pentru sus și pentru dreapta. Valorile
pentru celelalte două vor fi: jos=sus, stânga=dreapta.
Daca nu declarați paddingul unui element, acesta va fi implici t egal cu zero.

Sisteme Informatice de Asistare a Deciziei
84 NOTA : dacă valoarea pe care o atribuiți marginii este egala cu zero, nu mai este necesara
specificarea unității de măsură, fie ea pixel, punct, sau oricare alta.

Se poate vedea mai jos, cum containerul principal are paddingul setat la 30px
(pixeli) între marginea lui și textul conținut.
#container{ width: 70%;
margin: auto; padding:
30px; border: 1px solid
#666; background:
#ffffff;
}

5.5.5.5. Fonturi css
Moștenit: DA
Fontul
Proprietățile fontului pot stabili stilul, mărimea, înălțimea liniei și tipul fontului
folosit:
font: italic bold normal small/1.4em Verdana, sansserif;

Exemplul de mai sus setează textul unui element, ca fiind italic, bold, de mărime
relativă, cu distanța între linii de 1.4em și un font Verd ana sau orice alt font de tipul
sansserif.
Familia de fonturi
Se poate stabili ce font va fi folosit la afișare cu ajutorul proprietății "fontfamily".
Există două posibilități pentru valori:
* familyname
* generic family

Dacă se stabilește o anumită fa milie de fonturi, este bine să se specifice la sfârșit
și o familie generică de fonturi. Ca si cum ar fi o listă de priorități. Astfel încât, dacă
vizitatorul nu are instalate fonturile preferate de dvs, vor fi folosite fonturile din familia
generică.
fontfamily: Verdana, sansserif;

Mărimea fontului
Mărimea textului este dată de proprietatea "fontsize":
fontsize: valoare;
Există o mulțime de posibilități pentru valoare: xxlarge, xlarge, larger, large,
medium, small, smaller, xsmall, xxsmall, length, % (procent).

Stilul fontului
Proprietatea "fontstyle" specifică stilul fontului:
fontstyle: valoare;

Posibilele valori pot fi: normal. Itailc, oblique.

Cap 5: Limbaje de programare și Tehn ologii Web
85 Varianta fontului
Putem stabili varianta fontului cu ajutorul proprietății fontvariant:
fontvariant: valoare;
Pentru "valoare" se pot folosi următoarele variante: normal, smallcaps

Grosimea fontului
Grosimea fontului folosit este controlata de proprietatea "fontweight":
fontweight: valoare;
Posibilele valori sunt: lighter, normal, 100, 20 0, 300, 400, 500, 600, 700, 800, 900,
bold, bolder.

5.5.5.6. Ancore, linkuri și pseudo clase
În continuare se prezintă câteva metode prin care se poate utiliza CSS -ul pentru a
stiliza link -urile:
• a:link {color: #009900;} – setează culoare unui link im plicit, când nu are loc
nici un eveniment;
• a:visited {color: #999999;} – ne arata ce culoare are linkul, când vizitatorul
a vizitat deja pagina respectivă, mai exact a executat click anterior pe acel link
• a:hover {color: #333333;} – setează culoarea linku lui atunci când mouseul
este deasupra lui. Este evenimentul cunoscut ca și "mouseover" (mouse deasupra);
• a:focus {color: #333333;} – este asemănătoare cu cea anterioară, însă are
efect când utilizatorul folosește tastatura pentru navigare (tasta "Tab") și nu
mouseul;
• a:active {color: #009900;} specifică culoarea unui link atunci când acesta
este apăsat. La click pe link, culoarea se va schimba cu cea specificată în această
linie.

NOTĂ: Trebuie declarat "a:link" și "a:visited" înainte de "a:hover". Mai mult, trebuie
declarat "a:hover" înaintea lui "a:active".
Folosind regula generală de mai sus, toate linkurile din pagina dvs vor fi afectate,
și vor folosi această regulă. Se pot seta stiluri de linkuri separate pentru anumite porțiuni
din pagină, dacă se dorește acest lucru.

5.5.5.7. Pseudo Clasele
Este posibilă setarea de culori diferite pentru linkurile din pagină (de exemplu
meniul de o culoare, linkurile din text de o altă culoare, etc ) folosind pseudoclasele.
De exemplu, să spunem că se dore ște ca linkurile din text să fie diferite de cele din
coloana din stânga sau dreapta. Se poate obține acest lucru astfel:
#content a:link {color: #009900;}
#content a:visited {color: #999999;}
#content a:hover {color: #333333;}
#content a:focus {color: #333333;}
#content a:active {color: #009900;}

Sisteme Informatice de Asistare a Deciziei
86 Presupunând ca avem conținutul principal într -un div numit "content", toate
linkurile din acest div vor fi stilizate de acest selector. Daca div -ul are alt nume este de
ajuns să se schimbe numele în foaia de stil din "#content" în unul potrivit.
Apoi, linkurile dintr -o coloană se stilizează așa:
#column a:link {color: #009900;}
#column a:visited {color: #999999;}
#column a:hover {color: #333333;}
#column a:focus {color: #333333;}
#column a:active {co lor: #009900;}

Încă odată, presupunem ca divul coloanei se numește "column". Aceeași metodă
se aplică și pentru a declara o clasa în loc de un Id.
a.column:link {color: #009900;}
a.column:visited {color: #999999;}
a.column:hover {color: #333333;}
a.column:focus {color: #333333;}
a.column:active {color: #009900;}

În acest caz însă, va trebui să atribuim fiecărui link clasa potrivită:
<a class="column" href="#" title="textul linkului"> textul linkului
</a>

Există totuși o cale mai ușoară:
.column a:link {color: #009900;}
.column a:visited {color: #999999;}
.column a:hover {color: #333333;}
.column a:focus {color: #333333;}
.column a:active {color: #009900;}

… urmând ca în fișierul (X)HTML să avem:
<div class="column">
<a href="#" ti tle="textul linkului"> textul linkului </a>
< /div>

Sunt și alte proprietăți care pot fi aplicate linkurilor, aproape orice proprietate
folosită la stilizarea textului poate fi aplicată și la linkuri.

5.5.5.8. Fundaluri css
Mostenit: NU Fundalul
Fundalul unui element poate fi stilizat cu o declarație de proprietate adecvată.
background: #ffffff url(calea_catre_imagine) top left norepeat fixed;
Valori: attachment color image position repeat

Sau, se poate seta fiecare proprietate separat , după cum urmează:

Cap 5: Limbaje de programare și Tehn ologii Web
87 Atașament fundal
Daca se folosește o imagine ca fundal, se poate specifica dacă fundalul se mișcă o
dată cu pagina (la scroll vertical) sau este fix cu ajutorul proprietății
"backgroundattachment".
backgroundattachment: valoare;
Valori: fixed, scroll

Culoarea fundalului Proprietatea "backgroundcolor" specifică culoarea
fundalului:
backgroundcolor: valoare;
Posibile valori: color name, hexadecimal number, RGB color code, transparent

Imaginea de fundal Se poate seta o imagine ca fundal al unui element, cu
proprietatea "backgroundimage".
backgroundimage: url(calea_catre_imagine);
Valori: url, none

Pozitia fundalului – Imaginea folosită cu rol de fundal se poate poziționa cu
ajutorul proprietății backgroundposition.
backgroundposition: valoare;
Valorile posibile sunt: top left, top center, top right, center left, center center, center
right, bottom left, bottom center, bottom right, x%, y%, xpos, ypos.

Repetarea fundalului – Se poate face ca imaginea folosită la fundal să se repete pe
axa x sau pe axa y a ecranului folosind proprietatea "backgroundrepeat".
backgroundrepeat: valoare;
Valori: norepeat, repeat, repeatx, repeaty.

5.5.6. Validarea fișierelor CSS
Subiectul validării fișierelor (X)HTML sau CSS a fost, și este încă, dezbătut pe
multe forumuri de specialitate și probabil va mai fi mult timp de acum înainte. Întotdeauna
vor fi păreri pro validare și păreri contra. Haideți să vedem care sunt câteva dintre
avantajele și dezavantajele obținute în urma alegerii n oastre de a valida sau nu o pagină.
Definirea validării codului: validarea unei pagini ne asigură că sintaxa codului scris
este corectă, conform specificațiilor "W3 Consortium". (organizație al cărei scop este
acela de a emite specificații ce asigură prom ovarea unui web "curat" și standardizat)
Trebuie să spunem însă, că dacă avem o pagină validă, asta nu înseamnă neapărat
că ea va fi afișată corect pe toate browserele.

Motive pentru validarea codului:
1 Asigurarea compatibilității pe cât mai multe brow sere – Chiar dacă realizați
siteul în așa manieră încât se vede perfect în browserul dvs favorit, este posibil să nu fie
afișat corect în toate browserele. Asta pentru că nu toate au același sistem de randare al
paginii, unele sunt mai permisive cu erorile , altele mai stricte, etc. Având o pagină validă,

Sisteme Informatice de Asistare a Deciziei
88 ne asigurăm că am eliminat cel puțin o problemă, si obținem o compatibilitate maximă cu
un număr mai mare de browsere.
2 Vizibilitate în motoarele de căutare – Când există erori (de cod, de sintaxa)
pe o pag ină, unele browsere compensează aceste erori, și afișează totuși corect pagina. Nu
la fel stă situația însă, când vorbim de motoarele de căutare. La fel ca și browserele, când
interpretează o pagină, crawlerul unui motor de căutare trebuie să interpreteze codul sursă
al paginii, și să ia anumite decizii, în funcție de conținutul găsit. Având o pagină invalidă,
riscați să nu vă fie indexată pagina, sau să fie indexată parțial.
3 Profesionalism – Până la urmă, modul în care realizați paginile web, reflectă
profesionalismul și aptitudinile dvs. Un portofoliu de siteuri valide va cântări mai greu în
fața viitorilor clienți decât un portofoliu plin de pagini invalide, chiar dacă ele se afișează
corect în browser.

Cum și unde se validează un fișier CSS?
Pentru validarea fișierelor CSS folosiți unealta pusă la dispoziție de W3C la adresa
http://jigsaw.w3.org/cssvalidator/ .

O resursă bună, în limba român ă, pentru începătorii în CSS este site -ul CssPlaza.
Prezintă sintaxa css, tutoriale css, articole. http://www.cssplaza.com/tutoriale -css/

5.6. AMP –Apache, MySQL, PHP
Acronimul pentru AMP vine d e la o soluție multi -platform alcătuită din programe
software/freeweare, folosite împreună pentru website -uri sau servere.
• Apache – Serverul web
• MySQL – baza de date
• PHP – limbajul de programare, unde poate fi și Perl sau Python

Combinarea acestor te hnologii este folosită pentru a defini infrastructura unui
server web, pentru a defini numele limbajului de programare și pentru a stabili distribuția
software de pachete.
Dacă se ține cont și de sistemul de operare utilizat avem mai multe variante, dintr e
care cele mai importante sunt LAMP pentru Linus și WAMP pentru Windows.
Cele trei aplicații menționate mai sus pot fi instalate individual, lucru care este
ceva mai complicat și care necesită mai multă muncă pentru configurare (care nu reușește
întotdea una) sau se poate utiliza o aplicație care le înglobează pe toate trei, și anume
EasyPHP , care se instalează ca orice aplicație sub Windows, și poate fi descărcat gratuit
de pe http://www.easyp hp.org/telechargements.php3 .
Cursul și laboratoarele sunt realizate pe baza cestui pachet de aplicații, în versiunea
EasyPHP 2.0 beta1, și care conține următoarele:
• Apache Version Apache/2. 2.3 (Win32)
• PHP/5.2.0
• MySQL

Pachetul este instalat în C: \Program Files \EasyPHP 2.0b1 \ iar directorul unde sunt
ținute și de unde se accesează paginile și scripturile PHP este www .

Cap 5: Limbaje de programare și Tehn ologii Web
89 ATENȚIE: Dacă fișierele HTML pot fi deschise cu un navigator Web oriu nde
s+ar afla ele, scripturile PHP trebuie apelate scriind adresa http://localhost.numefi șier.php
deoarece scriptul PHP este interpretat de serverul Web
(Apache) și rezultatul interpretării este trimis bowserului, acesta neștiind să interpreteze
PHP așa cum o face cu HTML. De asemenea, scripturile php trebuie amplasate în
directorul C:\Program Files \EasyPHP 2.0b1 \www, mai sus menționat.

Serverul web Apache HTTP este un server web pentru sistemele Unix, Microsoft
Windows, Novell NetWare, MacOS si alte sisteme. Apache este un server web important,
foarte raspandit la scara mondiala in domeniul serverelor web Apache este un server
viabil, sub licenta open source/freeweare a venit ca alternativa a altor servere web
cunoscute si dezvoltate de companii precum SunMicrosystems, Microsoft
Serverul Web Apache este dezvoltat si mentinut de o comunitate de programatori
sub numele de Apache Software Foundation, fiind promovat sub licenta Apache, Apache
HTTP Server.
Pentru a putea accesa fisierele *.html din re țea, în fișierul de configurare al
serverului apache, aflat în C: \Program Files \EasyPHP 2.0b1 \conf_files  httpd.conf,
trebuie adăugată linia de comandă listen adresa serverului, așa cum se vede mai jos:
#Listen 12.34.56.78:80
Listen 127.0.0.1:80
#Listen adresa IP a serverului , de exemplu:
Listen 192.168.1.2:80

PHP este un limbaj de programare destinat în primul rând Internetului, aducând
dinamică unei pagini de web. Este unul din cele mai importante limbaje de programare
web open -source și server -side. Numele PHP provine din limba engleză și este un acronim
recursiv : Php: Hypertext Preprocessor. Exemple faimoase de utilizare a acestui limbaj
sunt PhpBB (forum), PhpNuke(CMS), chiar și MediaWiki, software -ul din spatele
Wikipedia. Folosirea PHP poa te fi văzută ca o alternativă gratuită la utilizarea unor
limbaje comerciale cum sunt ASP de la Microsoft, ColdFusion de la Macromedia, sau
chiar JSP de la Sun Microsystems.
PHP-ul este unul din cele mai folosite limbaje de programare server -side, conform
unui studiu efectuat de Netcraft în aprilie 2002, apărând pe 9 din cele 37 milioane de
domenii cercetate în studiu. De asemenea, există un grafic al creșterii folosirii PHP -ului
pe site -ul oficial. Popularitatea de care se bucură acest limbaj de programar e se datorează
următoarelor caracteristici :
• Familiaritatea : sintaxa limbajului este foarte ușoară combinând sintaxele unora
din cele mai populare limbaje Perl sau C;
• Simplitatea : sintaxa limbajului este destul de liberă. Nu este nevoie de includere
de biblioteci sau de directive de compilare, codul PHP inclus într -un document
executându -se între marcajele speciale;
• Eficiența : PHP -ul se folosește de mecanisme de alocare a resurselor, foarte
necesare unui mediu multiuser, așa cum este Web -ul;
• Securitatea : PHP -ul pune la dispoziția programatorului un set flexibil și eficient
de măsuri de siguranță;

Sisteme Informatice de Asistare a Deciziei
90 • Flexibilitatea : fiind apărut din necesitatea dezvoltării Web -ului, PHP a fost
modularizat pentru a ține pasul cu dezvoltarea diferitelor tehnologii. Nefiind le gat
de un anumit server web, PHP -ul a fost integrat pentru numeroasele servere web
existente: Apache, IIS, Zeus, server, etc.;
• Gratuitatea : este probabil cea mai importantă caracteristică a PHP -ului.
Dezvoltarea PHP -ului sub licența open -source a determin at adaptarea rapidă PHP –
ului la nevoile Web -ului, eficientizarea și securizarea codului.

MySQL este un sistem de gestiune a bazelor de date relațional, produs de
compania suedeză MySQL AB și distribuit sub Licența Publică Generală GNU. Este cel
mai popu lar SGBD open -source la ora actuală, fiind o componentă cheie a stivei LAMP
(Linux, Apache, MySQL, PHP).
Deși este folosit foarte des împreună cu limbajul de programare PHP, cu MySQL
se pot construi aplicații în orice limbaj major. Există multe scheme API disponibile pentru
MySQL ce permit scrierea aplicațiilor în numeroase limbaje de programare pentru
accesarea bazelor de date MySQL, cum are fi: C, C++, C#, Borland Delphi, Java, Perl,
PHP, Python, FreeBasic, etc., fiecare dintre acestea folosind un tip sp ecific API. O
interfață de tip ODBC denumită MyODBC permite altor limbaje de programare ce
folosesc această interfață, să interacționeze cu bazele de date MySQL cum ar fi ASP sau
Visual Basic. În sprijinul acestor limbaje de programare, unele companii prod uc
componente de tip COM/COM+ sau .NET (pentru Windows) prin intermediul cărora
respectivele limbaje să poată folosi acest SGBD mult mai ușor decât prin intermediul
sistemului ODBC. Aceste componente pot fi gratuite (ca de exemplu MyVBQL) sau
comerciale.
Licența GNU GPL nu permite încorporarea MySQL în softuri comerciale; cei care
doresc să facă acest lucru pot achiziționa, contra cost, o licență comercială de la compania
producătoare, MySQL AB.
MySQL este componentă integrată a platformelor LAMP sau WAMP
(Linux/Windows -Apache -MySQL -PHP/Perl/Python). Popularitatea sa ca aplicație web
este strâns legată de cea a PHP -ului care este adesea combinat cu MySQL și denumit Duo –
ul Dinamic. În multe cărți de specialitate este precizat faptul ca MySQL este mult mai u șor
de învățat și folosit decât multe din aplicațiile de gestiune a bazelor de date, ca exemplu
comanda de ieșire fiind una simplă și evidentă: „exit” sau „quit”.
Pentru a administra bazele de date MySQL se poate folosi modul linie de comandă
sau, prin de scărcare de pe internet, o interfață grafică: MySQL Administrator și MySQL
Query Browser. Un alt instrument de management al acestor baze de date este aplicația
gratuită, scrisă în PHP, phpMyAdmin.
MySQL poate fi rulat pe multe dintre platformele software existente: AIX,
FreeBSD, GNU/Linux, MacOS X, NetBSD, Solaris, SunOS, Windows
9x/NT/2000/XP/Vista.

5.7. Introducere în PHP
5.7.1. Elemente de bază
Orice script PHP începe cu: " <?php " sau " <?"și se termină cu " ?>". (echivalentul
acoladelor {…} din C++ și a lui begin și end din pascal)

Cap 5: Limbaje de programare și Tehn ologii Web
91 Ca și în HTML, paragrafele, alte scripturi și coduri se introduc cu <tag> și se
termină cu </tag> .
Comentariile din text pot fi introduse astfel (ca în C++ și pascal) :
• // – se ignoră tot rândul;
• /* … */ – se ignoră t oate liniile dintre aceste tag -uri.

Primul script:
<?php
echo 'Acesta este un test <br>';// Acesta este un comentariu în
stil c++
/* Acesta este un comentariu multilinie cu
o altă formă de comentariu*/
echo "Acesta este un alt test <br> ";
echo 'un test final <br>'; # Acesta este un comentariu pe o linie
?>

Se salvează într -un fișier test1.php în directorul C:\Program Files \EasyPHP
2.0b1 \www, se deschide navigatorul Internet și se tastează: http://localhost/test1.php Pe
ecran ar trebui să apară textele dintre ghilimele.

echo – afișează pe ecran textul dintre ghilimele, care pot fi simple sau duble, dar
de același tip și la începutul și la sfârșitul textului.
<br> – break – sfârș it de linie, se trece pe rândul următor.
5.7.2. Tipuri de date, variabile, constante, operatori
PHP suportă opt tipuri de primitive, și anume:
• Patru tipuri scalar:
o Boolean , cu două valori adevărat (true) sau fals (fals),
<?php
$foo = True; // se atribuie valoarea TRUE variabilei $foo
?> o Întregi : ce pot lua valorile [… -2,-1,0,1,2,…] și pot fi decimale, octale (în baza opt
– încep cu 0 – zero) și hexazecimale – încep cu 0x;
<?php
$a = 1234; // număr decimal
$a = -123; // număr negative
$a = 0123; // număr octal (echivalent lui 83 decimal)
$a = 0x1A; // număr hexadecimal (echivalent lui 26 decimal)
?> o Virgulă mobilă (float, double sau real);
<?php
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
?>
o Șir de caractere (string) – dacă șirul este introdus între ghilimele duble ("),
PHP înțelege majoritatea caracterelor speciale, dacă e introdus între
ghilimele simple ('), caracterele speciale trebuie precedate de ( \);
• Două tipuri compuse:

Sisteme Informatice de Asistare a Deciziei
92 o Vector (array) – în PHP vectorii sunt mulțimi formate din chei, fiecărei chei
i se atașează o valoare;
array( cheie => valoare
, …
)
// cheia poate fi un întreg sau un șir //
valoare poate fi orice valoare exemplu:
<?php
$arr = array("foo" => "bar", 12 => true);
echo $arr["foo"]; // bar echo $arr[12];
// 1
?> o Obiect – obiectele sunt inițializate de comanda class ;
<?php class
Salut {
function show_Salut()
{ echo "Buna ziua tuturor studentilor muncitori."; }
}
$bar = new Salut;
$bar->show_Salut();
?>
• Două tipuri spec iale:
o Resource – aceste variabile sunt folosite pentru păstrarea unor referințe
către anumite resurse externe (conexiuni la baze de date, fișiere), sunt
create și utilizate de anumite funcții;
o NULL – este o valoare specială atribuită oricărei variabile c are nu a fost
inițializată. O variabilă are tipul NULL dacă: – i s-a atribuit constanta
NULL, nu a fost inițializată, a fost dezinițializată (cu funcția unset()).

Șiruri și caractere speciale
• \n – salt la linie nouă;
• \r – retur de car;
• \t – tab oriz ontal;
• \\ – backslash;
• \$ – simbolul dolarului;
• \" – ghilimele

VARIABILE
În PHP variabilele sunt reprezentate de simbolul dolar $, urmat d numele variabilei.
Numele variabilei este case -senzitive. Numele unei variabile începe cu o literă sau cu
caracterul underscore _, urmat de restul numelui:
<?php
$var = 'Dan'; $Var
= 'Ion';
echo "$var, $Var"; //se afișează "Dan, Ion "
//pentru afișare, numele variabilei se introduce între ".." ghilimele
duble
$4site = 'not yet'; // invalid; începe cu un număr
$_4site = 'not yet'; // valid; începe cu underscore
$täyte = 'masina'; // valid; 'ä' este (Extended) ASCII 228.
?>

Cap 5: Limbaje de programare și Tehn ologii Web
93
Variabile predefinite:
$GLOBALS = pot fi accesate toate variabilele globale care sunt accesibile script –
ului PHP cure nt
$_SERVER = conține o serie de variabile ale căror valori sunt setate de server -ul
web; majoritatea valorilor variabilelor din acest vector depind de mediul de execuție al
script -ului curent.
$_GET și $_POST conțin variabile primite de script prin inte rmediul unor
transferuri care folosesc metodele HTTP get, respectiv post. De exemplu, prin intermediul
acestor vectori, pot fi accesate valorile câmpurilor dintr -un formular care a fost completat
și transmis folosind una dintre cele două metode.
$_COOKIE conține valorile variabilelor care cuprind informații referitoare la
cookie -urile păstrate pe calculatorul utilizatorului ce accesează pagina web.
$_FILES conține variabile primite de script prin intermediul încărcărilor de fișiere
prin metoda post.
$_EN V conține variabile disponibile prin intermediul mediului în care este
executat.
$_REQUEST conține variabile disponibile prin intermediul oricărui tip de
mecanism cu ajutorul căruia utilizatorul poate introduce date.
$_SESSION conține variabile care core spund sesiunii curente a script -ului.

CONSTANTE
O constantă stochează o valoare, cum este și o variabilă, dar această valoare, după
ce a fost stabilită nu mai poate fi modificată în script.
Pentru a defini o constantă, ne vom folosi de funcția define( ); iar numele
constantelor este scris cu MAJUSCULE, aceasta opțiune nu este obligatorie, însa va face
codul dumneavoastra mai frumos și mai lizibil.
O diferenta importanta între constante și variabile, este faptul că o constantă nu are
în fața ei semnul $.
<?php
define("SPEC", "Tehnologia Informatiei");
define("GRUPA", "231"); echo SPEC; echo
GRUPA; ?> OPERATORI

Operatori aritmetici
Examplu Nume Rezultat
-$a Negație Opusul lui $a.
$a + $b Adunare Suma lui $a și $b.
$a – $b Scădere Diferența dintre $a și $b.
$a * $b Înmulțire Produsul dintre $a și $b.
$a / $b Împărțire Raportul dintre $a și $b.
$a % $b modulo Restul împărțirii lui $a la $b.

Operatori logici
Exemplu Nume Rezultat

Sisteme Informatice de Asistare a Deciziei
94 $a and $b And TRUE dacă $a și $b sunt TRUE .
$a or $b Or TRUE dacă $a sau $b este TRUE .
$a xor $b Xor TRUE dacă $a sau $b este TRUE , dar nu amândouă.
! $a Not TRUE dacă $a nu este TRUE .
$a && $b And TRUE dacă atât $a cât și $b sunt TRUE .
$a || $b Or TRUE dacă $a sau $b este TRUE .

Exemplu Nume Rezultat
$a == $b Egalitate TRUE dacă $a este egal cu $b.
$a === $b Identitate TRUE dacă $a este egal cu $b, și sunt de același tip
$a != $b Diferit TRUE dacă $a nu este egal cu $b.
$a <> $b Diferit TRUE dacă $a nu este egal cu $b.
$a !== $b Diferit TRUE dacă $a nu este egal cu $b, sau nu sunt de același tip.
(introdus în PHP 4)
$a < $b Mai mic TRUE dacă $a este mai mic decât $b.
$a > $b Mai mare TRUE este $a mai mare decât $b.
$a <= $b Mai mic sau egal TRUE dacă $a este mai mic sau egal cu $b.
$a >= $b Mai mare sau egal TRUE dacă $a este mai mare sau egal cu $b.
5.7.3. Structuri de control
Structurile de control disponibile în PHP sunt aproximativ aceleași ca și cele din
C++, și acestea sunt : if, else, elseif , while , do-while , for, foreach , break , continue , switch ,
declare , return, require, include, require_once, include_once
În continuare se vor prezenta câte un exemplu de utilizare a acestora, fără prea
multe comentarii, deoarece ar trebui cunoscute de la programarea calculatoarelor.
5.7.3.1. Instrucțiunile If , If -Else și elseif
Exemplu 1: Sintaxa:
<?php if ($a > $b) {
echo "a este mai mare decât b"; $b
= $a; // b devine egal c u a
}
?>

Exemplu 2:
<?php if ($a >= $b) {
echo "a este mai mare decât b";
} else {
echo "a nu este mai mare decât b";
}
?>

Exemplu 3: if (expresie) {
declarații }
if (expresie)
{ declarații }
else {
declarații }

Cap 5: Limbaje de programare și Tehn ologii Web
95 <?php if ($a > $b) {
echo "a este mai mare decât b";
} elseif ($a == $b) { echo "a este
egal cu b";
} else {
echo "a este mai mic decât b"; } ?>
5.7.3.2. Bucla WHILE
Cel mai simplu tip de buclă PHP este while. Asemenea instrucțiunii if, ea se
bazează pe o acțiune. Diferența dintre if și while este aceea că instructiunea if, dacă găsește
adevărată condiția, afișează o singură dată bucata de cod din ea, însă în condiția while,
dacă rezultatul este adevărat, bucata de cod din ea se va repeta atâta timp cât condiția este
adevărată.
Script php Rezultat (afișează numerele de la 1 la 5)
<?php $numar = 1;
while($numar <= 5)
echo
$numar.'<br>';
$numar++;
}
?> 1
2
3
4
5
5.7.3.3. Instrucțiunea SWITCH
Această instrucțiune funcționează asemănător cu cea if, însă permite condițiilor să
aibă mai mult de 2 valori. Într -o instrucțiune if, condiția poate fi adevărată sau falsă, însă
într-o instrucțiune switch condiția poate lua orice număr de valori diferite.
Această instrucțiune trebuie să conțină o instrucțiune case care să manevreze
fiecare valoare pe care o doriți.
Același lucru și cu if și cu switch, rezultatul: " i egal cu 2 "
cu if cu switch
<?php
$i = 2; if
($i == 0) {
echo "i egal cu 0";
} elseif ($i == 1) {
echo "i egal cu 1"; }
elseif ($i == 2) {
echo "i egal cu 2"; }
?>; <?php switch
($i) { case
0:
echo "i egal cu 0"; break;
case 1:
echo "i egal cu 1"; break;
case 2:
echo "i egal cu 2";
break; } ?>;
5.7.3.4. Instrucțiunea for
Sintaxa este foarte asemanatoare cu cea din limbajele C/C++ si Java si anume:
for(expresie1; conditie; expresie2) {
//instrucțiune
}
for ($variabila = 1; $variabila <= 10; $variabila++) { echo
$variabila.'<br>';
}
Prima expresie e ste evaluată o singură dată, înainte de începerea execuției ciclului.
Expresia condiție este testatp înaintea fiecărei repetări a buclei. Dacă expresia returnează
fals, repetarea se oprește.
Expresia 2 este executată la sfârșitul fiecărei repetări. if (expresie 1)
{ declarații 1}
elseif(expresie 2)
(declarații 2)
else {
declarații 3 }

Sisteme Informatice de Asistare a Deciziei
96 Instrucțiunea se execută la fiecare repetare a buclei.
Oricare dintre cele trei expresii poate lipsi; în cazul în care o expresie lipsește, se
consideră că ea are valoarea true.
Bucla WHILE și FOR sunt identice din punct de vedere funcțional însă bucla FOR
este puțin mai complexă.
<?php
for ($variabila = 1; $variabila <= 10; $variabila++) { echo
$variabila.'<br>';
}
?>

5.7.3.5. Structura FOREACH
Această structură poate fi folosită pentru a realiza o repetare printre toate
elementele unui vector. Așadar , ea nu poate fi folosită decât împreună cu vectorii;
utilizarea sa asupra unei variabile de alt tip duce la apariția de erori.
Există două sintaxe acceptate pentru aceasta structură și anume:
foreach(expresie_vectoriala as $valoare) {
//instructiune
}
foreach(expresie_vectoriala as $cheie => $valoare) {
//instructiune
}
Dacă se utilizează prima variantă, atunci la fiecare iterație valoarea elementului
curent este atribuită variabilei $valoare, și apoi se trece la elementul următor (a cărui
valoare va fi atribuită variabilei la următoarea iterație).
Execuția ciclului se încheie în momentul în care nu mai există alte elemente în
vector. Singura diferența care apare în cazul utilizării celei de -a doua variante este faptul
că la fiecare iterație valoar ea cheii elementului curent este atribuita variabilei $cheie .
În continuare este un exemplu de folosire a celor două sintaxe ale structurii
foreach .

Cod php rezultat
<?php
$sir = array("unu", "doi", "trei", "patru", "cinci");
foreach($sir as $valoare) {
echo "Valoare: ".$valoare." <br> \n";
}
?> Valoare: unu
Valoare: doi
Valoare: trei
Valoare: patru
Valoare: cinci

Cod php rezultat
<?php
$sir = array("unu", "doi", "trei", "patru",
"cinci");
foreach($sir as $cheie => $valoare) {
echo "Cheie: ".$cheie." Valoare: ".$valoare."
<br>\n";
}
?> Cheie: 0 Valoare: unu
Cheie: 1 Valoare: doi
Cheie: 2 Valoare: trei
Cheie: 3 Valoare: patru
Cheie: 4 Valoare: cinci

Cap 5: Limbaje de programare și Tehn ologii Web
97 5.7.3.6. Instrucțiunea BREAK
Această instrucțiune poate fi folosită pentru a întrerupe forțat execuția unui ciclu
sau a secvenței de instrucțiuni corespunzătoare unei structuri switch .
Instrucțiunea poate fi urmată de un argument care indică numarul de structuri
imbricate a căror executie se încheie. Valoarea implicită este 1, deci se întrerupe execuția
unei singure structuri. Următoarea secvența de cod PHP realizează parcurgerea
elementelor unui vector de numere întregi, până în momentul în care se întâlnește un
număr negativ.
foreach ($a as $v)
if($v < 0) break;
Mai departe, avem cazul în care este întreruptă execuția mai multor cicluri; vom
considera că parcurgem elementele unei matrice pătratice cu n elemente și n coloane până
în momentul în care întalnim o v aloare nulă.
for($i = 0; $i < $n; $i++)
for($j = 0; $j < $n; $j++)
if(!$a[$i][$j]) break 2;
Instrucțiunea break poate fi utilizată pentru întreruperea execuției secvențelor de
instrucțiuni corespunzătoare structurilor for, foreach , while , do – while și switch .

5.7.3.7. Instrucțiunea CONTINUE
Această instrucțiune este folosită pentru a întrerupe execuția secvenței de
instrucțiuni din interiorul unui ciclu și trecerea la următoarea iterație.
În cazul instrucțiunii for, înainte de următoarea iterație s e evaluează (execută)
expresia de incrementare (expresia #3 din sintaxa generală). La fel ca și în cazul
instrucțiunii break , poate apărea un argument care indică numărul structurilor imbricate
asupra cărora are efect.
Exemplul următor realizează afișarea elementelor unui șir de numere întregi care
sunt mai mari decât 1000.
foreach($a as $v) {
if($v <= 1000)
continue ; echo $v;
}
Următorul exemplu ilustrează efectul folosirii argumentelor pentru instrucțiunea
continue .
<?php $i = 0; while($i++
< 5) { ec ho "Ciclul #1
<br>\n"; while(1) {
echo "&nbsp;&nbsp;Ciclul #2 <br> \n"; while
(1) {
echo "&nbsp;&nbsp;Ciclul #3<br> \n";
continue 3; }
echo "Acest mesaj nu va fi afisat niciodata.<br> \n";
}
echo "Nici acest mesaj nu va fi afisat niciodata.<br> \n";
}
?>
5.7.3.8. Alte structuri PHP
Exist ă mai multe alte structuri PHP care pot fi utilizate în anumite scopuri.

Sisteme Informatice de Asistare a Deciziei
98 Vom aminti acum câteva dintre ele: Structurile include , require , include_once și
require_once pot fi utilizate pentru a "insera" anumite instrucțiuni care sunt păstrate într –
un alt f ișier (document). Interpretorul PHP consideră că secvența din fișierul inserat se afla
în fișierul din care s -a "comandat" inserarea în poziția în care apare structura de inserare.
O altă structura este declare care permite crearea unor directive în execu ție.
Funcțiile PHP trebuie să utilizeze instrucțiunea return pentru a furniza un rezultat.

5.7.4. Lucrul cu formularele
PHP nu creează formulare, el doar prelucrează datele introduse în formularele
create în limbaj HTML, și prezentate într -un subcapito l anterior.
Un formular este delimitat de elementul FORM care conține alte câteva elemente
numite “controale”, care au o varietate de metode de a aduna informații. Fiecare element
din formular are un nume cât și o valoare, astfel încât datele transferate pentru procesare
să fie sub forma unor perechi nume/valoare.

Exemplu de formular:
<html>
<head><title>Formular_1 </title></head>
<body> Formular cu un camp de editare<hr>
<form action="formular.php" method="post">
Nume: <input type="text" name=" nume" value="" size=50 maxLength=15>
<br><br>
Prenume: <input type="text" name="prenume" value=""> <br><br>
Sex: Masculin <input type="radio" name="sex" value="M"> | Feminin
<input type="radio" name="sex" value="F"> <br><br>
Parola dorita: <input type ="password" name="parola" value=""> <br><br>
<input type="submit" name="Trimite" value="Trimite">
<input type="reset" name="Reseteaza" value="Reseteaza">
</form>
</body>
</html>
Se pune codul într -un fi șier formular.html , se salvează și apoi se vizualizează în
navigatorul web accesând http://localhost/formular.html

5.7.4.1. Prelucrarea datelor din formular
La definirea unui formular, în interiorul etichetei <form> apare elementul action
și method (care poate fi PST sau GET). În elementul action se pune calea către scriptul
PHP care va prelucra datele introduse în formular (în cazul nostru formular.php ), iar în
method se pune metoda prin care se vor prelucra date la apăsarea butonului "Trimite".
POST – Această metodă face ca datele trimise prin formular să nu fie vizibile
utilizatorului, să fie trimise în spatele paginii web.
GET – Prin această metodă, datele trimise prin formular sunt vizibile în URL
(URL este adresa ce este afișată în browser)

Metoda POST:

Cap 5: Limbaje de programare și Tehn ologii Web
99 Fișierul formular.php , care prelucrează datele introduse în formular.html arată
astfel:

<?php
echo $_POST['nume'];
?>

Se salvează, se lansează bowserul și se încarcă http://localhost/formular.html, se
completează căsuțele din formular “Nume”, și apoi se apasă butonul “Trimite”.
Se observă în în pagina formular.php ne este afișat numele introdus în căsuța
“Nume” din pagina anterioară, și anume în formular.html .
Adăugăm în continuare variabilele $_POST corespunzătoare formularului nostr u,
și apoi testăm din nou.
<?php
echo 'Nume: '.$_POST['nume'].' <br> Prenume:
'.$_POST['prenume'].' <br>
Sex: '.$_POST['sex'].' <br>
Parola: '.$_POST['parola'].' <br>'; ?>
Metoda GET:

În același formular din pagina formular.html , se înlocuiește method=”post”, cu
method=”get” .
Apoi în pagina formular.php , în loc de variabilele $_POST, vom pune variabile
$_GET .
Se observă că rezultatul este același în pagina web, numai că informațiile
formularului sunt postate și în adresa din browser (url)
sub forma:
http://localhost/formular.php?nume=orice&prenume=on&varsta=peste16&parola=altap
arola&Trimite=Trimite
De recomandat este utilizarea metodei POST, pentru c ă este mult mai sigură.

5.7.4.2. Verificarea datelor trimise prin formular
Verificarea conținutului trimis prin formular se face relativ foarte ușor.
<?php
if(($_POST['nume'] == "") || (is_numeric($_POST['nume'])) ||
(strlen($_POST['nume']) < 3)) {
echo 'Campul nume nu a fost completat corect. <br>
<a href="formular.html">Apasa aici</a> pentru a te intoarce la
formular.'; } else {
echo 'Nume: '.$_POST['nume'].' <br> Prenume:
'.$_POST['prenume'].' <br>
Sex: '.$_POST['sex'].' <br>
Parola: '.$_POST ['parola'].' <br>';
}
?>

Sisteme Informatice de Asistare a Deciziei
100 După cum se vede, se folosește construcția IF și ELSE, iar în interiorul instrucțiunii
if avem condițiile (în exemplu doar pentru căsuța nume) și operatorii PHP învățați la
începutul capitolului.
Condiția noastră if spune cam așa: dacp variabila cu numele po st este goală, ori
dacă este numerică, ori dacă numărul de caractere este mai mic de 3, rezultă bucla de cod
din instrucțiunea if.
Dacă toate acestea sunt îndeplinite, atunci execut bucla de cod din instrucțiunea
else.
Se revine la varianta inițială a lu i formular.html și formular.php (cu POST în loc
de GET) și apoi în pagina formular.php se introduce scriptul de mai sus pentru a testa
regulile pentru câmpul “Nume”.
Dacă din condițiile din if nu rezultă true, atunci va rezulta acest mesaj.

În cond iția if, se poate continua șirul de condiții … de exemplu:
if( ($_POST['nume'] == "") || (is_numeric($_POST['nume'])) ||
(strlen($_POST['nume']) < 5) ||
($_POST['prenume'] == "") || ($_POST['parola'] == "")) etc etc
• (is_numeric($_POST['nume'])) – aceas tă parte ne spune dacă valoarea
câmpului nume este numerică.
• Se poate folosi și varianta în care dorim să știm dacă nu este numerică, și anume:
(!is_numeric($_POST['nume'])) – se observă că am adaugăt un " !" pentru a
nega (ca în C++).

În acest moment știm cum să postăm valorile dintr -un formular de pe o pagină pe
alta fără să le stocăm undeva. Stocarea datelor din formular se face cu ajutorul bazelor de
date, de tip MySQL.

5.8. Introducere în MySQL
În figura de mai jos se prezintă modul de funcțion are a unei baze de date MySQL
cu un Server Web PHP (în cazul nostru Apache + PHP). Utilizatorul, prin intermediul
browserului Web accesează un fișier.php (face o cerere de pagină), fișierul.php apelat de
utilizator este prelucrat de serverul WEB, care trim ite apoi rezultatele către interpretorul
html al browserului web. Baza de date MySQL este conectată direct cu serverul Web, care
o poate apela în funcție de codul scris în fișierul php.

Cap 5: Limbaje de programare și Tehn ologii Web
101
Fig. 5.1: Funcționarea unei baze de date MySQL

Pentru a a dministra baza de date MySQL vom folosi aplicația phpMyAdmin, care
poate fi descărcată de aici: http://www.phpmyadmin.net/home_page/index.php . Aceasta
este o colecție de scripturi php care aj ută la gestionarea bazei de date prin intermediul unei
interfețe Web. Arhiva descărcată de mai sus va fi dezarhivată în directorul C: \Program
Files \EasyPHP 2.0b1 \www \phpMyAdmin. Pentru a lansa în execuție aplicația de
administrare a bazei de date se deschi de navigatorul web iar în url se tastează:
http://localhost/phpmyadmin/ apărând fereastra de autentificare :

În mod implicit, parola pentru root este neset ată (vidă), iar la apăsarea butonului
Execută se încarcă pagina următoare:

Server
MySQL
PHP
Server Web
Apache
Browser We b
Genereaz
ă

pagina
Schimb
de date
Cerere de
pagin
ă

fisier.php

Sisteme Informatice de Asistare a Deciziei
102
Deoarece existența contului root fără parolă de acces este periculoasă pentru
integritatea bazei de date, va trebui să -i setăm o parolă de access. Vom face aceasta
apăsând pe l egătura "Drepturi de acces" sau "Privileges" dacă interfața este în engleză. Se
va încărca pagina cu drepturi de acces asupra MySQL, și în dreptul lui root apăsăm pe
butonul ce indică modificarea:

Apoi după ce s -a încărcat următoarea pagină, gasiți unde apare ”Schimbare
parola” și bifați ”Parola”, apoi tastați parola dorită de dumneavoastră și în prima, și în a –
II-a căsuță, după care apăsați pe butonul „Executa”. După setarea parolei de root, mai
apare un cont de utilizator "Oarecare", fără parole ș i cu privilegii reduse.
5.8.1. Crearea bazelor de date
La încărcarea lui phpMyAdmin, în partea centrală se observă câmpul: "Crează
bază de date nouă":

Se introduce numele noii baze de date, de exemplu "BazaDate1" și se apasă
butonul "Crează".
Suntem anunțați că baza de date a fost creată (cu comanda sql aferentă: CREATE
DATABASE `BazaDate1`), și ni se spune că nu a fost găsit nici un tabel în baza de date.
Pentru a crea un bale se introduce un numele tabelei în câmpul "Nume" iar în căsuța
"Câmpuri " se introduce numărul de câmpuri câte va conține tabela:

Cap 5: Limbaje de programare și Tehn ologii Web
103
după apăsarea butonului "Execută", se va deschide noul tabel :

OBS: numărul de câmpuri reprezintă numărul de coloane al tabelei, respectiv capul
de tabel.
Câmpurile care apar pentru definir ea elementelor tabelei sunt:
• Câmp – în care se introduce numele câmpului: ID, Nume, Prenume, Vârsta etc.
Este recomandat ca primul câmp să fie un ID, de tip INT iar la alegerea valorii
auto_incremet – va reprezenta un număr unic pentru fiecare înregistra re din
tabel;
• Tip – se alege dintr -o listă prestabilită, și reprezintă tipul datei introduse în
câmpul respectiv, adică: număr, text, dată calendaristică, oră,boolean etc.;
• Lungime/Setare – numărul maxim de caractere care pot fi introduse;
• Gestionare ;
• Proprietăți ;
• Null – implicit câmpul este "not null" – și ne spune că acest câmp nu poate fi
gol – fără a introduce o valoare în el;
• Setare de bază – valoarea implicită pe care o are câmpul la introducerea unei
noi înregistrări (în exemplul nostru, la Sex , implicit este M, de la masculin);
• Extra – dacă câmpul se auto -incrementează (cu rol de numărător);
• – Cheie primară – stabilită câmpului ID;
• – Index;
• – Unic – indicat de aplicat la un câmp de tip CNP – cod numeric personal;
• – Tot textul;
• Comentari i –
Pentru exemplul nostru se vor completa câmpurile după cum se vede în figura de
mai jos, și apoi se apasă butonul "Salvează".

Sisteme Informatice de Asistare a Deciziei
104 Ni se arată comanda SQL de creare a tabelului, și se listează tabela creată:
Comanda SQL:
CREATE TABLE `bazad ate1`.`tbl_Formular1` (
`ID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`Nume` VARCHAR( 25 ) NOT NULL ,
`Prenume` VARCHAR( 25 ) NOT NULL ,
`Vârsta` INT( 3 ) NOT NULL ,
`Sex` VARCHAR( 1 ) NOT NULL DEFAULT 'M'
) ENGINE = MYISAM

Pentru a adăuga da te în tabela proaspăt creată, se apasă butonul "inserare" din
meniul din topul paginii. Se completează câmpul "Valoare" cu datele pe care vrem să le
introducem în tabel.
OBS : Nu se va completa căsuța ID, deoarece ea este folosită pentru a adăuga un
număr unic pentru fiecare intrare din baza de date – acest număr este adăugat pe SQL.

Comanda SQL:
INSERT INTO `bazadate1`.`tbl_Formular1` (
`ID` ,
`Nume` ,
`Prenume` ,
`Vârsta` ,
`Sex`
)
VALUES (
NULL , 'Popescu', 'Ion', '25', 'M'
);

Pentru a
vizualiza datele din tabel se
apasă butonul "Navigare" din
partea de sus a paginii.

phpMyAdmin este un utilitar foarte lesne de înțeles, putându -se face ușor
adăugări/ștergeri de tabele, modificarea înregistrărilor din tabele, adăugarea/eliminarea de
câmpuri noi în tabele, ș.a.m.d.
5.8.2. Utilizarea PHP pentru conectarea la MySQL
Cu ajutorul scripturilor PHP ne putem conecta la o bază de date MySQL, să citim
informații din ea, să ștergem/modificăm sau să adăugăm noi informații.

Cap 5: Limbaje de programare și Tehn ologii Web
105 Pentru aceasta, vom cre a în directorul serverului nostru Apache (www) un director
(folder) cu numele LECTII , în care vom crea un fișier config.php în care vom scrie
următorul cod:

<?php
// Informatii baza de date
$AdresaBazaDate = "localhost";
$UtilizatorBazaDate = "root";
$ParolaBazaDate = "parola";
$NumeBazaDate = "bazadate1";

$conexiune = mysql_connect($AdresaBazaDate, $UtilizatorBazaDate,
$ParolaBazaDate)
or die("Nu ma pot conecta la MySQL!");
mysql_select_db($NumeBazaDate,$conexiune) or
die("Nu gasesc baza de da te!");
?>

Acesta este fișierul de configurare cu care vom realiza conexiunea automată la baza
de date. Variabilele utilizate în script au următoarea semnificație:
• $AdresaBazaDate = "localhost" – este definită cu valoarea localhost deoarece
aceasta est e adresa serverului Apache+PHP+MySQL;
• $UtilizatorBazaDate = "root" – root este utilizatorul cu toate drepturile de
acces asupra bazei de date – administratorul acesteia;
• $ParolaBazaDate = "parola" – parola utilizatorului root, dată de noi la crearea
bazei de date;
• $NumeBazaDate = "bazadate1" – numele bazei de date pe care o accesăm.
5.8.2.1. Comanda SELECT
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RES ULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] select_expr ,

[INTO OUTFILE ' file_name ' export_options
| INTO DUMPFILE ' file_name ']
[FROM table_references
[WHERE where_definition ]
[GROUP BY { col_name | expr | position}
[ASC | DESC], … [WITH ROLLUP]]
[HAVING where_definition ]
[ORDER BY { col_name | expr | position }
[ASC | DESC] , …]
[LIMIT {[ offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name (argument_list )]
[FOR UPDATE | LOCK IN SHARE MODE]]

SELECT este folosită pentru a extrage liniile selectate din una sau mai multe
tabele:

Sisteme Informatice de Asistare a Deciziei
106 • Fiecare select_expr – indică coloana care trebuie extrasă;
• Table_references – indică tabelul sau tabelele din care vor fi e xtrase liniile;
• where_definition – sunt cuvinte cheie care indică ce condiție sau condiții trebuie
să le satisfacă liniile pentru a fi selectate.
SELECT mai poate fi utilizat și pentru a extrage linii fără a se face referința la
vreun tabel, de exemplu:
Mysql> SELECT 1 + 1;
-> 2

Exemplu pentru baza noastră de date:
Se creează un fișier select.php în care scriem următorul script:
script php explicații:
<?php Funcția require_once include (o singură dată) în
pagina n oastră select.php pagina config.php, adică require_once('config.php');
/*Selectare date din baza de datele din config.php vor fi transmise în pagina
date*/ select.php

$cerereSQL = 'SELECT * FROM
Variabila $cerereSQL cu valoarea cererii SQL `tbl_Formular1`'; pentru a extrage
datele din tabela tbl_Formula1.
SELECT * = se interpretează astfel: selectează tot
din tbl_Formular1
$rezultat = Variabila rezultat cu valoarea funcției mysql_query ,
mysql_query($cerereSQL); funcție care realizează deschiderea conexiunii
while($rand = Bucl a while : atâta timp cât există înregistrări în
tabela tbl_Formular1 afișează (echo) elementele mysql_fetch_array($rezultat)){
echo $rand['Nume'].' variabilei $rand (care este de tip array – vector)
'.$rand['Prenume'].'
'.$rand['Vârsta'].'ani
'.$rand['S ex'].'<br>';
}
?> Sfârșitul scriptului php

După salvarea fișierului, acesta va fi accesat din browser web la adresa
http://lcalhost/lectii/select.php , rezultatul afișat pe ecran fiind următorul:

Funcții folosite:
Sintaxa : mysql_query ( string query [, resource link_identifier] )
Explicație : mysql_query() trimite o interogare unică (nu sunt premise întrebări multiple)
către baza de date acti ve care este asociată cu link_identifier .

Sintaxa: mysql_fetch_array ( resource result [, int result_type] )
Explicație: Întoarce un șir (array) care corespunde rândului apelat și mută datele interne
înainte.

Cap 5: Limbaje de programare și Tehn ologii Web
107 OBSERVAȚII:
• în cerea SQL de selectare, "*" selectează tot din tabelă, dar se pot selecta doar
câmpurile dorite, de ex, doar nume și prenume: $cerereSQL = 'SELECT
Nume,Prenume FROM tbl_Formular1';
• echo – se observă că se începe cu numele primei variabile afișate
($rand['Nume'] ), urmată de ( .') un spațiu și apoi ( '.) a doua variabilă, ș.a.m.d.,
<br> – de la break – se trece pe un rând nou.

Selectarea condiționată (cu where ) Se
modifică doar următorul rând:
$cerereSQL = 'SELECT * FROM `tbl_Formular1`'; care
devine:
$cerereSQL = 'SELECT * FROM `tbl_Formular1` WHERE nume="Popescu";

După salvare și reîncărcarea paginii în Browser, rezultatul va fi doar o linie cu
înregistrarea corespunzătoare Nume = Popescu.
5.8.2.2. Comanda INSERT
Această comandă se folosește pentru a adăuga/introduce date în baza de date.
Sintaxa:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name ,…)]
VALUES ({expr | DEFAULT},…),(…),…
[ ON DUPLICATE KEY UPDATE col_name =expr, … ] sau:
INSERT [LOW_PRIORITY | DELAY ED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
SET col_name ={expr | DEFAULT}, …
[ ON DUPLICATE KEY UPDATE col_name =expr, … ] sau:
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name ,…)]
SELECT …
[ ON DUPLICATE KEY UPDATE col_name =expr, … ]

Comanda INSERT inserează noi linii într -un tabel existent. Cele două forme
INSERT … VALUES și INSERT … SET ale instrucțiunii inserează linii pe baza unor
valori explicit specificate. Forma INSERT … SEL ECT inserează liniile selectate din alt
tabel sau alte tabele; iar forma INSERT … VALUES cu multiple valori listate este
suportată în versiunile MySQL 3.22.5 sau mai târzii. Sintaxa lui INSERT … SET este
suportată de MySQL 3.22.10 sau mai târzii.
Elementele componente:
tbl_name este tabelul în care liniile vor fi inserate. Coloanele pentru care declarațiile
oferă valori pot fi specificate astfel:
• Lista cu numele coloanelor sau clauza SET indică în mod explicit coloanele;
• Dacă nu se specifică lista coloanelor pentru INSERT … VALUES sau INSERT …
SELECT , valorile pentru fiecare coloană din tabel trebuie furnizate în lista
VALUES sau de SELECT. Dacă nu se știe ordinea coloanelor din tabel, se poate
folosi DESCRIBE tbl_name pentru a le afla.

Sisteme Informatice de Asistare a Deciziei
108
Exem plu pentru baza de date "bazadate1" cu tabelul "tbl_Formular1":
<?php
require_once ('config.php');
$cerereSQL = "INSERT INTO `tbl_Formular1` (`nume` , `Prenume`,
`Vârsta`,`Sex`) VALUES ('Basesecu', 'Traian', '42','M')";
mysql_query($cerereSQL);
echo 'Am adaugat valorile in baza de date';
?>

OBS: Dacă sintaxa este corectă, dar numele tabelei este incorect, pe ecran va fi
afișat mesajul de succes, dar în baza de date nu va fi introdus nimic.
Atenție: Dacă la definirea tabelului ați folosit diacritice , (de ex. la Vârsta) vor
trebui folosite și în scriptul php.

5.8.2.3. Comanda UPDATE
Se folosește pentru a modifica datele existente într -o bază de date. Sintaxa este:
• Sintaxa pentru un singur tabel:
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
SET col_name1 =expr1 [, col_name2 =expr2 …]
[WHERE where_definition ]
[ORDER BY …]
[LIMIT row_count ]

• Sintaxa pentru tabele multiple:
UPDATE [LOW_PRIORITY] [IGNORE] table_references
SET col_name1 =expr1 [, col_name2 =expr2 …]
[WHERE where_definition ]

Declarația UPDATE modifică coloanele în liniile de tabele existente cu valori noi.
Clauza S ET indică care coloană va fi modificată și valoarea pe care o va lua. Clauza
WHERE , dacă apare, specifică care linii vor fi modificate. Altfel, toate liniile sunt
modificate în ordinea în care sunt specificate. Clauza L IMIT plasează o limită al numărului
de linii care pot fi modificate.
Declarația U PDATE suportă următorii modificatori:
• dacă se folosește L OW_PRIORITY , execuția modificării este î ntârziată până când
nici un alt client nu mai citește din tabel;
• dacă se folosește cuvântul cheie I GNORE , execuția declarației U PDATE nu va fi
oprită nici dacă apar erori în timpul execuției modificării. Liniile pentru care
există un conflict de cheie du plicată nu sunt updatate. Liniile ale căror coloane
(celule) sunt modificate la valori care provoacă erori de conversie tip de date vor
fi modificate la cea mai apropiată valoare validă.

Exemplu pentru baza de date "bazadate1" cu tabelul "tbl_Formular1" :

<?php
require_once( 'config.php');

Cap 5: Limbaje de programare și Tehn ologii Web
109 $cerereSQL = " UPDATE `tbl_Formular1` SET nume='nume',
prenume='prenume' WHERE nume='Basesecu' ";
mysql_query($cerereSQL);
echo 'Am modificat valorile campurilor nume si prenume unde numele
este Basesecu in baza de date';
?>
Se va crea și salva un fișier update.php, în care
va fi scris sciptul de mai sus. Dacă în tabel sunt mai
multe înregistrări pentru care Nume = Basesecu, vor fi
modificate toate înregistrările:

5.8.2.4. Comanda DELETE
Această comandă se fol osește pentru a șterge înregistrări din tabelele bazelor de
date existente.
Pentru baza de date "bazadate1" cu tabelul "tbl_Formular1", putem scriue
următorul exemplu:
<?php
require_once('config.php');
$cerereSQL = " DELETE FROM `tbl_formular1` WHERE nu me='nume'";
mysql_query($cerereSQL);
echo 'Am sters coloana cu campul nume = nume din baza de date'; ?>
Ca urmare, ultimele două linii din tabel vor fi șterse. Sintaxa
generală pentru DELETE este:
• Sintaxa pentru un singur tabel:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[WHERE where_definition ]
[ORDER BY …]
[LIMIT row_count ]

• Sintaxa pentru tabele multiple: DELETE [LOW_PRIORITY]
[QUICK] [IGNORE] tbl_name [.*] [, tbl_name [.*] …]
FROM table_references
[WHERE where_definition ] sau:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
FROM tbl_name [.*] [, tbl_name [.*] …]
USING table_references
[WHERE where_definition ]
DELETE deletes

Comanda D ELETE sterge linii din tabelul tbl_name care satisfac condiții le impuse
de where_definition , și returnează un număr de înregistrări șterse.

Dacă se execută o declarație DELETE fără a preciza o clauză WHERE , atunci, toate
liniile din tabel vor fi șterse. O metodă mai rapidă de a face acest lucru este utilizarea
comenzii TRUNCATE TABLE , mai ales atunci când nu se cunoaște numărul liniilor ce
trebuiesc șterse.

Sisteme Informatice de Asistare a Deciziei
110 5.9. Asp, AspX(.NET)
ASP.NET este o tehnologie Microsoft pentru crearea de aplicații web și servicii
web. ASP.NET este succesorul lui ASP(Active Server P ages) și beneficiază de puterea
platformei de dezvoltare .NET, și de setul de instrumente oferite de mediul de dezvoltarea
al aplicației Visual Studio .NET.

5.10. JavaScript

Javascript este un limbaj de programare simplu, de tip script, pentru defi nirea
comportamentului elementelor dintr -o pagina Web. Nu este același lucru cu mult mai
complexul limbaj de programare Java.
Javascript poate specifica, în mod obișnuit î doar câteva rânduri , răspunsurile la
acțiuni sau evenimente cum ar fi: deschidere a unei pagini, deplasarea mouse -ului într -un
anumit punct sau ștergerea unui anumit câmp dintr -un formular.
Cea mai simplă aplicație Javscript este aceea care determină apariția și derularea
unui mesaj:

<html>
<head><script
language="Javascript">
<!—
alert (" Apasati OK ! ")
–>
</script></head>
<body> O fereastra cu mesaj
!!! </body>
</html>

Scriptul este încadrat de marcajele <script>…</script> și totul este înglobat într –
un comentariu astfel încât programele de navigare care nu i nterpretează Javascript nu sunt
derutate de scriptul în sine.

Cu Javascript pot fi gestionate o multitudine de evenimente cum ar fi cele
prezentate mai jos:
Eveniment Se desfasoara atunci cand Tratearea
evenimentului
blur utilizatorul elimină cont rolul de intrare de pe un element al unui
formular onBlur
click utilizatorul execută un click pe un element al unui formular sau pe o
legătură onClick
change utilizatorul modifică valoarea unui text, zona de text sau element de
selecție onChange

Cap 5: Limbaje de programare și Tehn ologii Web
111 focus utilizatorul atribuie unui element de formular control de intrare onFocus
load utilizatorul încărca pagină în programul de navigare onLoad
mouseover utilizatorul deplasează indicatorul mouse -ului deasupra unei
legături sau a unei ancore onMouseover
select utilizatorul selectează câmpul de intrare al unui element de
formular onSelect
submit utilizatorul transmite un formular onSubmit
unload utilizatorul abandonează pagina onUnload

În exemplul următor se folosește evenimentul click .
<form action="" method="get"> <input type="button" value="Apasa!"
onClick="alert('Hello!')"> </form>

Exemplu 1 : se citește numele introdus și îl salută:

<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!–
function Salutare(){
var name =
document.forms[0].elements[0].value;
alert("Salut "+name);}
–>
</SCRIPT>
</HEAD>
<BODY><br><br>
<p align=center>
<FORM NAME="form">
<b> Numele: <INPUT TYPE="text"
NAME="nume">
<INPUT TYPE="button"
VALUE="Scrie numele si apasa!"
onClick="Salutare()">
</FORM>
</BODY>
</HTML>

Exemplul 2 : Se modifică culoare de fond a paginii:

Sisteme Informatice de Asistare a Deciziei
112 <HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!–
function galben(){
document.bgColor="#FFFF00";
}
function albastru(){
document.bgColor="#0000FF";
}
function initial(){
document.bgColor="#FFFFFF";
}
–>
</SCRIPT>
</HEAD>
<BODY>
<CENTER>
<P>
<FORM>
<INPUT TYPE="button" VALUE="Fond galben"
onClick="galben()">
<br><br> <INPUT TYPE="button" VALUE="Fond albastru"
onClick="albastru()">
<br><br> <INPUT TYPE="button" VALUE="Fond initial"
onClick="initial()">
</FORM>
</P>
</CENTER>
</BODY>
</HTML>

Exemplul 3: Calendar de bază
Descriere: Calendar simpatic pentru afișare pe pagina web. Scoate în evidență data și
ziua din săptămână. Cod bine documentat pentru a va ajuta să personalizați fontul,
culoarea sau mărimea pe care o doriți.
<!– TWO STEPS TO INSTALL THIS SCRIPT –>
<!– STEP ONE: Place the following script into a separate JavaScript
file called: calendar.js –>
<!– Begin // SET
ARRAYS
var day_of_week = new
Array('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
var month_of_year = new
Array('January','February','March','April','May','June','July','August
','September','Oct ober','November','December');

// DECLARE AND INITIALIZE VARIABLES
var Calendar = new Date();
var year = Calendar.getYear(); // Returns year
var month = Calendar.getMonth(); // Returns month (0 –
11) var today = Calendar.getDate(); // Returns day (1 -31)
var weekday = Calendar.getDay(); // Returns day (1 -31)

Cap 5: Limbaje de programare și Tehn ologii Web
113 var DAYS_OF_WEEK = 7; // "constant" for number of days in a week
var DAYS_OF_MONTH = 31; // "constant" for number of days in a
month var cal; // Used for printi ng

Calendar.setDate(1); // Start the calendar day at '1'
Calendar.setMonth(month); // Start the calendar month at now

/* VARIABLES FOR FORMATTING
NOTE: You can format the 'BORDER', 'BGCOLOR', 'CELLPADDING',
'BORDERCOLOR' tags to customiz e your caledanr's look. */

var TR_start = '<TR>';
var TR_end = '</TR>';
var highlight_start = '<TD WIDTH="30"><TABLE CELLSPACING=0
BORDER=1 BGCOLOR=DEDEFF BORDERCOLOR=CCCCCC><TR><TD
WIDTH=20><B><CENTER>'; var highlight_end =
'</CENTER></TD></TR></T ABLE></B>';
var TD_start = '<TD WIDTH="30"><CENTER>';
var TD_end = '</CENTER></TD>';

/* BEGIN CODE FOR CALENDAR
NOTE: You can format the 'BORDER', 'BGCOLOR', 'CELLPADDING',
'BORDERCOLOR' tags to customize your calendar's look.*/

cal = '<TABLE BOR DER=1 CELLSPACING=0 CELLPADDING=0
BORDERCOLOR=BBBBBB><TR><TD>'; cal += '<TABLE BORDER=0
CELLSPACING=0 CELLPADDING=2>' +
TR_start; cal += '<TD COLSPAN="' + DAYS_OF_WEEK
+ '"
BGCOLOR="#EFEFEF"><CENTER><B>'; cal += month_of_year[month] + ' '
+ year + '< /B>' + TD_end +
TR_end; cal +=
TR_start;

// DO NOT EDIT BELOW THIS POINT //
// LOOPS FOR EACH DAY OF WEEK
for(index=0; index < DAYS_OF_WEEK; index++)
{
// BOLD TODAY'S DAY OF WEEK
if(weekday == index)
cal += TD_start + '<B>' + day_of_w eek[index] + '</B>' +
TD_end;
// PRINTS DAY
else
cal += TD_start + day_of_week[index] + TD_end;
}

cal += TD_end + TR_end;
cal += TR_start;

// FILL IN BLANK GAPS UNTIL TODAY'S DAY
for(index=0; index < Calendar.getDay(); i ndex++)
cal += TD_start + ' ' + TD_end;

Sisteme Informatice de Asistare a Deciziei
114 // LOOPS FOR EACH DAY IN CALENDAR
for(index=0; index < DAYS_OF_MONTH; index++)
{
if( Calendar.getDate() > index )
{
// RETURNS THE NEXT DAY TO PRINT
week_day =Calendar.getDay();

// START NEW ROW FOR FIRST DAY OF WEEK
if(week_day == 0)
cal += TR_start;

if(week_day != DAYS_OF_WEEK)
{
// SET VARIABLE INSIDE LOOP FOR INCREMENTING
PURPOSES var day = Calendar.getDate();
// HIGHLIGHT TODAY'S DATE if(
today==Calendar.getDate() )
cal += highlight_start + day + highlight_end + TD_end;

// PRINTS DAY
else
cal += TD_start + day + TD_end;
}

// END ROW FOR LAST DAY OF WEEK
if(week_day == DAYS_OF _WEEK)
cal += TR_end;
}

// INCREMENTS UNTIL END OF THE MONTH
Calendar.setDate(Calendar.getDate()+1);

}// end for loop

cal += '</TD></TR></TABLE></TABLE>';

// PRINT CALENDAR
document.write(cal);

// End –>

<!– STEP TWO: Place this into the BODY of the HTML document where
you want the calendar –>
<!– Make sure the '.js' and '.html' files are in the same directory.
–>

<BODY>

<SCRIPT SRC="calendar.js"></SCRIPT>

Exemplul 4: Ceas de bază

Cap 5: Limbaje de programare și Tehn ologii Web
115 Descriere: Acest ceas se updatează permanent fără folosirea unei căsuțe de text.
Se poziționează ușor oriunde în site.
<!– TWO STEPS TO INSTALL BASIC CLOCK:

1. Add the onLoad event handler into the BODY tag
2. Copy the coding into the BODY of your HTML document –>
<!– STEP ONE: Insert the onLoad event handler into your BODY tag –>

<BODY onLoad="clock()">

<!– STEP TWO: Paste this code into the BODY of your HTML
document –>

<!– Adjust the placement of the clo ck in the line below –>
<span id="pendule"
style="position:absolute;left:300;top:20;"></span>

<SCRIPT LANGUAGE="JavaScript">
<!– Begin
function clock() {
if (!document.layers && !document.all)
return; var digital = new Date(); var hours =
digital.g etHours(); var minutes =
digital.getMinutes(); var seconds =
digital.getSeconds(); var amOrPm = "AM"; if
(hours > 11) amOrPm = "PM"; if (hours > 12)
hours = hours – 12; if (hours == 0) hours =
12;
if (minutes <= 9) minutes = "0" + minutes;
if (seconds <= 9) seconds = "0" + seconds;
dispTime = hours + ":" + minutes + ":" + seconds + " " + amOrPm;
if (document.layers) {
document.layers.pendule.document.write(dispTime);
document.layers.pendule.document.close();
} else if (document.all)
pendule.innerHTML =
dispTime;
setTimeout("clock()", 1000);
}
// End –>
</script>
<!– Script Size: 1.42 KB –>

5.11. Ajax – tehnologia Ajax,
Ajax (sau AJAX), prescurtare pentru Asynchronous JavaScript and XML, este o
tehnică de programare pentru crearea de aplicați i web interactive. Intenția este să facă
paginile web să pară mai receptive, prin schimbul unor cantități mici de date cu serverul
în fundal, astfel încât să nu fie nevoie ca pagina să fie reîncărcată la fiecare acțiune a
utilizatorului. Aceasta are ca sco p creșterea interactivității, vitezei și ușurinței în utilizare
a aplicațiilor web.

Sisteme Informatice de Asistare a Deciziei
116 Ajax nu este o tehnologie în sine. Termenul este folosit pentru definirea
aplicațiilor web ce folosesc un ansamblu de tehnologii:
HTML sau XHTML pentru structura semant ică a informațiilor;
CSS pentru prezentarea informațiilor;
Javascript pentru interactivitate, pentru procesarea informațiilor prezentate;
Obiectul XMLHttpRequest pentru schimbul și manipularea informațiilor într -o
manieră asincronă cu server -ul web;
XML este folosit de obicei pentru transferarea datelor între server și client, deși
orice format funcționează, inclusiv HTML preformatat, text simplu etc.

117 6. Crearea paginilor web cu Dreamweaver
6.1. Generalități
O aplicație specializată pentru realiz area de pagini web oferă posibilitatea
realizării rapide a unor pagini complexe. Dintre editoarele existente se detașează prin
profesionalismul cu care a fost realizat Dreamweaver produs de Adobe.
Dreamweaver permite crearea de pagini sau aplicații pentru web conținând toate
elementele prezentate. În Dreamweaver se pot crea ușor stiluri sau fișiere .css (Cascading
Style Sheets), se poate vizualiza și testa pagina creată.
În Dreamweaver se poate crea un sit sau se poate edita un document singular.
La por nirea aplicației, aceasta afișează conținutul unui fișier HTML minimal. În
partea dreaptă a ferestrei sunt afișate un ansamblu de panouri care pot fi ascunse folosind
tasta F4.

Fig. 6.1: Interfața aplicației Dreamweaver

Fișierul afișat poate fi im ediat editat și salvat.
Crearea unei noi pagini se realizează selectând opțiunea File / New , după care se va
selecta în fereastra afișată Basic page.
Mai eficientă este realizarea unei pagini pornind de la un șablon predefinit
(template). Pentru aceast a, în fereastra New Document se va alege Page Designs și din
lista afișată se va selecta aspectul dorit. Utilizarea acestei opțiuni presupune însă definirea
în prealabil a unui sit, urmând pașii prezentați în continuare.

Sisteme Informatice de Asistare a Deciziei
118
Fig. 6.2: Fereastra pentru a legerea tipului documentului
6.2. Crearea unui sit web
Realizarea unui sit web presupune plasarea unui număr de pagini într -o structură
de directoare creată pe discul unui calculator conectat la Internet și pe care rulează o
aplicație de tip server pent ru web (cel mai frecvent Apache sau IIS). În faza de dezvoltare
și testare dar și ulterior, pentru întreținere, este bine să existe pe calculatorul autorului o
replică a sitului. Pentru crearea unui nou sit se va selecta opțiunea Site / New Site , după
care se stabilesc caracteristicile de bază ale acestuia specificând opțiunile ca în figură.

Fig. 6.3: Fereastra pentru alegerea denumirii sitului

Cap 6: Crearea paginilor web cu Dreamweaver
119
Fig. 6.4: Fereastra pentru alegerea modului de lucru

Fig. 6.5: Fereastra pentru alegerea director ului local în care va fi salvat situl

Sisteme Informatice de Asistare a Deciziei
120
Fig. 6.6: Fereastra pentru alegerea tipului conexiunii

Se observă că situl poartă numele Site 1 . Directorul în care se vor păstra fișierele sitului
poartă de regulă același nume.
6.3. Crearea paginilor web
Crearea paginilor web în Dreamweaver poate fi realizată codificând conținutul
acesteia în HTML ca în cazul editoarelor obișnuite sau redactând documentul într -o
fereastră grafică, în acest caz codificarea realizând -o aplicația.
În timpul editării, aplica ția poate afișa documentul în trei moduri:
· Code View, corespunzând ansamblului de marcaje HTML folosite la codificare,
· Design View, aspectul fiind cel afișat de un browser și
· Code and Design View, situație în care aplicația afișează pagina în d ouă
panouri, unul conținând codificarea înHTML și celălalt reprezentând -o în
format grafic.
Trecerea de la o reprezentare la alta se realizează folosind butoanele de pe bara cu
instrumente Document .

Code View / Code and Design Views / Design V iew

Fig. 6.7: Bara cu instrumente Document

Cap 6: Crearea paginilor web cu Dreamweaver
121 Codificarea paginii se realizează folosind instrumentele de pe bara cu instrumente
Insert . Ea permite accesarea diferitelor categorii de marcaje HTML și a marcajelor din
fiecare categorie. Pentru fiecare ma rcaj inserat, după selectarea acestuia, aplicația
afișează o fereastră în care sunt cerute în mod explicit valorile atributelor specifice.

Fig. 6.8: Bara cu instrumente Insert

Pentru a primi ajutor în legătură cu un anumit marcaj, se poate apela Shift+F1 Reference în
panoul Results .

Fig. 6.9: Panoul Results pentru documentație

Pentru accelerarea scrierii conținutului paginilor, aplicația pune la dispoziția
utilizatorului un ansamblu de secvențe de cod. Categoriile și secvențele de cod d in fiecare
categorie sunt accesibile selectând Snippets în panoul Files .

Fig. 6.10: Fereastra pentru alegerea secvențelor de cod predefinite

Sisteme Informatice de Asistare a Deciziei
122 Verificarea modului în care va arăta pagina într -o aplicație de navigare se face
alegând opțiunea File -> Preview in Browser (sau apăsând tasta F12). Implicit este
selectat Internet Explorer, dar există posibilitatea alegerii unui alt browser, selectând
succesivFile -> Preview in Browser -> Edit Browser List.

Fig. 6.11: Alegerea browserului

6.4. Cre area și utilizarea stilurilor
Stilurile și foile de stiluri (fișierele având extensia .css, Cascading Style Sheets – CSS
) permit redefinirea unor caracteristici implicite ale marcajelor.
6.4.1. Realizarea unei foi de stiluri
O foaie de stiluri conți ne un ansamblu de definiții de stiluri aplicabile diferitelor
marcaje din paginile web. Definirea unei foi de stiluri începe cu selectarea opțiunii CSS
Styles din panoul CSS, după care se acționează butonul (New CSS Rule ).

Cap 6: Crearea paginilor web cu Dreamweaver
123 Fig. 6.14: Fereastra pe ntru adăugarea unui stil
În continuare se definesc caracteristicile marcajelor care vor fi afectate de noul stil.

Fig. 6.15: Redefinirea marcajelor afectate de noul stil

După apăsarea butonului OK se va afișa o fereastră în care se pot impune toate proprietățile
care pot face obiectul unei definiții de stil, pentru marcajul selectat.

Fig. 6.16: Fereastra pentru impunerea proprietăților

Astfel definit, stilul va fi aplicat numai documentului curent.
Pentru a putea aplica un stil mai multo r documente, este necesară crearea unui
fișier .css care va conține definițiile create. Pentru aceasta se poate selecta în fereastra
New CSS Style opțiunea Define In ,

Sisteme Informatice de Asistare a Deciziei
124
după care se va introduce într -o nouă fereastră numele fișierului care va păstra de finițiile,
sau se va selecta opțiunea File -> Export -> CSS Styles , după care se precizează în
fereastra care se afișează
numele fișierului .css. De regulă fișierele .css sunt păstrate tot în directorul care conține paginile
sitului.
Atașarea unui fiș ier .css la pagina curentă se realizează prin apăsarea butonului
.

Fig. 6.17: Fereastra pentru realizarea legăturii între fișierul html și fișierul .css creat

Fișierul de stiluri selectat va fi legat astfel de documentul nou, atributele stilul ui fiind
automat aplicate acestuia.

Laborator SIAD Lucrarea nr.1
125
1 Instalarea și configurarea serverului Apache, PHP și MySQL
pe FreeBSD

1.1 Obiective
• Instalarea și configurarea serverului Apache;
• Instalarea și configurarea PHP;
• Instalarea și configurarea serverului MyS QL și a aplicației PhpMyAdmin

Pentru a instala pachetele corespunzătoare pe sistemul FreeBSD sunt necesare
îndeplinirea câtorva condiții:
• logarea ca root;
• verificarea conexiunii la Internet, pentru a putea descărca pachetele în timpul instalării.

1.2 Instalarea si configurarea MySQL

MySQL este un sistem de gestiune a bazelor de date relațional, produs de
compania suedeză MySQL AB și distribuit sub Licența Publică Generală GNU. Este cel
mai popular SGBD open -source la ora actuală, fiind o componen tă cheie a stivei LAMP
(Linux, Apache, MySQL, PHP).
Deși este folosit foarte des împreună cu limbajul de programare PHP, cu MySQL
se pot construi aplicații în orice limbaj major. Există multe scheme API disponibile pentru
MySQL ce permit scrierea aplicați ilor în numeroase limbaje de programare pentru
accesarea bazelor de date MySQL, cum are fi: C, C++, C#, Borland Delphi, Java, Perl,
PHP, Python, FreeBasic, etc., fiecare dintre acestea folosind un tip spefic API. O interfață
de tip ODBC denumită MyODBC per mite altor limbaje de programare ce folosesc această
interfață, să interacționeze cu bazele de date MySQL cum ar fi ASP sau Visual Basic. În
sprijinul acestor limbaje de programare, unele companii produc componente de tip
COM/COM+ sau .NET (pentru Windows) prin intermediul cărora respetivele limbaje să
poată folosi acest SGBD mult mai ușor decât prin intermediul sistemului ODBC. Aceste
componente pot fi gratuite (ca de exemplu MyVBQL) sau comerciale.
Licența GNU GPL nu permite încorporarea MySQL în softuri comerciale; cei care
doresc să facă acest lucru pot achiziționa, contra cost, o licență comercială de la compania
producătoare, MySQL AB.
MySQL este componentă integrată a platformelor LAMP sau WAMP
(Linux/Windows -Apache -MySQL -PHP/Perl/Python). Popularit atea sa ca aplicație web
este strâns legată de cea a PHP -ului care este adesea combinat cu MySQL și denumit
Duo-ul Dinamic. În multe cărți de specialitate este precizat faptul ca MySQL este mult
mai ușor de învățat și folosit decât multe din aplicațiile de gestiune a bazelor de date, ca
exemplu comanda de ieșire fiind una simplă și evidentă: „exit” sau „quit”.
Pentru a administra bazele de date MySQL se poate folosi modul linie de comandă sau,
prin descărcare de pe internet, o interfață grafică: MySQL Admi nistrator și MySQL Query
Browser. Un alt instrument de management al acestor baze de date este aplicația gratuită, scrisă
în PHP, phpMyAdmin.

Laborator SIAD Lucrarea nr.1
126 MySQL poate fi rulat pe multe dintre platformele software existente: AIX, FreeBSD,
GNU/Linux, MacOS X, NetBSD, So laris, SunOS, Windows
9x/NT/2000/XP/Vista.

1.2.1 Instalarea MySQL Server 5 din colecția de porturi FreeBSD

1. Login în sistemul FreeBSD ca root, sau su – root pentru a intra în mediul superuser
2. Introduce -ți următoarele comenzi în modul CLI (command line interface) al
FreeBSD (Așteptați până când fiecare comandă își termină execuția înainte de a tasta
comanda următoare):
cd /usr/ports/databases/mysql50 –
server make install clean
mysql_install_db chown -R mysql
/var/db/mysql/ chgrp -R mysql
/var/db/my sql/
/usr/local/bin/mysqld_safe -user=mysql &
Notă: Dacă primiți răspunsul "Command not found error", folosiți comanda
rehash pentru a împrospăta variabilele sistemului de operare.

3. Instalarea porturilor va pune un fișier script mysql -server.sh în loc ația
/usr/local/etc/rc.d care are capabilitatea de a porni serverul MySQL. Pentru a
determina serverul MySQL să pornească automat la fiecare bootare a FreeBSD
trebuie adăugat, în fișierul /etc/ rc.conf următoarea linie de script:
mysql_enable=”YES”

4. În mod implicit, superutilizatorul MySQL este root, care nu are setată nici o parolă
(parolă blank). Așadar este importantă atribuirea unei parole contului de
administrator, lucru care se face cu următoarele comenzi:
mysqladmin -u root password newpasswor d
Înlocuiți newpassword cu parola dorită (parola) – este
obligatorie

5. Opțional, se poate copia fie my -huge.cnf, my -large.cnf, my -medim.cnf, mysmall.cnf
sau my -innodb -heavy -4G.cnf (în funcție de modul de utilizare al serverului MySQL)
ca my.cnf în directo rul /var/db/mysql, care va permite modificarea configurărilor
serverului prin editarea acestui fișier.

6. Instalarea lui MySQL 5.0 a luat sfârșit.

7. Chiar dacă nu este neapărat nevoie, pentru o mai mare siguranță, dați restart
(reboot).

Laborator SIAD Lucrarea nr.1
127 1.2.2 I nstalarea phpMyAdmin – (nu merge fără PHP)
În modul linie de comandă, logat ca root, se dau următoarele comenzi. Se așteaptă
terminarea execuției comenzii curente, pentru a o da pe următoarea.

cd /usr/ports/databases/phpmyadmin
make make install
ln -s /usr/local/www/phpMyAdmin
/usr/local/www/apache22/data/phpMyAdmin (crează un link în directorul
data al localhost -ului) cd /usr/local/www/data/phpMyAdmin cp
config.sample.inc.php config.inc.php

Se editează fișierul config.inc.php, următoarele linii as tfel:
$cfg['blowfish_secret'] = ' parola'

$cfg['Servers'][$i]['auth_type'] = 'cookie'; //Authentication method
(config, http or cookie based)?

$cfg['Servers'][$i]['controluser'] = 'root';
$cfg['Servers'][$i]['controlpass'] = ' parola';

$cfg['ShowChgPassword'] = FALSE; // simple users or not

1.3 Instalarea și configurarea Apache22
Un server HTTP este un daemon care acceptă conexiuni conforme protocolului
HTTP, răspunzând cererilor recepționate de la clienți. Protocolul HTTP (HyperText
Transfer Protocol) este un protocol de tip cerere -răspuns, bazat pe TCP/IP, destinat
transferurilor informațiilor multimedia. Serverul cel mai utilizat pe sistemele de operare
UNIX este Apache .
Versiunea 2.2 are implementat un nou modul API de autentificare care permite o
flexibilitate mai mare. De asemenea și module pentru cache si proxy.

1. Instalarea Apache HTTP Server 2.20 folosind colecția de porturi FreeBSD:
cd /usr/ports/www/apache22
make install clean

2. scriptul pentru serverul Apache http, script apache22.sh este localizat în
/usr/local/etc/rc.d pentru a oferi serviciu de pornire și oprire a serverului Apache
HTTP. Pentru a activa serverul web Apache a pornească automat la bootarea
sistemului, se adaugă următoarea linie de comandă în /etc/ rc.conf :
apache22_enable =”YES”

3. Pentru a porni serverul web Apache HTTP imediat, se folosește una din comenzile:
/usr/local/sbin/apachectl start
sau
/usr/local/etc/rc.d/apache22.sh start

4. Instalarea a luat sfârșit, se recomandată restartarea sistemului .

Laborator SIAD Lucrarea nr.1
128
1.4 Instalarea și configurarea PHP
PHP este un limbaj de programare destinat în primul rând Internetului, aducând
dinamică unei pagini de web. Este unul din cele mai importante limbaje de programare
web open -source și server -side. Numele PHP provin e din limba engleză și este un acronim
recursiv : Php: Hypertext Preprocessor. Folosirea PHP poate fi văzută ca o alternativă
gratuită la utilizarea unor limbaje comerciale cum sunt ASP de la Microsoft, ColdFusion
de la Macromedia, sau chiar JSP de la Sun Microsystems.
Popularitatea de care se bucură acest limbaj de programare se datorează următoarelor
caracteristici :
• Familiaritatea : sintaxa limbajului este foarte ușoară combinând sintaxele unora
din cele mai populare limbaje Perl sau C;
• Simplitatea : sintaxa limbajului este destul de liberă. Nu este nevoie de includere
de biblioteci sau de directive de compilare, codul PHP inclus într -un document
executându -se între marcajele speciale;
• Eficiența : PHP -ul se folosește de mecanisme de alocare a resursel or, foarte
necesare unui mediu multiuser, așa cum este Web -ul;
• Securitatea : PHP -ul pune la dispoziția programatorului un set flexibil și eficient
de măsuri de siguranță;
• Flexibilitatea : fiind apărut din necesitatea dezvoltării Web -ului, PHP a fost
modu larizat pentru a ține pasul cu dezvoltarea diferitelor tehnologii. Nefiind legat
de un anumit server web, PHP -ul a fost integrat pentru numeroasele servere web
existente: Apache, IIS, Zeus, server, etc.;
• Gratuitatea : este probabil cea mai importantă cara cteristică a PHP -ului.
Dezvoltarea PHP -ului sub licența open -source a determinat adaptarea rapidă PHP –
ului la nevoile Web -ului, eficientizarea și securizarea codului.

Sub sistemul de operare FreeBSD s -a optat pentru instalarea pachetului PHP5 din
colecț ia de porturi (/usr/ports/lang/php5).

1. instalarea se face cu ajutorul următoarelor comenzi în modul CLI al FreeBSD, se
așteaptă până la terminarea execuției unei comenzi pentru a o scrie pe următoarea:
cd /usr/ports/lang/php5
make install clean

2. Dacă sunteți întrebați, selectați “use Apache 2.x instead”.

La execuția comenzii make install , este prezentată fereastra de configurare a opțiunilor
de compilare pentru PHP.

Laborator SIAD Lucrarea nr.1
129
Fig.1. Configurare PHP5 – faza de compilare
3. Instalarea PHP5 extensions și a mo dulelor ce permit suportul pentru Apache se face cu
comenzile:
cd /usr/ports/lang/php5 -extensions
make config

4. La opțiunile pentur php5 -extension, selectați toate extensiile PHP și modulele care le –
ați putea folosi cu serverul Apache și cu bazele de da te MySQL.

5. Se continuă instalarea lui php5 -extensions cu următoarele comenzi: make install
clean

6. Dacă apare vre -un mesaj prin care vi se cere să selectați unele opțiuni de configurare, le
puteți accepta pe cele implicite prin apăsarea tastei Enter. U nele module vă pot întreba
pentru acțiuni care includ php5 -gd, php5 -mbstring și php5 -sqlite.

7. Editați fișierul de configurare Apache pentru a permite serverului Apache să încarce
module PHP când sunt inițializate:
1. căutați fișierul de configurare Apache în /usr/local/etc/apache2/
2. Deschideți fișierul de configurare httpd.conf
3. Căutați după liniile LoadModule lines, iar după ultima linie LoadModule, dar în
aceeași secțiune adăugați următoarele două linii:
AddType application/x -httpd-php .php
AddType ap plication/x -httpd-php-source .phps

8. Opțional, copiați fișierul /usr/local/etc/php.ini -recommended sau
/usr/local/etc/php.ini -dist în /usr/local/etc/php.ini (în același director), ceea ce vă
va permite să schimbați setările implicite ale PHP.

Laborator SIAD Lucrarea nr.1
130 9. Porniți serverul Apache HTTP folosind comanda apachectl start (sau restatați Apache
HTTP web server prin utilizarea comenzii apachectl restart ). apachectl este plasată în
/usr/local/sbin , dacă vă apare mesajul Command not found problem, încercați să
schimbați dir ectorul către acea locație, sau restartați sistemul.

10. Instalarea PHP5 a luat sfârșit.

Astfel, un server web a fost setat pe sistemul FreeBSD cu Apache, MySQL și PHP.
Directorul în care serverul web își va ține documentele (acolo unde trebuie plasate
fișierele HTML și PHP este /usr/local/www/apache22/data/ și aveți nevoie de client
SecureFTP (SFTP) cum ar fi WinSCP pentru a upload -a fișierele în siguranță pe serverul
web.

1.5 Verificarea instalării Apache, PHP și MySQL , verificarea/modificarea
fișierelor de configurare
1.5.1 Verificarea serverului Web Apache
Pentru a testa funcționarea serverului web, se deschide navigatorul web și la adresă
se tastează: localhost . Ar trebui să apară o pagină cu următorul mesaj: It Works!

Dacă nu merge, veri ficați fișierul de configurare al serverului Apache, httpd.conf aflat
în /usr/local/etc/apache2/

Liniile de script cele mai importante sunt:
#
# Listen: Allows you to bind Apache to specific IP addresses and/or #
ports, instead of the default. See al so the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 127.0.0.1:80
Listen 192.168.1.4:80 #adresa IP a serv erului local – poate fi alta

LoadModule php5_module libexec/apache22/libphp5.so

User www
Group www
</IfModule>

ServerAdmin admin@localhost.com

ServerName www.localhost.com:80

DocumentRoot "/usr/local/www/apache22/data"

Laborator SIAD Lucrarea nr.1
131 <IfModule dir_module>
DirectoryIndex index.html index.php </IfModule>

Alias /phpmyadmin/ "/usr/local/www/phpMyAdmin/"

<Directory "/usr/local/www/phpMyAdmin/">
Options none
AllowOverride Limit

Order Deny,Allow
# Deny from all
Allow from all
</Directory>

1.5.2 Verificarea funcționării PHP
În directorul rădăcină al serverului Apache, care este
/usr/local/www/apache22/data/ , se creează un fișier cu extensia .php, numit phpinfo.php , și
care conține următorul script:
<?php
phpinfo(
);
?>
Se deschide un browser web, și la adresă se tastează: localhost/phpinfo.php , iar în
fereastră ne vor apărea informații despre PHP, și anume:

Laborator SIAD Lucrarea nr.1
132 1.5.3 Verificarea funcționării phpMyAdmin
Se de schide browserul de web și se tastează: localhost/phpmyadmin/ , și ar trebui să
apară fereastra principală, care arată așa:

Dacă nu funcționează, verificați fișierele de configurare, prezentate la procedura de
instalare phpmyadmin, mysql și apache.
Atenție: dacă pentru baza de date MySQL nu se setează o parolă de root, aplicația
phpMyAdmin va da un mesaj de eroare. De asemenea, trebuie setate parole pentru
$cfg['blowfish_secret'] = ' parola'
și pentru
$cfg['Servers'][$i]['controluser'] = 'root';
$cfg['Servers'][$i]['controlpass'] = ' parola';

1.6 Instalarea și configurarea unui server FTP
Drept server ftp, am optat pentru pachetul pure-ftpd (http://www.pureftpd.org/ ) ,
fiind o implementare stabilă, conformă cu standardele, bine securizată. Această distribuție
a fost aleasă deoarece oferă un foarte bun suport pentru utilizatori virtuali, având
posibilitatea folosirii chiar și a bazelor de date (MySQL, PostgreSQL).
Pachetul se poate instala fie din colecția de porturi (/usr/ports/ftp/pure -ftpd) sau cu
ajutorul utilitarului pkg_add .

Laborator SIAD Lucrarea nr.1
133
Instalare pure -ftpd cu pkg_add
În ambele cazuri, după instalare, trebuie editat manual fișie rul de configurare al
serviciului, activat să pornească automat odată cu pornirea sistemului de operare și lansat
în execuție.
Fișierul de configurare, pure -ftpd.conf, trebuie amplasat în directorul
/usr/local/etc .
Important de menționat este faptul că serverul a fost configurat să nu permită
accesul anonim, utilizatorul fiind blocat în directorul său (chroot), evidența utilizatorilor
fiind păstrată în sistemul nativ de baze de date, puredb .
Pentru a se putea crea utilizatori virtuali, în sistemul de o perare trebuie creat un
cont de utilizator, care să nu aibă posibilitate de login și director home. Acest utilizator
real este necesar deoarece, după autentificarea prin protocolul ftp, utilizatorul virtual va
fi impersonalizat (va primi identitatea) acest ui utilizator real.
În liniile de mai jos este prezentată secvența de comenzi pentru crearea utilizatorului de
sistem și a unui utilizator virtual.
ns1# adduser
Username: ftp
Full name: FTP Virtual user
Uid (Leave empty for default):
Login group [ftp]:
Login group is ftp. Invite ftp into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [sh]: nologin
Home directory [/home/ftp]: /dev/null Use
password -based authentication? [yes]: no
Lock out the account after creation? [no]:
Username : ftp
Password : <disabled>
Full Name : FTP Virtual user
Uid : 1005
Class :

Laborator SIAD Lucrarea nr.1
134 Groups : ftp
Home : /dev/null
Shell : /usr/sbin/nologin
Locked : no OK? (yes/no): yes adduser: INFO:
Successfully added (ftp) to the user database. Add another
user? (yes/no): no Goodbye!
ns1# pure -pw useradd admin -u ftp -g ftp -d /usr/local/ftp
Password: Enter it again:
ns1# pure -pw mkdb ns1# cd
/usr/local/etc/rc.d/ ns1#
./pure-ftpd forcestart
Starting pureftpd.
Running: /usr/loca l/sbin/pure -ftpd -A -c50 -B -C8 -D -E -fftp -H
-I15 -lpuredb:/usr/local/etc/pureftpd.pdb -L2000:8 -m4 -s -U133:022 u100
-k99 –Z ns1# mkdir /usr/local/ftp
ns1# chown -R ftp:ftp /usr/local/ftp/

În liniile de mai sus se remarcă necesitatea creării unui di rector pentru utilizatorul
virtual, în cazul de față /usr/local/ftp.

Laborator SIAD Lucrarea nr.2
135
2 Instalarea și configurarea serverului Apache, PHP și MySQL
pe sistemul de operare Windows
2.1 Obiective
• Instalarea și configurarea serverului Apache;
• Instalarea și configur area PHP;
• Instalarea și configurarea serverului MySQL și a aplicației PhpMyAdmin;
• Instalarea editorului PHPDesign 2005;
• Testarea funcționării aplicațiilor instalate.

Pe sistemul de operare Windows există mai multe aplicații folosite ca servere Web,
unul dintre ele fiind încorporat chiar în sistemul de operare Windows (2000, 2003 și chiar
XP), și anume Internet Information Service (ISS) care se poate adăuga după instalarea
sistemului de operare din Add or Remove Windows Components.
Pentru această lucr are de laborator s -a ales însă combinația WAMP (Windows,
Apache, MySQL, PHP), care poate fi implementată fie instalând fiecare componentă în
parte și modificându -le ulterior fișierele de configurare, fie, soluția adoptată, utilizarea
unei aplicații softwar e care le înglobează pe toate trei. Aici putem alege între EasyPHP
și/sau XAMPP. Pentru lucrare am ales EasyPHP , care este un program Open Source, și
poate fi descărcat liber de pe internet de la adresa:
http://www.easyphp.org/telechargements.php3 .
2.2 Instalarea și configurarea EasyPHP -2.0b1
Pașii de instalare sunt:
1. Se dă dublu click pe fișierul , și astfel se pornește
insta larea aplicațiilor;
2. se alege limba de instalare – implicit Enlish –
OK

3. Se dă Next, se acceptă condițiile de licență, Next, Next , se alege locul de instalare
al aplicațiilor – implicit este în C:\Program Files \EasyPHP 2.0b1 , și lăsăm așa,
Next, … până la Finish.
Pachetul este instalat în C: \Program Files \EasyPHP 2.0b1 \ iar directorul unde sunt
ținute și de unde se accesează paginile și scripturile PHP este www . Versiunile
programelor aflate în EasyPHP sunt:
• Apache Version Apache/2.2.3 (Win 32)

Laborator SIAD Lucrarea nr.2
136 • PHP/5.2.0
• MySQL
ATENȚIE: Dacă fișierele HTML pot fi deschise cu un navigator Web oriunde s –
ar afla ele, scripturile PHP trebuie apelate scriind adresa http://localhost.numefi șier.php
deoarece scriptul PHP este interpretat de serverul Web
(Apache) și rezultatul interpretării este trimis bowserul ui, acesta neștiind să interpreteze
PHP așa cum o face cu HTML. De asemenea, scripturile php trebuie amplasate în
directorul C:\Program Files \EasyPHP 2.0b1 \www, mai sus menționat.

Pentru a putea accesa fișierele *.html din rețea, în fișierul de configur are al
serverului Apache, aflat în C: \Program Files \EasyPHP 2.0b1 \conf_files  httpd.conf,
trebuie adăugată liniei de comandă listen adresa serverului, așa cum se vede mai jos:
#Listen 12.34.56.78:80
Listen 127.0.0.1:80
#Listen adresa IP a serverului , de exemplu:
Listen 192.168.1.2:80

Alte configurări ce ar mai trebui făcute sunt următoarele:
# ServerAdmin: Adresa de e -mail a administratorului serverului. Dacă
#apar probleme în administrare, acestea vor fi trimise la această
# adresă de e -mail. Această adresă apare în unele pagini generate de
# server, cum ar fi documentele de eroare, ex: admin@nume_domeniu.com
#
ServerAdmin admin@localhost
#De exemplu, pentru domeniu universității, ar fi: admin@ub.ro
#
# ServerName oferă un nume și un por t cu care serverul se identifică #
aceasta poate fi de obicei determinată automat, dar se recomandă
specificarea lui pentru a preveni problemele de startup.
#
# Dacă nu aveți înregistrat un domeniu (nume DNS), introduce -ți adresa
# IP a serverului
#
ServerName localhost
# exempleu : www.ub.ro – domeniul Universității din Bacău.
# localhost se identifică cu adresa IP: 127.0.0.1

Verificarea instalării corecte a serverului Apache: Se deschide browserul de
Intern et și se tastează localhost . Dacă instalarea este corectă trebuie să fie afișate una din
următoarele:
1. dacă avem un fișier index.html sau index.php sau index.htm va fi afișat acesta; 2.
dacă nu, de va afișa conținutul folderului: C:\Program Files \EasyPH P 2.0b1 \www,
așa cum se vede în figura de mai jos.

Laborator SIAD Lucrarea nr.2
137
2.3 Instalarea aplicației PhpMyAdmin
Pentru a administra baza de date MySQL vom folosi aplicația phpMyAdmin, care
poate fi descărcată de aici: http://www.phpmyadmin.net/home_page/index.php . Aceasta
este o colecție de scripturi php care ajută la gestionarea bazei de date prin intermediul unei
interfețe Web. Arhiva descărcată de mai sus va fi dezarhivată în directorul C: \Program
Files \EasyP HP 2.0b1 \www \phpMyAdmin. Pentru a lansa în execuție aplicația de
administrare a bazei de date se deschide navigatorul web iar în url se tastează:
http://localhost/phpmyadmin/ apărând fereastra de autentificare :

În mod implicit, parola pentru root este nesetată (vidă), iar la apăsarea butonului
Execută se încarcă pagina următoare:

Laborator SIAD Lucrarea nr.2
138

Deoarece existența contului root fără parolă de acces este periculoasă p entru
integritatea bazei de date, va trebui să -i setăm o parolă de acces. Vom face aceasta apăsând
pe legătura "Drepturi de acces" sau "Privileges" dacă interfața este în engleză. Se va
încărca pagina cu drepturi de acces asupra MySQL, și în dreptul lui r oot apăsăm pe
butonul ce indică modificarea:

Apoi după ce s -a încărcat următoarea pagină, găsiți unde apare ”Schimbare
parola” și bifați ”Parola”, apoi tastați parola dorită de dumneavoastră și în prima, și în a –
II-a căsuță, după care apăsați pe but onul „Executa”. După setarea parolei de root, mai
apare un cont de utilizator "Oricare", fără parole și cu privilegii reduse.
OBS: În cadrul laboratorului, pentru aplicațiile instalate de studenți, parola de root
va fi parola .
2.4 PHP Designer 2005
Paginile web, fie ele html sau php se pot scrie în orice editor de text, de exemplu
notepad. Dar pentru scrierea ușoară, rapidă și fără erori a unor pagini mari există diverse
aplicații (editoare php, html). Dintre acestea amintesc doar PHPEdit și PHP Designe r
2005. Dintre acestea îl vom folosi pe ultimul, care este Free, cu toate că este mai puțin
complex. Noua versiune PHPDesigner2007 nu mai este Free.
Instalarea se face simplu, ca orice aplicație sun Windows, și nu ar trebui să fie o
problemă pentru un stu dent din anul III la Tehnologia informației.
Cu ajutorul acestui editor PHP vom crea prima pagină html și prima pagină php.

Laborator SIAD Lucrarea nr.2
139 2.4.1 Prima pagină HTML
Se deschide aplicația PHPDesign 2005, se alege un document nou te tip html și se
introduce scriptul de ma i jos:

script html : Explicații:
<html > – început document html
<head> – început antet,
<title>Document Nou</title> – titlul documentului
</head> – sfârșit antet document
<body>
Prima pagina web in HTML!! – începutul corpului doc umentului (paginii web)
</body> – conținutul paginii
</html> – sfârșitul corpului documentului (paginii web)
– sfârșitul documentului html.

Se salvează documentul creat cu numele index.html în directorul: C:\Program
Files \EasyPHP 2.0b1 \www
Rezulta t: în navigatoul web, la adresă scriem următoarele: localhost și ar trebui să
vedem următoarea pagină:

Laborator SIAD Lucrarea nr.2
140
Corpul documentului
2.4.2 Prima pagină PHP

Se deschide un nou fișier în PHPDesign 2005, și de data aceasta se alege opțiunea
php. În noua ferea stră se introduce scriptul de mai jos:

Script php: Explicații
<?php – început document php
phpinfo(); – funcția phpinfo, care întoarce informații despre serverul PHP
?> – sfârșit document php

Rezultat:
Salvăm fițierul sub numele info.php în directorul mai sus menționat, iar la adresa
browserului web introducem: localhost/info.php . În pagina web ar trebui să apară
informații despre serverul PHP, Apache și MySQL instalate pe sistem.
Dacă nu apare nimic, înseamnă că serverul php nu este in stalat corect sau fișierul
nu este salvat în directorul: C:\Program Files \EasyPHP 2.0b1 \www

Adresa local
ă

Titlul documentului

Laborator SIAD Lucrarea nr.2
141

Laborator SIAD Lucrarea nr.3
142
3 Primii pași în HTML
3.1 Obiective
• Introducere în elementele de bază ale limbajului HTML;
• Realizarea unor scripturi HTML, și modificarea acesto ra pentru a vedea
diferențele;

3.2 Introducere
Orice document HTML începe cu notația <html> și se termină cu notația
</html> . Aceste "chestii" se numesc în literatura de specialitate "TAG -uri".Prin
convenție, toate informațiile HTML încep cu o parantez ă unghiulară deschisa "<" și se
termină cu o paranteză unghiulară închisă ">".
Tag-urile dintre aceste paranteze transmit comenzi către browser pentru a afișa
pagina într -un anumit mod. Unele blocuri prezintă delimitator de sfârșit de bloc, în timp
ce pen tru alte blocuri acest delimitator este opțional sau chiar interzis.
Între cele două marcaje <html> și </html> vom introduce două secțiuni:
• secțiunea de antet <head>…</head> și
• corpul documentului <body>…</body> . Blocul <body>…</body> cuprinde
conținutul propriu -zis al paginii HTML, adică ceea ce va fi afișat în fereastra
browser -ului.

O etichetă poate fi scrisă atât cu litere mici, cât și cu litere mari. Adică
<HTML> = <HtmL> = <html> . Caracterele "spațiu" și "CR/LF" (Enter) ce apar între
etichete sunt ignorate de către browser.
Deci un prim document HTML ar fi ceva de genul asta:
<html>
<head> </head>
<body>
</body>
</html>
Așa arată primul document HTML. Copiați -l folosind Copy/Paste într -un fișier
nou și salvați -l ca test3.htm sau test3.html . Apoi porniți Mozilla Firefox sau Internet
Explorer, dați CTRL -O și introduceți calea spre fișier. Dați OK și … nimic. – Normal,
între tagurile <body> nu este scris nimic.
Să adăugăm primele elemente la pagina noastră. În primul rând, ti tlul unei pagini
se obține inserând în secțiunea <head>…</head> a următoarei linii:

<title>Aceasta este prima mea pagina de Web</title>

În plus, în secțiunea <body>…</body> putem scrie texte cât dorim. Dacă nu
întâlnim nici un marcaj < sau > atunci interpretorul HTML le va lua ca texte simple și le
va afișa pe ecran. Să vedem noua versiune a paginii noastre:
<html>
<head>

Laborator SIAD Lucrarea nr.3
143 <title>Aceasta este prima mea pagina de Web</title>
</head>
<body>
Bine ati venit in pagina mea de Web!
</body>
</html>

Conținutul blocului <title>…</title> va apărea în bara de titlu a ferestrei
browser -ului. Dacă acest bloc lipsește într -o pagină HTML, atunci în bara de titlu a
ferestrei browser -ului va apărea numele fișierului.
Dacă introducem mai multe linii într -o pagină browser -ul va afișa într -un singur
rând, întrucât caracterele "Enter – CR/LF " sunt ignorate de browser. Trecerea pe o linie
nouă se face la o comandă explicită, care trebuie să apară în pagina html.
Această comanda este ma rcajul <br> ( de la " line break " – întrerupere de linie ).
Folosind aceleași operații ca mai sus, vizualizați noua pagina! Veți vedea textul
ce apare în fereastra navigatorului. În plus, pagina dvs. va avea un titlu nou, cel introdus
de dvs.
<html>
<head>
<title> titlul paginii </title>
</head>
<body>
Bine ati venit in <br> pagina mea de Web!
</body>
</html>

3.3 Elemente constructive
3.3.1 Blocuri preformatate
Pentru ca browser -ul să interpreteze corect caracterele "spațiu", "tab" și " CR/LF"
ce apar în cadrul unui text, acest text trebuie inclus într -un bloc <pre>…</pre> .
<html>
<head>
<title>bloc preformatat </title>
</head>
<body><pre>
Prima linie
A doua linie
A treia linie
</pre></body>
</html>
3.3.2 Culoarea de fond
O culoare poate fi precizată în două moduri:
• Printr -un nume de culoare. Sunt disponibile cel puțin 16 nume de culori: aqua,
black, fuchsia, gray, green lime, maroon, navy, olive, purple, red, silver, teal,
white si yellow.

Laborator SIAD Lucrarea nr.3
144 • Prin construcția "#rrggbb" unde r (red), g (green), sau b (blue) sunt cifre
hexazecimale și pot lua valorile: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, A, b, B, c, C, d, D,
e, E, f, F; se pot defini astfel 65536 de culori.

Culoarea unei pagini se precizează prin intermediul unui atribut al etichetei
<body> .

Culoarea fondului paginii Web se stabilește cu atributul bgcolor al etichetei
<body> , de exemplu: <body bgcolor = culoare> .
Următorul exemplu realizează o pagină cu fondul de culoare gri.
<html>
<head>
<title>culoare de fond </title>
</head>
<body bgcolor=gray>
O pagina Web cu fondul GRI!
</body>
</html>
3.3.3 Culoarea textului
Acest lucru se face prin intermediul atributului text al etichetei <body> după
sintaxa <body text=culoare> . În următo rul exemplu textul are culoarea roșie.
<html>
<head>
<title>culoare textului </title>
</head>
<body text=red>
Un text de culoare rosie.
</body>
</html>

O etichetă poate avea mai multe atribute. De exemplu, o etichetă cu trei atribute
arata as tfel: <eticheta atribut1 = valoare1 atribut2 = valoare2 atribut3 =
valoare3> . Următorul exemplu prezintă o pagină cu fondul de culoare albastră și textul
de culoare galbenă.
<html>
<head>
<title>atribute multiple </title>
</head>
<body bgcolor=blue t ext=yellow>
Fond de culoare albastra si text de culoare galbena.
</body>
</html>

Textul afișat este caracterizat de următoarele atribute: Mărime ( size ), Culoare
(color ), Font (style ). Acestea sunt atribute ale etichetei <basefont> . Este o etichetă
singulară (fără delimitator de sfârșit de bloc).
<basefont size = numar color = culoare face = font>
unde:

Laborator SIAD Lucrarea nr.3
145 • număr – poate fi 1, 2, 3, 4, 5, 6 sau 7; (1 pentru fontul cel mai mic și 7 pentru
fontul cel mai mare);
• culoare – este o culoare precizată pri n nume sau printr -o construcție RGB;
• font – face : poate fi un font generic ca "serif", "san serif", "cursive",
"monospace", "fantasy" sau un font specific instalat pe calculatorului clientului,
ca "Times New Roman", "Helvetica" sau "Arial". Se acceptă ca valoare și o listă
de fonturi separate prin virgulă, de exemplu: "Times New Roman, serif,
monospace ".

Domeniul de valabilitate al caracteristicelor precizate de această etichetă se
întinde de la locul în care apare eticheta până la sfârșitul pagin ii sau până la următoarea
etichetă <basefont> .
Dacă acest atribut lipsește atunci textul din pagina Web are atribute prestabilite
sau atribute precizate de browserul utilizat.
Atributele prestabilite sunt: size = 3, color = black, și style = " Times Ne w Roman
" .
Poziționarea conținutului paginii Web față de marginile ferestrei browserului se
poate face cu ajutorul a două atribute ale etichetei <body> :
• leftmargin (stabilește distanța dintre marginea stângă a ferestrei browserului și
marginea stângă a conținutului paginii);
• topmargin (stabilește distanța dintre marginea de sus a ferestrei browserului și
marginea de sus a conținutului paginii);
<html>
<head>
<title>Configurarea textului si stabilirea marginii </title>
</head>
<body leftmargin=" 100" topmargin="50">
Textul are atribute implicite. <br>
<basefont face="Arial" color="blue" size="6">
Textul este scris cu fontul "Arial", culoare albastru si marime 6.
</body>
</html>
3.3.4 Stiluri pentru blocurile de text
Pentru ca un bloc de te xt să apară în pagină evidențiat (cu caractere aldine), trebuie
inclus între delimitatorii <b>…</b> (b vine de la "bold" = îndrăzneț).
Pentru ca un text să fie scris cu caractere mai mari cu o unitate decât cele curente
acesta trebuie inclus într -un bl oc delimitat de etichetele <big>…</big> .
Pentru ca un text să fie scris cu caractere mai mici cu o unitate decât cele curente
acesta trebuie inclus într -un bloc delimitat de etichetele <small>…</small> .
Pentru ca un text să fie scris cu caractere c ursive, acesta trebuie inclus într -un bloc
delimitat de etichetele <i>…</i> (i vine de la "italic").
Pentru a insera secvențe de text aliniate ca indice (sub -script) sau ca exponent
(super -script), aceste fragmente trebuie delimitate de etichetele <sub >…</sub> , respectiv
<sup>…</sup> .
Pentru a insera un bloc de caractere subliniate se utilizează etichetele <u>…</u>
(u vine de la " underline ").

Laborator SIAD Lucrarea nr.3
146 Pentru a insera un bloc de caractere tăiate se utilizează etichetele
<strike>…</strike> sau <s>… </s>.
În exemplul următor vom utiliza toate etichetele menționate anterior.
<html>
<head>
<title>Stiluri pentru blocuri de text </title>
</head>
<body>
<b>Text scris cu caractere ingrosate.</b>
<br> <big>Text cu caractere marite cu o unitate <big >mai mare<big> si
mai mare<big> si mai mare.</big></big></big></big><br>
<small>Textul este scris cu caractere micsorate cu o unitate
<small>mai mic.</small></small><br>
<i>Text scris cu caractere italice.</i>
<br> In aceasta linie <sup>sus</sup> es te superscript iar
<sub>jos</sub> este subscirpt.<br>
<strike>Aceasta linie este in intregime sectionata de o linie
orizontala.</strike> <br>
In aceasta linie urmatorul cuvant este <u>subliniat</u>, iar cuvantul
<s>strike</s> sectoinat.
</body>
</html>
3.3.5 Stiluri fizice și logice
Am prezentat deja 8 stiluri de scriere a caracterelor unui bloc de text, numite și
stiluri fizice întrucât nu s -a acordat nici o atenție semnificației informației conținute de
aceste blocuri.
În continuare sunt prezen tate stilurile utilizate la formatarea unui bloc.
Aceste stiluri țin cont de semnificația pe care o are blocul în cadrul paginii Web.
Pentru a pune în evidență (prin silul cursiv) fragmente de text se utilizează
etichetele:
• <cite>…</cite> ("cite" î nseamnă citat);
• <em>…</em> (em vine de la "emphasize" = a evidenția). În locul lor se
poate utiliza eticheta echivalenta <i>…</i> .

Următoarele etichete au efecte similare. Ele permit scrierea fragmentului de text
cu caractere monospațiate (de ti pul celor folosite de o mașină de scris):
• <code>…</code> ("code" înseamnă cod sau sursă);
• <kbd>…</kbd> (kbd vine de la " keyboard " = tastatură);
• <tt>…</tt> (tt vine de la " teletype " = teleprinter).

Eticheta de tip bloc <blink>…</blink> delimitează fragmente de text clipitoare.
<html>
<head>
<title>Blocuri de caractere monospatiate si clipitoare </title>
</head>
<body>
Aceasta linie este formata din text normal.<br> Codul
functiei f(x,y) este: <code>Function f(x,y) {return
x+y;}</code><br>
Tastati urmatoarea comanda comanda DOS:

Laborator SIAD Lucrarea nr.3
147 <kbd> copy c: \windows\* c:\temp<kbd><br>
<tt>Asa scrie un teleprinter</tt><br>
Acest cuvant clipeste <blink>Blink</blink>
</body>
</html>

Exemplul următor ilustrează că etichetele pot fi imbri cate.
• un fragment de text poate fi scris cu aldine și cursive în același timp;
• pentru un fragment de text se pot folosi simultan stilurile subliniat, exponent,
mărit și cursiv.
• Blocul <q>…</q> permite inserarea in -line a citatelor. Aceste citate su nt afișate
de către browser cu caractere cursive . "q" vine de la "in -line quotation" (citate
inserate in -line); Și blocurile " q " pot fi imbricate.

<html>
<head>
<title>Imbricarea etichetelor </title>
</head>
<body> Aceasta linie este formata d in text normal.<br>
Normal <b>ingrosat <i> ingrosat si italic </i> ingrosat </b>.
<br> Normal <u>subliniat <b> subliniat si ingrosat <big>subliniat,
ingrosat si marit.<br>
<i>Subliniat, ingrosat ,marit si italic.</i> </big></b></u>
</body>
</html>

Laborator SIAD Lucrarea nr.4
148
4 Principalele structuri în HTML
4.1 Obiective
• dobândirea cunoștințelor despre legături, liste, tabele în html;
4.2 Recapitulare
Orice document HTML începe cu notația <html> și se termină cu notația
</html> . Aceste "chestii" se numesc în l iteratura de specialitate "TAG -uri".Prin
convenție, toate informațiile HTML încep cu o paranteză unghiulară deschisa "<" și se
termină cu o paranteză unghiulară închisă ">".
Tag-urile dintre aceste paranteze transmit comenzi către browser pentru a afișa
pagina într -un anumit mod. Unele blocuri prezintă delimitator de sfârșit de bloc, în timp
ce pentru alte blocuri acest delimitator este opțional sau chiar interzis.
Între cele două marcaje <html> și </html> vom introduce două secțiuni:
• secțiunea de antet <head>…</head> și
• corpul documentului <body>…</body> . Blocul <body>…</body> cuprinde
conținutul propriu -zis al paginii HTML, adică ceea ce va fi afișat în fereastra
browser -ului.

O etichetă poate fi scrisă atât cu litere mici, cât și cu litere mari. Adică
<HTML> = <HtmL> = <html> . Caracterele "spațiu" și "CR/LF" (Enter) ce apar între
etichete sunt ignorate de către browser.
Fișier de lucru:
Studenții vor crea un director Lucrare4, în care vor crea fișierul de lucru
lucrare4.html , în care vor scrie, pentru început următorul scrip:
<html >
<head>
<title>Document Nou</title>
</head>
<body>
<h1>Lucrarea de laborator nr 4 <br> lectii de html</h1>
<h2>Crearea legaturilor in html</h2>

Aici studenții vor introduce
următoarele linii de script
</body>
</html
pe parcursul lucrării, vor adăuga în acest fișier liniile de script ce le vor fi
indicate:
4.3 Legături – link-uri
Pentru această secțiune, studenții vor mai crea în același director, două fișiere
html, numite pagina1.html și pagina2.html , în care vor introduce următoarele scripturi:
<html >
<head>
<title>Pagina 1 </title>

Laborator SIAD Lucrarea nr.4
149 </head>
<body>
<font color=red><h3>Lucrarea de laborator nr 4 <br> pagina
1</h3></font>
</body>
</html>

ș
i

<html >
<head>
<title>Pagina 2 </title>
</head>
<body>
<font color=blue><h3>Lucrarea de laborator nr 4 <br> pagina
2</h3></font>
</body>
</html>

O legătură către o pagină aflată în același director se formează cu ajutorul
etichetei <a> (de la "anchor"=ancora). Pe ntru a preciza pagina indicată de legătură se
utilizează un atribut al etichetei <a> numit href , care ia valoare numele fișierului HTML
aflat în același director. Zona activă care devine sensibilă la apăsarea butonului stâng al
mouse -ului este formată din textul cuprins între etichetele <a>…</a> .
Prezența etichetei de sfârșit </a> este obligatorie.
În pagina principală, de lucru, lucrare4.html se scriu în continuare legăturile către
pagina 1 și către pagina2:

Legatura catre pagina1: <a href="pagina1 .html"> apasa aici
</a><br>
Legatura catre pagina2: <a href="pagina2.html"> apasa aici
</a><br>

Dacă vrem să creăm o legătură către o pagină de pe disc, în loc de
"pagina1.html" vom scrie calea către fișierul respectiv.
Pentru a crea o legătură către un iste extern, vom scrie adresa site -ului, de ex:

<a href="http://www.yahoo.com"><b> Catre site -ul YAHOO</b>
</a><br>

4.3.1 Ancore
Într-o pagină foarte lungă pot exista puncte de reper către care se definesc legături.
O ancoră se definește de as emenea prin eticheta <a>. Pentru a defini ancora se
utilizează atributul name care primește ca valoare un nume atribuit ancorei (de exemplu
"leg1").
Pentru a insera o legătura către "leg1" definită în aceeași pagină se utilizează
eticheta <a> având atrib utul href de valoare "#leg1" .

Laborator SIAD Lucrarea nr.4
150 Pentru a introduce o legătură către o ancoră definita în alt document (alta pagină)
aflat în același director, atributul href primește o valoare de forma
"nume_fisier.html#nume_ancora" .
Vom defini o ancoră în top -ul paginii și una la sfârșitul paginii astfel:
În topul paginii, după tag -ul <body> se scrie: <a name="top">top
În josul paginii: înainte de </body> se scrie: <a name="jos">jos
Pentru apelarea ancorelor, scriem în continure, de unde am rămas data trecută:
<h3>Ancore definite in acelasi document </h3>
<a href="#jos">
Link catre sfarsit pagina</a>

<br> 1<br>2<br>3<br>4<br> 5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>
13<br>14<br>15<br>16<br> 17<br>18<br>19<br>20<br> 21<br>22<br>23<br>
24<br>
Catre top pagina
<a href="#top"> Link catre top </h3>

4.4 Liste
4.4.1 Liste neordonate
O listă neordonată este un bloc de text delimitat de etichetele corespondente
<ul>…</ul> (" ul " vine de la " unordered list " = lista neordonata). Fiecare element al
listei est e inițiat de eticheta <li> (list item).
Lista va fi indentată față de restul paginii Web și fiecare element al listei începe
pe un rând nou.
În fișierul pafina1.html se introduc următoarele scripturi, înainte de tagul
</body> :

<h1 align="center">O l ista neordonata</h1><hr>
Glosar de termeni de World Wide Web
<ul>Culori uzuale disponibile prin nume
<li>Black <li>White <li>Red <li>Green <li>Blue <li>Yellow <li>Purple
<li>Aqua
</ul>
Tag-urile <ul> și <li> pot avea un atribut type care stabile ște caracterul afișat
în fața fiecărui element al listei. Valorile posibile al acestui atribut sunt: o
"circle" (cerc)
• "disc" (disc plin) (valoarea prestabilita);
 "square" (patrat)
Listele neordonate pot fi imbricate pe mai multe niveluri: ex emplu: în continuare
se introduc rândurile:
<h1 align="center">O lista neordonata de liste neordonate</h1><hr>
Glosar de termeni de World Wide Web
<ul>Elemente si atribute a unei pagini HTML
<li>Frameset <ul>Atribute: <li>cols <li>rows <li>border </ul>
<li>Frame <ul>Atribute: <li>src <li>name <li>scrolling </ul>
</ul>

Laborator SIAD Lucrarea nr.4
151 4.4.2 Liste ordonate
O listă ordonată de elemente este un bloc de text delimitat de etichetele
corespondente <ol>…</ol> ("ol" vine de la "ordered list" = listă ordonată). Fie care
element al listei este inițiat de eticheta <li> (list item).
Lista va fi indentată față de restul paginii Web și fiecare element al listei începe
pe un rând nou.

<h1 align="center">O lista ordonata</h1><hr>
<ol>Culori uzuale disponibile prin nume
<li>Black <li>White <li>Red <li>Green <li>Blue <li>Yellow <li>Purple
<li>Aqua
</ol>
Tag-urile <ol> și <li> pot avea un atribut type care stabilește tipul de caractere
utilizate pentru ordonarea listei. Valorile posibile sunt:
• " A " pentru o rdonare de tipul A , B , C , D etc. ( litere mari );
• " a " pentru ordonare de tipul a , b , c , d etc. ( litere mici );
• " I " pentru ordonare de tipul I , II , III , IV etc. ( cifre romane mari );
• " i " pentru ordonare de tipul i , ii , iii , iv etc. ( cifre romane mici );
• " 1 " pentru ordonare de tipul 1 , 2 , 3 , 4 etc. ( cifre arabe – opțiune prestabilită);

Listele ordonate pot fi imbricate între ele sau cu liste neordonate, ca în exemplul
următor.
<html>
<head><title>listex_8</title></head >
<body><h1 align="center">O lista ordonata de liste ordonate si
neordonate</h1><hr>
<ol>Un sistem informatic include:
<li>Hardware:
<ol>
<li>placa de baza
<li>procesor
<li>memorie
<li>harddisk
</ol>
<li>Software:
<ul>
<li>Linux
<li>Windows
<li>OS/2
<li>Unix
</ul>
<li>Software de aplicatie:
<ul type="disc">
<li>VisualC ++
<li>Java
<li>SQL
<li>CorelDraw
</ul>
</ol>
</body>
</html>

Laborator SIAD Lucrarea nr.4
152
4.5 Tabele
Tabelele ne permit să creăm o rețea dreptunghiulară de domenii, fiecare domeniu
având propriile opțiuni pentru culoarea fondu lui, culoarea textului, alinierea textului etc.
Pentru a insera un tabel se folosesc etichetele corespondente <table>…</table> . Un tabel
este format din rânduri. Pentru a insera un rând într -un tabel se folosesc etichetele
<tr>…</tr> (de la " table row "= rând de tabel). Folosirea etichetei de sfârșit </tr> este
opțională.
Un rând este format din mai multe celule ce conțin date. O celulă de date se
introduce cu eticheta <td>..</td> .

Toate exemplele de tabele vor fi scrise în fișierul pagina2.html .

În mod implicit, un tabel nu are chenar. Pentru a adăuga un chenar unui tabel, se
utilizează un atribut al etichetei <tabel> numit border .
Acest atribut poate primi ca valoare orice număr întreg ( inclusiv 0 ) și reprezintă
grosimea în pixeli a chenar ului tabelului.
Dacă atributul border nu este urmată de o valoare atunci tabelul va avea o
grosime prestabilita egală cu 1 pixel, o valoare egală cu 0 a grosimii semnifică absența
chenarului.
Când atributul border are o valoare nenulă chenarul unui tab el are un aspect
tridimensional.
Exemplu: tabel cu trei rânduri și patru coloane:

<table border="3">
<tr> <td>celula 11</td> <td>celula 12</td><td>celula 13</td></tr>
<tr> <td>celula 21</td> <td>celula 22</td><td>celula 23</td></tr>
<tr> <td>celula 31</td> <td>celula 32</td><td>celula 33</td></tr>
</table>

4.5.1 Alinierea tabelului
Pentru a alinia un tabel într -o pagina Web se utilizează atributul align al etichetei
<table> , cu următoarele valori posibile: "left" (valoarea prestabilită), "center " și "right".
Alinierea este importantă pentru textul ce înconjoară tabelul. Astfel :
• dacă tabelul este aliniat stânga ( <table align="left"> ), atunci textul care
urmează după punctul de inserare al tabelului va fi dispus în partea dreapta a
tabelului.
• dacă tabelul este aliniat dreapta ( <table align="right"> ), atunci textul care
urmează după punctul de inserare al tabelului va fi dispus în partea stângă a
tabelului.
• dacă tabelul este aliniat pe centru ( <table align="center"> ), atunci textul care
urme ază după punctul de inserare al tabelului va fi afișat pe toată lățimea paginii,
imediat sub tabel.

Laborator SIAD Lucrarea nr.4
153 Pentru a modifica alinierea tabelului nostru, se adaugă align="center" după tagul
<table și înainte de border"3" , așa ca mai jos:
<table align="center " border="3">

4.5.2 Definirea culorilor de fond pentru un tabel
Culoarea de fond se stabilește cu ajutorul atributului bgcolor , care poate fi atașat
întregului tabel prin eticheta <table> , unei linii prin eticheta <tr> sau unei celule de date
prin etic heta <td> .
Valorile pe care le poate primi bgcolor sunt cele cunoscute pentru o culoare.
Dacă în tabel sunt definite mai multe atribute bgcolor , atunci prioritatea este următoarea:
<td> , <tr> , <table> ( cu prioritate cea mai mică ).

Exemplificare c od:
• fond galben pentru tot tabelul:
<table align="center" border="3" bgcolor="yellow">

• fond verde pentru un rândul 1:
<tr bgcolor="green"> <td>celula 11</td> <td>celula 12</td><td>celula
13</td></tr>

• fond roșu pentru celula 11 și celula 23:
… <td bgcolor="red">celula 11</td> …
… <td bgcolor="red">celula 22</td> …

4.5.3 Dimensionarea celulei unui tabel
Distanța dintre două celule vecine se definește cu ajutorul atributului cellspacing
al etichetei <table> . Valorile acestui atribut pot fi nu mere întregi pozitive, inclusiv 0, și
reprezintă distanța în pixeli dintre două celule vecine. Valoarea prestabilită a atributului
cellspacing este 2.
Distanța dintre marginea unei celule și conținutul ei poate fi definită cu ajutorul
atributului cellpad ding al etichetei <table> .Valorile acestui atribut pot fi numere întregi
pozitive, și reprezintă distanța în pixeli dintre celule și conținutul ei. Valoarea
prestabilita a atributului cellpadding este 1. Exemplificare :
• pentru a seta distanța dintre două celule vecine, se adaugă la <table …> :
cellspacing="0" , și setăm distanța dintre celule la zero;
• pentru a seta distanța dintre marginea celulei și textul din ea la 20 pixeli, vom
adăuga: cellpadding="20" .

<table cellspacing="0" cellpadding="20" …

Laborator SIAD Lucrarea nr.4
154 4.5.4 Dimensionarea unui tabel
Dimensiunile unui tabel – lățimea și înălțimea – pot fi stabilite exact prin
intermediul a doua atribute, width și height , ale etichetei <table> . Valorile acestor
atribute pot fi:
• numere întregi pozitive, reprezentând lățime a respectiv înălțimea în pixeli a
tabelului;
• numere întregi între 1 și 100, urmate de semnul %, reprezentând fracțiunea din
lățimea și înălțimea totală a paginii.

Exemplu: <table width="200" height="50%" …> , tabel cu lățimea 200 pixeli
și înălțimea 5 0% din înălțimea paginii web.

4.5.5 Titlul unui tabel
Unui tabel i se poate atașa un titlu cu ajutorul etichetei <caption> ( de la "table
caption" = titlu tabel). Această etichetă trebuie plasată în interiorul etichetelor
<table>…</table> , dar nu în interiorul etichetelor <tr> sau <td>. Titlul unui tabel poate
fi aliniat cu ajutorul atributului align al etichetei <caption> care poate lua una dintre
valorile:
• " bottom " ( sub tabel );
• " top " ( deasupra tabelului ); • " left " ( la stanga tabelulu i );
• " right " ( la dreapta tabelului ).

Exemplu: <table …><caption align="top">Titlu tabel lucrare4

4.5.6 Cap de tabel
Un tabel poate avea celule cu semnificația de cap de tabel. Aceste celule sunt
introduse de eticheta <th> (de la "tabel heade r" = cap de tabel) în loc de <td> .
Toate atribute care pot fi atașate etichetei <td> pot fi de asemenea atașate etichetei
<th> . Conținutul celulelor definite cu <th> este scris cu caractere aldine și centrat.
<tr><th> capcol1</th><th>capcol2</th><th> capcol3</th>
4.5.7 Celule vide ale unui tabel
Dacă un tabel are celule vide, atunci aceste celule vor apărea în tabel fără un
chenar de delimitare. În scopul de a afișa un chenar pentru celule vide se utilizează
următoarele trucuri:
• după <td> se pune &nb sp;;
• după <td> se pune <br> .

Caracterul &nbsp; (no break space) este de fapt caracterul spațiu. Un spațiu
introdus prin intermediul acestui caracter nu va fi ignorat de browser.

Laborator SIAD Lucrarea nr.4
155 4.5.8 Atributul " nowrap "
Atributul nowrap aparține elementelor <td> și <th> ; el interzice întreruperea
unei linii de text. Astfel, în tabel pot apărea coloane cu o lățime oricât de mare.

4.5.9 Subblocurile unui tabel
În specificațiile HTML 4.0, conținutul unui tabel poate fi împărțit în subblocuri
prin elementele:
• <thead><tr><td>…</thead> ( un singur rând );
• <tfoot><tr><td>…</tfoot> ( un singur rând );
• <tbody><tr><td>…</tbody> ( oricâte rânduri );

Într-un tabel există un singur subbloc de tipul <thead> și un singur subbloc de
tipul <tfoot> , dar pot exi sta mai multe subblocuri de tip <tbody> .

Laborator SIAD Lucrarea nr.5
156
5 Primii pași în PHP
5.1 Obiective
• Introducere în elementele de bază ale limbajului PHP;
• Realizarea unor scripturi PHP, și modificarea acestora pentru a vedea diferențele;

5.2 Introducere
PHP este un limbaj dinamic, ceea ce înseamnă că PHP comunică cu utilizatorul,
el efectuează dinamic operații, iar conținutul paginii se schimbă în real -time, în funcție
de preferințe. De exemplu în HTML nu putem modifica conținutul unei pagini decât dacă
o înlocuim cu una nouă (cu conținut nou). În PHP lucrurile stau mai simplu, printrun
script putem introduce știri pe pagina noastră sau putem modifica titlul paginii, sau putem
construi formulare dinamice pe care utilizatorii să le folosească. Totuși acest lucru nu
înseamnă că ne debarasam de limbajul HTML, nicidecum. Cei care au cunoștințe HTML
vor înțelege și învăța mai ușor PHP.
5.2.1 Sintaxa
La fel ca și în limbajul HTML, atunci când deschidem un tag, el trebuie automat
închis, pentru a nu genera erori (ex. <table> și </table> ), și în PHP, cu ajutorul tagurilor
<?php și respectiv ?> vom putea delimita codul PHP de codul HTML. Este foarte
important de știut, pentru lejeritate se pot folosi mai simplu tagurile <? și respectiv ?>,
cu toate acestea metodele prin car e putem delimita tagurile PHP sunt mai multe, spre
exemplu:
<script language="php">
echo "Acesta este un text";
</script>
sau
<% echo "Acesta este un text"; %>
atunci când este activată opțiunea asp_tags din php.ini.

Este recomandată utilizarea primelor taguri descrise anterior, adică:
<?php ………
cod php
aici
………
?>
Ca în orice limbaj de programare/scripting, în PHP există posibilitatea adăugării
de comentarii sau note în codul sursă. Acestea nu sunt luate în considerare de către
compilator. Iată câteva exemple de comentarii acceptate în PHP:
/* Comentariu in stil C */
// Comentariu in stil C++
# Comentariu in stil Bourne shell

Notă: Pentru începători nu este recomandată folosirea comentariilor de tip shell.

Laborator SIAD Lucrarea nr.5
157 O declarație în PHP se înc heie tot timpul cu punct și virgulă ( ;).
Neterminarea unei declarații cu punct și virgulă va duce la eroare de tip ‘parse
error’. Exemplu de cod care folosește un comentariu și o declarație:
<?php
//mai jos va voi saluta
echo("Salut!");
?>

Prima lin ie este comentariu și este ignorată de PHP, a doua linie reprezintă o
declarație care se încheie bineînțeles cu ;.
5.2.2 Aplicații de început
Exemplul 1:
Vom testa configurația PHP cu ajutorul funcției phpinfo(), scriind următorul
script într -un fișier nou php, cu ajutorul lui PHPDesign2005:
<?php
phpinfo();
?>

Se salvează codul ca info.php și se ruleaza -l în browser. Se vor obține o mulțime
de informații despre configurația PHP, tipul serverului, etc.
funcția phpinfo() are variabilele deja declar ate în motorul PHP și de aceea nu
este necesar decât să o declarăm o singură dată.
Exemplul 2:
Scriem un exemplu PHP în stil clasic, prin care salutăm utilizatorii. Iată codul:
<?php
echo(“Salutare la toti cititorii”);
?>

Se salvează sub numele salut.php și rulează
în browser (ex. http://localhost/salut.php ). Pe ecran apare afișat textul
‘Salutare la toti cititorii’. Acest lucru a fost posibil dator ita functiei echo() cu ajutorul
căreia de acum înainte vom afișa text pe ecran.
Notă : pe lângă funcția echo() mai există și print() care poate fi folosită în același
mod.
Observație : echo() nu este totuși o funcție, ea reprezintă un constructor de limbaj
dar pentru ușurința exprimării o vom numi funcție. O dovadă bună în sensul că nu este
funcție este aceea că nu suntem nevoiți sa folosim paranteze. Sintaxa echo
“Salutare la toti cititorii” ; este de asemenea acceptată.
Să scriem mai multe exemple cu fun cția echo() , pentru că va fi folosită foarte des,
și să vedem ce se poate face cu ea:
<?php echo(“Salut”);
echo(“Numele meu
este”); echo(“Popescu
Ion”); ?>

Laborator SIAD Lucrarea nr.5
158 Salvează codul de mai sus ca numelemeu.php și rulează -l în browser. Veți
observa că în ciuda faptului că am scris textul pe mai multe linii, el va fi afișat în browser
pe o singura linie. Fapt care evident nu ne convine, așa ca vom apela la tagul <br> din
HTML:

<?php
echo(“Salut<br>”);
echo(“Numele meu este<br>”);
echo(“Popescu Ion”);
?>

Acum textul va apare pe 3 linii separate.
Pentru coderii avansați care doresc să aibă totul clar și afișat corect în conformitate
cu toate standardele vor opta pentru următorul cod:
<?php
echo(“Salut<br> \n”);
echo(“Numele meu este<br> \n”);
echo(“Pop escu Ion”);
?>

Caracterul \n este un caracter de tip escape. Diferența se poate observa când ne
uităm în codul sursă HTML generat. \n înseamnă newline, adică indică faptul că urmează
linie nouă. Totuși acesta nu este singurul caracter de tip escape , iată lista completă:
Tabel caractere escape
Caracter
escape Descriere
\a alarma
\cx control -x (x poate fi orice caracter)
\e escape
\f formfeed
\n newline (linie noua)
\r carriage return
\t tab
\xhh caracter cu codul hexa hh
\ddd caracter cu codul octal ddd

5.3 Variabile si tipuri de date în PHP
În PHP toate variabilele încep cu semnul de dolar ($). După semnul $ se poate
introduce un șir de caractere care poate apărea în diferite combinații:
$variabila
$variabi la123
$prima_variabila
$_VARIABILA

Laborator SIAD Lucrarea nr.5
159
Acestor variabile le pot fi asignate orice valori, fie că este vorba de un șir de
caractere, numere, propoziții, fraze, etc.
În funcție de rolul pe care îl au într -un script, variabilele pot fi de două feluri:
variabile globale și variabile locale (ex. cele declarate în câmpul unei funcții).
5.3.1 Lucrul cu variabile si tipuri de date
În codul de mai jos veți regăsi perfect conceptul de variabilă:

<?php
$salut=”Salutare natiune”;
echo($salut);
?>

Conținutu l variabilei $salut este pasat funcție echo care va afișa conținutul
acesteia, deci va rezulta textul ’Salutare natiune’.
Următorul cod demonstrează conceptul de variabilă încapsulată. În cazul de mai
jos este vorba despre o variabilă încapsulată într -un text:
<?php
$nume = ”Popescu Ion”;
echo(”Numele meu este $nume”);
//folosim functia echo() pentru a afisa
textul
?>

Rulați în browser scriptul de mai sus și veți vedea că el afișează textul ’Numele
meu este Popescu Ion’.
Probabil v -ați dat se ama până acum de ce se lucrează cu variabile. Pentru că
ne fac viața de programator mai ușoară, unei variabile îi putem asigna orice valoare,
orice text oricât ar fi el de mare, și pe care îl putem manipula doar prin apelarea unei
simple variabile asignate .
<?php
$numarul1 = 25;
$numarul2 = 20;
$numarul1 + $numarul2 = $rezultat;
echo($rezultat);
?>
În codul de mai sus am declarat două variabile $numarul1 și $numarul2 ,
cărora le -am dat valorile 25, respectiv 20. Mai jos am efectuat operația simplă de
adunare, al cărei rezultat este conținut de variabila $rezultat . Pentru a afișa această
valoare ne folosim de funcția echo() . Rezultatul este clar, pe ecran va fi afișat,
numărul 45 (20+25=45).
Pe lângă operația de adunare (+) se mai pot efectua opera urmă toarele operații
matematice: ( -) scădere, (*) înmulțire, (/) împărțire, (%) modul. Tipurile de date în
PHP sunt următoarele:
• array -uri;
• numere de tip float sau double;
• integer;

Laborator SIAD Lucrarea nr.5
160 • object;
• string

Aceste noțiuni ar trebui să vă fie cunoscute de la progr amarea în C++.
În continuare vom discuta despre tipurile string și integer .
Un string este format dintr -o plajă de caractere. Acesta poate să fie un cuvânt,
o linie, sau poate un întreg articol. Un integer este un număr întreg care ia valori între
(-32768 și 32767).
Pentru a determina ce tip de dată este o anumită variabila, putem folosi funcția
gettype() . Iată un exemplu:

<?php
$variabila_mea=”Salut, sunt o variabila”;
$tip=gettype($variabila_mea);
echo(”Aceasta este o variabila de tip $ti p”);
?>

Mai sus am creat o variabilă numită $variabila_mea căreia i -am dat valoarea
”Salut, sunt o variabila”. Apoi prin funcția gettype() am chemat această variabilă pentru
a afla ce fel de tip este ea. Mai jos am utilizat echo() pentru a afișa tipul variabilei. Pe
ecran se va afișa, ’Aceasta variabila este de tip string’. Faceți un test si pentru
$variabila_mea=6
5.3.2 Variabile dinamice
De multe ori este util să folosiți variabile dinamice. O variabilă normală se declară
așa:
$variabila = ”salutar e” ;
Acum să zicem că vrem o variabilă care să aibă numele valorii lui $variabila, deci
scriem:
$$variabila = ”lume”;

Cu alte cuvinte, mai sus am creat o variabila cu numele $salutare și i -am dat
valoarea ’lume’. Ne putem juca cu variabile dinamice la infinit, dar atunci când s -a ajuns
la un nivel mare deja se crează confuzii iar dacă cineva ar dori să citească, pentru a
îmbunătăți, codul scris de tine, atunci nu ar mai înțelege nimic.
Există o sintaxă specială care se folosește pentru variabilele com plexe, și anume,
încadrarea între acolade {}:

echo "Salutare ${$variabila}"; // rezulta: Salutare lume

Atunci când folosim array -uri, o sintaxă ca $$variabila[1] este incorectă pentru că
PHP nu ar știi cărui nivel să aplice indexul, de aceea se folos ește expresia:
{$variabila[1]} sau ${$variabila}[1].

5.4 Cod PHP în cod HTML
<html>

Laborator SIAD Lucrarea nr.5
161 <head>
<title> <?php echo $titlu; ?> </title>
</head>… </html>

Codul de mai sus ilustrează foarte bine colaborarea dintre PHP și HTML. Codul
PHP poate fi asim ilat cu ușurință de tagurile HTML atât timp cât el se află între
delimitările <?php respectiv ?>.
De asemenea se pot introduce mai multe declarații între tagurile html, în diferite
moduri:
<html> ……… <body>
<?php echo (”Salut”);
echo (”Ce mai
faci?”);
?>
</body> ……… </html>
sau

<?php for($i=0, $i<50, $i++) { ?>
<br />
<?php } ?>

Fișierele de tip PHP pot include cod html, fie că face parte din ele, fie că este scris
separat. Priviți următorul cod:
<?php
$titlu = ”Pagina mea de
web”; include(”index.inc”);
?>
Iar codul lui index.inc este următorul:
<html><head><title><?php echo $titlu; ?></titlu></head></html>

Exemplele de mai sus sunt concludente, însă trebuie specificat că folosirea
fișierelor de tip .inc nu este recunos cuta de Apache și nu este parsata ca php, așa că
informații senzitive se pot vedea prin intermediul browserului, de aceea trebuie să apelam
la setările httpd.conf și să adăugăm următoarele linii:
<Files ~ " \.inc$">
Order allow,deny
Deny from all
</Files>

În acest fel am blocat accesul din exteriorul serverului la fișierele cu extensia .inc.
Aceasta este o practică foarte bună (care poate fi executată și prin intermediul unui
.htaccess4 în caz ca nu avem acces la httpd.conf , cum se întâmplă de obi cei pe serverele
virtuale).

4 Un fișier .htaccess este un simplu fișier text ce conți ne comenzi, denumite directive Apache. Aceste
directive se aplică și afectează fișierele din directorul în care se află fișierul .htaccess precum și
subdirectoarelor acelui director.

Laborator SIAD Lucrarea nr.5
162 Totuși nu este o practică bună și nu se recomandă folosirea fișierelor cu extensii
.inc ci mai degrabă cu extensia .php . Chiar și așa problemele nu se termină, deoarece
acestea trebuie protejate împotriva accesului direct.

Iată ce metode de protecție se pot folosi:
• plasarea tuturor fișierelor cu informație sensibilă într -un director sau mai multe
directoare care urmează să fie protejate prin .htaccess . Aici ne referim la fișierele
care nu sunt accesate direct de user în pa gină, ci la cele care se introduc de obicei
cu funcțiile include(), include_once(), require(), require_once().
• plasarea tuturor fișierelor cu informații sensibile într -un director sau directoare
diferite de cel din rădăcina web (httpdocs, www, etc), în ac est fel ele nu pot fi
accesate prin browser în nici un fel. Această metodă nu este aplicabilă pentru
servere virtuale sau într -un enviroment tip server de hosting din cauza restricțiilor
sau din cauză că PHP poate fi setat în safe_mode.

Laborator SIAD Lucrarea nr.6
163
6 Constru irea unui site în PHP
6.1 Obiective
• Structura și elemente de bază pentru construirea unui site dinamic în PHP, cu sau
fără conectare la o bază de date.
6.2 Introducere
În continuare se prezintă o modalitate de cum se poate construi un site cu ajutor ul
limbajului PHP. Exemplul prezentat nu este un standard, este doar o modalitate de a
vedea cum se poate construi un site și cum se preiau sau trimite variabilele prin
intermediul site -ului. Puteți, pe baza acestui exemplu, să vă construiți propriul site, în
forma preferată de dvs. și adaptând modelul acesta la necesitățile voastre. În exemplul
prezentat, s -a preferat existența unei singure pagini, anume index.php , în care să fie
incluse conținutul și meniul, în funcție de ce link accesează vizitatorul.
Puteți vedea acest model într -un fel modular, fiecare script fiind de fapt un modul
care execută anumite operații specifice. Astfel, în pagina index.php se includ mai multe
module (scripturi) care luate separat, fiecare fac anumite lucruri, dar puse împre ună,
formează pagina de web generată dinamic.

Partea de sus a paginii (head)
Partea cu meniul orizontal generat dinamic (partea de body)

meniul lateral partea în care se afișează conținutul paginilor, și alte
informații aici se pot pune
alte informații
generate dinamic

partea de încheiere a paginii (footer)

După cum se poate vedea mai sus, am despărțit fiecare parte a unei pagini în
bucăți, fiecare bucată este colorată diferit pentru o mai bună vizualizare. Puteți introduce
în fiecare bucată câte un script php care să genereze respectiva bucată dinamic. Astfel,
în cazul unei modificări, va fi mult mai ușor să modificați doar scriptul care se ocupă de
o anumită parte a paginii, pe când dacă tot site -ul ar fi fost făcut static în HTML, la un
site cu 100÷200 de pagini chiar și cea mai mică modificare ar fi însemnat un chin.

Am numit fiecare script care se ocupă de o anumită parte a site -ului astfel:
• head.php – conține partea dintre tagurile HTML <head> și </head>
• body.php – conține partea dintre tagurile HTML <body> și conținutul paginii
• footer.php – conține partea de jos a paginii

Laborator SIAD Lucrarea nr.6
164
6.3 Elementele componente
6.3.1 index index.php – în care se setează nivelul de raportare al erorilor (dacă nu doriți
ca vizitatorii să vadă eventualele erori raportate de către php, puteți stabili nivelul 0).
Apoi, se verifică dacă există fișierul head.php și body.php și se încarcă sau se oprește
cu un mesaj de eroare.
Scriptul acestui fișier este:
<?php
/***************************
modulul index.php
creat de Birkoff pentru www.tutoriale.far -php.ro
Data: 16 -07-2006
Versiune modul: 1.0
**************************/
// se seteaza nivelul de raportare al erorilor din php
error_reporting(E_ALL);

// se include modulul de head
if (file_exists("head.php"))
{
include_once("head.php");
}
else
{
die('<br>Eroare: Nu se gaseste fisierul head.php');
}
// se include modulul de body
if (file_exists("body.php"))
{
include_once("body.php");
}
else
{
die('<br>E roare: Nu se gaseste fisierul body.php');
}
// se inchid tagurile html
echo '</body>
</html>';
?>

6.3.2 head
head.php – în acest fișier se afișează codul html pentru începutul paginii, și dacă
există, se încarcă și fișierele cu cod CSS și JavaSc ript folosite în pagină.
<?php
/***************************
modulul head.php
creat de Birkoff pentru www.tutoriale.far -php.ro
Data: 16 -07-2006
Versiune modul: 1.0
**************************/ // se
trimite la browser codul html

Laborator SIAD Lucrarea nr.6
165 echo '<!DOCTYPE html P UBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1 -transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http -equiv="Content -Type" content="text/html; charset=iso -88591"
/>';

// se verifica c e pagina se cere si se afiseaza titlul paginii
/* scurte explicatii pentru cod
– daca este setata variabila pagina care se trimite prin
intermediul link -urilor prin GET, atunci se preia valoarea acelei
variabile si se cauta daca corespunde cu una din valor ile scrise in
switch, si daca corespunde afiseaza titlul corespunzator, daca nu
corespunde cu nici o valoare, atunci afiseaza valoarea default
– daca nu este setata variabila pagina (cazul cand se acceseaza
prima data pagina)atunci se seteaza valoarea titlu lui ca "Pagina
principala"
*/
if(isset($_GET['pagina']))
{
$titlu = $_GET['pagina'];
}
else
{
$titlu = 'Pagina principala';
}
switch ($titlu)
{
case 'a':
$titlu = 'Pagina A';
break;
case 'b':
$titlu = 'Pagina B' ;
break;
default:
$titlu = 'Alte pagini';
}

// se trimite la browser titlul paginii
echo '<title>'.$titlu.'</title>';

//se include partea de CSS si cea de JavaScript daca exista
if (file_exists("css.php"))
{
include_once("css.php ");
}
if (file_exists("js.php"))
{
include_once("js.php");
}
// se inchide tagul html pentru head
echo '</head>';
?>

css.php – acest fișier conține codul CSS folosit pentru formatarea și afișarea

Laborator SIAD Lucrarea nr.6
166 paginii HTML.
<?php
/****************** *********
modulul css.php
creat de Birkoff pentru www.tutoriale.far -php.ro
Data: 16 -07-2006
Versiune modul: 1.0
**************************/
// se seteaza variabila care contine codul css
$valoare_css = '<style type="text/css">
<!–
body,td,th {
font-family: Arial, Helvetica, sans -serif;
font-size: 12px;
color: #000000;
}
body {
background -color: #FFFFFF;
margin-left: 0px;
margin-top: 0px;
margin-right: 0px;
margin-bottom: 0px;
}
.style1 {
font-size: 24px;
font-weight: bo ld;
}
–>
</style>';
// se trimite la browser codul css
echo $valoare_css;
?>

js.php – dacă se folosește cod JavaScript în pagini, este de preferat să se salveze
codul în acest fișier, pentru a putea avea acces rapid la el în cazul în care doriți s ă faceți
modificări.
6.3.3 body body.php – conține codul HTML existent între tagurile <body> și </body>
Dacă există, se încarcă și fișierele care conțin meniul orizontal și/sau vertical, precum și
fișierul care afișează conținutul paginii cerute. Pe lâng ă acestea, dacă doriți să băgați alte
scripturi în pagini, se include și fișierul module.php
<?php

// se trimite la browser codul html pentru body
echo '<body>
<table width="100%" border="0" cellspacing="3" cellpadding="0">
<tr>
<td valign="t op"><table width="100%" border="0" cellspacing="3"
cellpadding="0">
<tr>
<td width="25%" height="60"><span class="style1">Prima
pagin&#259; + LOGO </span></td>
<td bgcolor="#996666">Aici pute&#355;i pune un banner de
reclam&#259;, sau o poz&#259; </td>

Laborator SIAD Lucrarea nr.6
167 </tr>

</table></td>
</tr>
<tr>
<td valign="top">';

// daca exista meniu orizontal atunci se include
if (file_exists("meniu_orizontal.php"))
{
/* nu se foloseste include_once deoarece poate dor iti sa mai afisati
meniul si in alt loc pe pagina*/
include("meniu_orizontal.php");
}

// se continua prelucrarea
paginii echo ' </td>
</tr>
<tr>
<td valign="top"><table width="100%" border="0" cellspacing="3"
cellpadding="0">
<tr>
<td width="20%" valign="top">';

// daca exista meniu vertical atunci se include
if (file_exists("meniu_vertical.php"))
{
include("meniu_vertical.php");
}
// se continua prelucrarea paginii
echo '</td>
<td valign="top">';

// se include partea care prelucreaza continutul paginii
if (file_exists("continut.php"))
{
include("continut.php");
}
else
{
die('EROARE: Nu exista fisierul continut.php');
}
// se continua prelucrarea paginii
echo '</td>
<td width="20%" valign="top">';

// daca exista module aditionale se includ
if (file_exists("module.php"))
{
include_once("module.php");
}
// se continua prelucrarea
paginii echo '</td> </tr>

Laborator SIAD Lucrarea nr.6
168 </table></td>
</tr>
<tr>
<td align="center" valign="top" bgcolor="#9999FF">';
// daca exista footer se include
if (file_exists("footer.php"))
{
include_once("footer.php");
}
// se continua prelucrarea
paginii echo '</td> </tr>
</table>';
?>
6.3.4 Meniurile o rizontal și vertical meniu_orizontal.php – conține codul
HTML pentru meniul orizontal.
<table width="100%" border="0" cellpadding="0" cellspacing="3"
bgcolor="#9999FF">
<tr>
<td align="center" valign="top"><a href="index.php">HOME</a></td>
<td align="center" valign="top"><a
href="index.php?pagina=a">PAGINA A </a></td>
<td align="center" valign="top"><a
href="index.php?pagina=b">PAGINA B </a></td>
<td align="center" valign="top"><a
href="index.php?pagina=contact">CONTACT</a ></td
>
</tr>
</table>

meniu_vertical.php – conține codul HTML pentru meniul vertical
<table width="100%" border="0" cellspacing="3" cellpadding="0">
<tr>
<td align="center" valign="top">MENIU</td>
</tr>
<tr>
<td align=" center" valign="top"><a
href="index.php?pagina=a">PAGINA A </a></td>
</tr>
<tr>
<td align="center" valign="top"><a
href="index.php?pagina=b">PAGINA B </a></td>
</tr>
<tr>
<td align="center" valign="top"><a
href="index. php?pagina=contact">CONTACT</a></td>
</tr>
<tr>
<td align="center" valign="top"><a
href="index.php?pagina=blabla">Pagina inexistenta </a></td>
</tr>
<tr>
<td align="center" valign="top"><a
href="index.php?pagina=">Pagina eronata </a></td>

Laborator SIAD Lucrarea nr.6
169 </tr>
</table>
6.3.5 Conținut continut.php – afișează conținutul paginilor, în funcție de linkul cerut.
Dacă se
cer pagini externe, se verifică dacă acea pagină există și se încarcă pentru afișare.
<?php
/************************ ***
modulul continut.php
creat de Birkoff pentru www.tutoriale.far -php.ro
Data: 16 -07-2006
Versiune modul: 1.0
**************************/
// se verifica daca se cere o pagina
if (isset($_GET['pagina']))
{
// daca se cere o pagina se verifica daca variabila nu este goala
if(!empty($_GET['pagina']))
{
$pagina = $_GET['pagina'];
}
// daca este goala se ia pagina principala
else
{
$pagina = 'index';
}
}
/* daca nu se cere nici o pagina înseamnă ca treb uie afișata
pagina principala */ else
{
$pagina = 'index';
}

// in continuare se prelucreaza pagina pentru afisare
switch ($pagina)
{
case 'a':
$afisare = '<br>A fost ceruta pagina A. <br>Aceasta este pagina A.';
break;
case 'b':
$afisare = '<br>A fost ceruta pagina B. <br>Aceasta este pagina B.';
break; case 'contact':
if (file_exists("contact.php"))
{
include_once("contact.php");
$afisare = '';
}
else
{
$afisare = '<b r>Eroare: Nu se gaseste fisierul contact.php';
}
break;
case 'index':
$afisare = 'Aceasta este pagina principala';

Laborator SIAD Lucrarea nr.6
170 break;
default:
$afisare = '<br>Eroare: A fost ceruta pagina cu numele
<b>'.$pagina.'</b> dar nu exista pe se rver.';
}

// se afiseaza codul html pentru continut
echo $afisare;
?>

contact.php – poate fi o pagina externă, cu conținut HTML sau PHP, precum și
formulare de contact.
<p>Aceasta este pagina de contact. Este o pagină; separată; și se găseș te în fișierul
<em>contact.php</em></p>
<p>Se pot folosii fișiere separate în php pentru diferite pagini, precum și
formulare și alte scripturi. </p>
6.3.6 Module
module.php – este un fișier care atunci când este accesat, verifică ce fișiere
există în directorul MODULE și le încarcă pe fiecare.
<?php
/***************************
modulul module.php
creat de Birkoff pentru www.tutoriale.far -php.ro
Data: 16 -07-2006
Versiune modul: 1.0
**************************/
// se verifica ce module sunt in di rectorul de module
if (!$director = opendir("module"))
{
echo("Eroare: Nu exista directorul cu module");
}
else
{
$citire = readdir($director);
while ($citire)
{
if ($citire != '.')
{
if ($citire != '..')
{
$fisier[] = $citire;
}
}
$citire = readdir($director);
}
closedir($director);
}
// se incarca fiecare modul existent in director
foreach ($fisier as $valoare)
{
if (file_exists("module/".$valoare))
{

Laborator SIAD Lucrarea nr.6
171 include_once("module/".$valoare);
}
else
{
echo "<br>module/".$valoare;
}
}
?>
6.3.7 Footer, modulul data și ora data_ora.php – este un fișier extern, care afișează
câteva informații despre vizitator.
<?php
/************* **************
modulul data_ora.php
creat de Birkoff pentru www.tutoriale.far -php.ro
Data: 16 -07-2006
Versiune modul: 1.0
**************************/
// se preiau data si ora serverului
$data = date("d -m-Y", time());
$ora = date("H:i:s", time());
// se preia ip -ul vizitatorului
$ip = $_SERVER['REMOTE_ADDR'];
// se preia semnatura browserului
$browser = $_SERVER['HTTP_USER_AGENT'];

$info = '<br>'.$data.'<br>Ora: '.$ora.'<br>IP: '.$ip.'<br>Semnatura
browser: <br>'.$browser; // se afiseaza inform atiile
echo '<table width="100%" border="0" cellspacing="3" cellpadding="0">
<tr>
<td align="center" valign="top"><strong>Modulul data_ora
</strong></td>
</tr>
<tr>
<td align="center" valign="top">'.$info.'</td>
</tr>
</table>';
?>
footer.php – este fișierul care afișează în josul paginii numele curent al paginii.

<?php
/***************************
modulul module.php
creat de Birkoff pentru www.tutoriale.far -php.ro
Data: 16 -07-2006
Versiune modul: 1.0
****************** ********/
// se verifica ce module sunt in directorul de module
if (!$director = opendir("module"))
{
echo("Eroare: Nu exista directorul cu module");
}
else
{

Laborator SIAD Lucrarea nr.6
172 $citire = readdir($director);
while ($citire)
{
if ($citire != '.' )
{
if ($citire != '..')
{
$fisier[] = $citire;
}
}
$citire = readdir($director);
}
closedir($director);
}
// se incarca fiecare modul existent in director
foreach ($fisier as $valoare)
{
if (file_exists("module/".$valoare))
{
include_once("module/".$valoare);
}
else
{
echo "<br>module/".$valoare;
}
}
?>
6.4 Mod de lucru
În directorul C: \Program Files \EasyPHP 2.0b1 \www \ se creează un subdirector,
de exemplu Lab5 -nume_student, în care se crează toate fișierele enumerate mai sus, mai
puțin data_ora.php, care va fi plasat în directorul module (așa cum se vede în figura de
mai jos).

Rezultatul final, trebuie să arate așa:

Laborator SIAD Lucrarea nr.6
173

Laborator SIAD Lucrarea nr.7
174
7 Stiluri css și chestionar în PHP
7.1 Obiective
• Dobândirea cunoștințelor necesare utilizării stilurilor din fișiere css externe;
• Realizarea unui formular în php

7.2 Utilizarea fișierelor css externe
Stilurile definite în interiorul unui bloc <style>…</style> pot fi transferate întrun
fișier extern existând astfel posibilitatea asocierii lor mai multor fișiere HTML. Pentru a
utiliza un stil definit într -un fișier extern se procedează astfel:
1. se crează un fișier care să conțină numai descrierea stilurilor și s e salvează cu
extensia ".css" . Conținutul acestui fișier coincide cu conținutul unui bloc
<style>…</style> , fără ca acești delimitatori să fie incluși.
2. în fișierul HTML care utilizează stilurile definite în fișierul creat anterior, se
include în blocul <head>…</head> o etichetă <link> , având trei atribute: •
atributul "rel" cu valoarea "stylesheet" ;
• atributul "type" cu valoarea "text/css" .
• atributul "href" având ca valoare adresa URL a fișierului creat la punctul
1;
Stilurile definite din fișierul CSS extern se activează ca și cum ar fi stiluri definite
în fișierul HTML curent într -un bloc <style>…</style> .

Modul de lucru: se creează un director nou în C:\Program Files \EasyPHP
2.0b1 \www , de exemplu Ex_CSS , în care se creează două fișiere, unul index.html și unul
stil.css.
Iată un fișier HTML cu un CSS extern:
Fișierul HTML:
<html>
<head>
<LINK REL= "stylesheet" TYPE= "text/css" HREF= "stil.css">
<title>Pagina de text stilizat</title>
</head>
<body>
<H2>Acesta este text formatat ca Header 1</H2>
<p>Acesta este un paragraf</p>
<H3>Acesta este text formatat ca Header 2, urmat de un tabel</H3>

<table width="500" border="1">
<tr>
<th align="left">Nume</th>
<th align="left">Prenume</th>
<th align="left">Telefon</th>
<th align="left">E -mail</th>
</tr>
<tr>
<td width="25%">Popescu</td>

Laborator SIAD Lucrarea nr.7
175 <td width="25%">Valentin</td>
<td width="25%">4433978</td>
<td width="25%">popescu@yahoo.com</td>
</tr>
<tr>
<td width="25%">Ionescu</td>
<td width="25%">Mihai</td>
<td width="25%">5599786</td>
<td width="25%">ionescu@yahoo.com</td>
</tr>
</table>
<br>
<h3>Acesta este un text formatat ca Header 3, urmat de 2 liste:</h3>
<ol>
<li>Date personale student;</li>
<li>Calificari student;</li>
<li>Program zil nic:</li>
</ol>
<ul>
<li>Program dimineata</li>
<li>Pauza de masa</li>
<li>Program dupamiaza</li>
</ul> <br> urmeaza un text Header1, de
marime 80:
<H1>Sfarsit</H1>
</body>
</html >

Fișierul stil.css conține:
H2,H3,h3 {
color:#483d8b ;
font-family: "lucida calligraphy", "arial";
}
H1 {
color:#01faf1;
font-family: "comic sans ms", "tahoma"; font -size:80;
} p,
table, li {
font-family: "lucida calligraphy", "arial"; margin -left:
10pt;
}
body {
background -color:#fffaf0;
}
li,p,th,td {
font-size: 80%;
} table {border –
style:outset} li {list –
style: square;)

Laborator SIAD Lucrarea nr.7
176
7.3 Crearea chestionarelor în php

De multe ori este nevoie pe un stie de un chestionar prin care vizitatorii să poată
vota sau prin care să își poată ex prima punctul de vedere. De aceea în continuare se
prezintă un chestionar pe care cred că și voi vreți să îl aveți pe paginile voastre.
El este compus din 2 fișiere: chestionarul în format html și modulul de prelucrare
și trimitere a datelor din chestion ar (un script php). Puteți să adăugați sau să ștergeți
întrebări, să puneți alte butoane (specifice html – text field, check box, radio button, etc)
și să îl modificați așa cum doriți.
Explicații:
În modulul chestionar.php aveți grijă să introduceți dat ele și check box -urile
doar în form altfel pot apărea probleme la afișarea sau trimiterea datelor. Tot în
chestionar, dacă mai adăugați întrebări trebuie să specificați numele butonului ca fiind
8-9-10 sau alt nume (vezi <input name = "1" type = "checkbox" id = "1"
value="da" >). În situația de față eu le -am numerotat și la valoarea am pus "da" (adică
dacă e bifată apare ca "da"). Dacă aveți și un text field (cum este la <textarea name="8"
id="8"> scrie aici ce vrei să găsești sau poți să întrebi pe forum. < /textarea> ) trebuie
să îi puneți și lui un nume (în cazul de față numele este "8"). După completarea și
trimiterea chestionarului către server, se accesează fișierul prelucrare_chest.php care
verifică datele introduse și dacă sunt corecte le afișează și le trimite pe e -mail la adresa
specificată. Puteți să introduceți datele din chestionar și într -o bază de date sau într -un
fișier text, adăugând doar câteva linii de cod.
Mod de lucru: Fiecare student va crea un director propriu (de ex:
chestionar_ inițial e-student ) în C:\Program Files \EasyPHP 2.0b1 \www , în care se vor
scrie cele trei fișiere listate mai jos: index.php, chestionar.php
și prelucrare_chestionar.php.

index.php
<html>
<head>
<title>Formular – Chestionar</title>
</head>
<body>
<table width="100%" border="1">
<tr>
<td width="30%" valign="top">
<?php
include ("chestionar.php");
?>
</td>
<td><div align="center"> Completați chestionarul alăturat, și după
verificare, apăsați TRIMITE. Dacă nu sunțe ți siguri, apăsați ANULARE
</div></td>
</tr>
</table>
</body>
</html>

Laborator SIAD Lucrarea nr.7
177 chestionar.html
<style type="text/css">
<!–
.style1 {
color: #FFFFFF; font –
weight: bold;
}
–>
</style>
<!-
Chestionar varianta 1
Creat la data de 08 -01-2004
Copyright Alex – http://www.tutoriale.far -php.ro
->
<table width="100%" border="1" cellpadding="0" cellspacing="0"
bordercolor="#000099">
<tr>
<td valign="top" bgcolor="#9999cc"><div align="center"
class="style1 style1">Ce doriti sa gasiti<br> in acest site?
</div></td>
</tr>
<tr>
<td valign="top"><form
action="prelucrare_chest.php" method="post" name="chestionar"
id="chestionar">
<input name="1" type="checkbox" id="1" value="da">
Scripturi php freeware.<br>
<input name="2" type="checkbox" id="2" value="da">
Mai multe articole despre php.<br>
<input name="3" type="checkbox" id="3" value="da">
Mai multe detalii despre comenzi.<br>
<input name="4" type="checkbox" id="4" value="da">
Mai multe despre MySQL.<br>
<input name="5" type="checkbox" id="5" value="da">
Mai multe despre baze de date.<br>
<input name="6" type="checkbox" id="6" value="da">
Mai multe despre baze de date in format txt.<br>
<input name="7" type=" checkbox" id="7" value="da">
Altceva – si anume:<br>
<textarea name="8" id="8">scrie aici ce vrei sa gasesti sau
poti sa intrebi pe forum.</textarea>
<br><br>
<div align="left"><input type="reset" value="sterge"> <input
type="submit" va lue="expedieaza"> </div>
</form></td>
</tr>
</table>

prelucrare_chestionar.php
<html>
<head>
<title>Untitled Document</title>
/* Modul Prelucrare chestionar varianta 1 Creat la data de 08 -01-2004
Copyright Alex – http://www.tutoriale.far -php.ro */

Laborator SIAD Lucrarea nr.7
178 </head>
<body>
<?php
// Scripturi php
freeware $a=$_POST[1];
if ($a == "") {
$a = "nu";
}
// Mai multe articole despre php
$b=$_POST[2];
if ($b == "") {
$b = "nu";
}
// Mai multe detalii despre comenzi
$c=$_POST[3];
if ($c == "") {
$c = "nu";
}
// Mai multe despre MySQL
$d=$_POST[4];
if ($d == "") {
$d = "nu";
}
// Mai multe despre baze de date
$e=$_POST[5];
if ($e == "") {
$e = "nu";
}
// Mai multe despre baze de date in format txt
$f=$_POST[6];
if ($f == "") {
$f = "nu";
}
// Altceva – si anume:
$g=$_POST[7];
if ($g == "") {
$g = "nu";
}
// comentarii
$h=$_POST[8];
// in cazul in care campul 8 este gol sau scrie mesajul
pus initial atunci seteaza variabila ca "nu"
// altfel ea ramane asa cu m este cu textul trimis de utilizator
if (($h == "") or ($h == "scrie aici ce vrei sa gasesti
sau poti sa intrebi pe forum.")) {
$h = "nu";
}
// chestii utile
$browser = $_SERVER["HTTP_USER_AGENT"];
$timp = time ();
$ip = getenv ( "REMOTE_ADDR" );
$ip_name = gethostbyaddr ( $ip );
// diferenta de timp – in cazul in care ora de pe server nu e
corect setata
$hourdiff = "0";
$timeadjust = ($hourdiff * 60 * 60);

Laborator SIAD Lucrarea nr.7
179 // cu – $timeadjust daca e in scadere sau cu +
$timeadjust daca trebuie sa creasca
$servdate = date("d -m-Y – H:m:s",time() –
$timeadjust);
// echo $servdate;

$headers = "MIME -Version: 1.0 \r\nContent -type:
text/html; charset=iso -8859-2\r\n";
$continut = " \n
Ip $ip a completat chestionarul. \n
Campurile completate sunt: \n\n
$a – Scripturi php freeware. \n
$b – Mai multe articole despre php. \n
$c – Mai multe detalii despre comenzi. \n
$d – Mai multe despre MySQL. \n
$e – Mai multe despre baze de date. \n
$f – Mai multe despre baze de date in format txt. \n
$g – Altceva – si anume: \n
$h – Comentarii. \n\n
Mesajul a fost trimis la data de $servdate \n
Browser: $browser , host: $ip_name , ip: $ip \n
";
// ATENTIE!!! schimbati adresa de email cu adresa voastra.
mail("antonpan2003@yahoo.com", "Mesaj de pe site",
"$continut", "$headers");
// afisare informatii
echo "<br><br>";
echo "Chestionarul completat de dvs. a fost trimis cu
informatiile de mai jos:<br><br>
$a – Scripturi php freeware.<br> \n
$b – Mai multe articole despre php.<br> \n
$c – Mai multe detalii despre comenzi.<br> \n
$d – Mai multe despre MySQL.<br> \n
$e – Mai multe despre baze de date.<br> \n $f – Mai multe
despre baze de date in format txt.<br> \n
$g – Altceva – si anume:<br> \n
$h – Comentarii.<br><br> \n\n
Mesajul a fost trimis la data de $servdate <br> \n
Browser: $browser , host: $ip_name , ip: $ip <br> \n
";
echo "<br><br>";
echo "Va multumesc pentru informatii";
?>
</body>
</html

Laborator SIAD Lucrarea nr.8
180
8 Formular de prelucrare a datelor din baza de date MySQL
8.1 Obiective
• Realizarea une i baze de date MySQL;
• Realizarea unui formular în php de introducere, prelucrare și vizualizare a datelor
din baza de date mai sus creată.

8.2 Realizarea bazei de date
Se verifică dacă aplicația EasyPHP este pornită (serverul Apache și MySQL).
Se in tră în phpMyAdmin (se deschide un browser internet și la adresă se tastează
localhost/phpmyadmin/ ).
Se creează baza de date cu numele "formular" și apoi tabela "intrari", cu 6 coloane,
și care are structura următoare:

Câmp Tip Null Extra
ID int(11) nu auto_increment
Nume char(60) nu
Prenume char(60) nu
Vârsta char(10) nu
e-mail char(100) nu
Observații char(255) nu

În directorul rădăcină al serverului Apache (EasyPHP), care este C:\Program
Files \EasyPHP 2.0b1 \www, se creează un folder cu numele formular .
Cu ajutorul aplicației PHP Designer 2005 se creează un fișier cu numele
config.php care va fi salvat în directorul mai sus creat, și care va conține datele de
configurare la baza de date:
<?php session_start();
set_time_limit(0);
error_reporting(E_ALL);
// Informatii baza de
date
$AdresaBazaDate = "localhost";
$UtilizatorBazaDate = "root";
$ParolaBazaDate = "";
$NumeBazaDate = "formular";
$conexiune =
mysql_connect($AdresaBazaDate,$UtilizatorBazaDate,$Par olaBazaDate)
or die("Nu ma pot conecta la MySQL!");
mysql_select_db($NumeBazaDate,$conexiune) or die("Nu gasesc baza de
date!");
function addentities($data){
if(trim($data) != ''){
$data = htmlentities($data, ENT_QUOTES);
return str_replace(' \\', '&#92; ', $data);
} else return $data;

Laborator SIAD Lucrarea nr. 8
181 } // End addentities() –––––
?>

În continuare, se creează fișierul index.php, în care se introduce
următorul script:
<?php
require_once('config.php');
if(!isset($_SESSION['nume'])) $_SESSION['nume'] = '';
if(!isset($_SESSION['prenume'])) $_SESSION['prenume'] = '';
if(!isset($_SESSION['varsta'])) $_SESSION['varsta'] = '';
if(!isset($_SESSION['e -mail'])) $_SESSION['e -mail'] = '';
if(!isset($_SESSION['observatii'])) $_SESSION['observatii'] = '';
echo '<table wi dth="310" border="0" cellpadding="0" cellspacing="0">
<form name="formular" action="validare.php" method="post">
<tr>
<td height="36" colspan="3" valign="top"><h2>Formular</h2>Comentariul
nu trebuie sa
fie mai lung de 255 caractere.</td>
<td width="1" ></td>
</tr>
<tr>
<td width="80" height="19" valign="top"> </td>
<td width="15" rowspan="10" valign="top"> </td>
<td width="214" valign="top"> </td>
<td></td>
</tr>
<tr>
<td height="22" align="right" valign="top">Nume:</td>
<td valign="top">
<input type="text" name="nume" value="'.$_SESSION['nume'].'"> </td>
<td></td>
</tr>
<tr>
<td height="7"></td>
<td></td>
<td></td>
</tr>
<tr>
<td height="22" align="right" valign="top">Prenume:</td>
<td valign="top"><input type="text" name="prenume"
value="'.$_SESSION['prenume'].'"></td>
<td></td>
</tr>
<tr>
<td height="9"></td>
<td></td>
<td></td>
</tr>
<tr>
<td height="22" align="right" valign="top">Varsta:</td>
<td valign="top"><input type="text" size="3"
maxLength="3" name="varsta"
value="'.$_SESSION['varsta'].'"> ani</td>
<td></td>
</tr>

Laborator SIAD Lucrarea nr.8
182 <tr>
<td height="10"></td>
<td></td>
<td></td>
</tr>
<tr>
<td height="22" align="right" valign="top">Email:</td>
<td valign="top"><input type="text" name="e -mail"
value="'.$_SESSION['e -mail'].'"></td>
<td></td>
</tr>
<tr>
<td height="9"></td>
<td></td>
<td></td>
</tr>
<tr>
<td height="19" align="right" valign="top">Observatii:</td>
<td rowspan="2" valign="top"><textarea name="observatii" cols="30"
rows="5"
value="'.$_SESSION['obs ervatii'].'">'.$_SESSION['observatii'].'</text
a rea></td> <td></td>
</tr>
<tr>
<td colspan="2" rowspan="3" valign="top"> </td>
<td height="83"></td>
</tr>
<tr>
<td height="17" valign="top">
</td>
<td></td>
</tr>
<tr>
<td height="24"
valign=" top"><input
name="Trimite" type="submit"
id="Trimite"
value="Trimite">
<input name="Reseteaza"
type="reset" id="Reseteaza"
value="Reseteaza"> </td>
<td></td>
</tr>
</form>
</table>'; ?>
Rezultatul ar trebui să arate așa:

Interpretarea codulu i php:
if(!isset($_SESSION['nume'])) $_SESSION['nume'] = '';
– dacă nu este setată sesiunea nume, o setăm ca fiind goală.
Această operație se face pentru a evita afișarea unei erori php care ne va spune
cum că sesiunea nume nu există, ceea ce este adevă rat.

Laborator SIAD Lucrarea nr. 8
183 Analizând HTML -ul observăm câmpurile cărora le -am atribuit numele
corespunzătoare, și anume:

<td height="22" align="right" valign="top">Nume:</td>
<td valign="top">
<input type="text" name="nume" value="">
</td>

Acum că am realizat formula rul, trebuie să îi prelucrăm datele prin $_POST și să
verificăm conținutul acestora, apoi să îl introducem în baza de date.
Se realizează un fișier cu numele validare.php și introducem codul de mai jos,
apoi testăm în browser, se introduc date în formular și se apasă butonul “Trimite”.
<?php
require_once ('config.php');
$_SESSION['nume'] = $_POST['nume'];
$_SESSION['prenume'] = $_POST['prenume'];
$_SESSION['varsta'] = $_POST['varsta'];
$_SESSION['e -mail'] = $_POST['e -mail'];
$_SESSION['observatii'] =
$_POST['observatii']; echo 'Nume:
'.$_SESSION['nume'].'<br> Prenume:
'.$_SESSION['prenume'].'<br>
Varsta: '.$_SESSION['varsta'].'<br>
Email: '.$_SESSION['e -mail'].'<br>
Comentariu: '.$_SESSION['observatii'].'<br><br>
Daca datele sunt corecte, apasati <a href="prelucrare.php">aici</a>
pentru a le valida
<br> si a le introduce in baza de date.';
?>

Ca noutate, observați că s -a folosit $_SESSION . Scopul unei sesiuni este de a
reține o informație care să se mențină de la o pagină la alta.
Pentru a set a o sesiune și a o menține de la o pagină la alta, este nevoie de a o
declara cu ajutorul unei funcții, și anume: session_start(); Această funcție se pune la
început de PAGINA, prima linie din script.
Pentru a distruge sesiunile, ne putem folosi de o func ție care va șterge toate
sesiunile existente, și anume session_destory(); sau de declararea sesiunilor ca fiind
nule: $_SESSION[‘nume_sesiune’] = ‘’ ;
Întorcându -ne la formularul nostru de înregistrare, ați văzut că valoarea
câmpurilor este o sesiune. Vom seta câte o sesiune pentru fiecare câmp, astfel încât să
păstrăm datele scrise de el, iar dacă utilizatorul completează greșit câmpurile și este
redirecționat la pagina cu formularul, datele introduse de el vor apărea din nou în
formular, astfel încât el v a putea să corecteze doar câmpurile în care a greșit.

După ce am realizat cele două fișiere, realizați încă unul cu numele
prelucrare.php , introduceți codul de mai jos și testați din nou în browser.

<?ph
p
require_once ('config.php');

Laborator SIAD Lucrarea nr.8
184 if(($_SESSION['n ume'] == "") || ($ _SESSION['prenume'] == "") ||
($_SESSION['varsta'] ==
"") || (!is _numeric($ _SESSION['varsta'])) || ($ _SESSION['e -mail'] ==
"") ||
($_SESSION['observatii'] == "") || (strlen($ _SESSION[' observatii '])
>
255) )
{
echo 'Nu ai introdus d ate in formular sau cele introduse nu sunt
corecte. <br>
Apasa <a href="index.php">aici</a> pentru a te intoarce la
pagina anterioara.'; } else {
echo 'Va multumim. <br>
Datele au fost introduse cu succes in baza de date. <br>
Pentru vizualizare apasat i <a href="vizualizare.php">aici</a>.';
$cerereSQL = "INSERT INTO `intrari` (`nume`, `prenume`, `varsta`,
`email`,`observatii`)
VALUES ('".$ _SESSION['nume']."', '".$ _SESSION['prenume']."',
'".$ _SESSION['varsta']."', '".$ _SESSION['e -mail']."',
'".$ _SESSION['observatii']."');";
mysql _query($cerereSQL);
$_SESSION['nume'] = '';
$_SESSION['prenume'] = '';
$_SESSION['varsta'] = '';
$_SESSION['e -mail'] = '';
$_SESSION['observatii'] = '';
}
?>
După ce ați testat în browser și ați trecut toți pașii din fo rmular, accesați
phpMyAdmin și vizualizați datele introduse în baza de date.

Explicații din scriptul prelucrare.php:
• Prima linie, require_once('config.php'); include fișierul config.php în care sunt
variabilele cu datele de conectare la baza de date. Î n continuare avem condițiile if
și else.
• În condiția if, verificăm dacă s -au introdus date în formular, dacă valoarea
câmpului vârsta este numerică, dacă valoarea câmpului comentariu este mai mare
de 255 caractere. o Construcția if este deschisă și închis a de parantezele rotunde
( ), iar în interiorul acestora sunt conditiile:
($_SESSION['nume'] == "") = Dacă valoarea câmpului nume este goală…
. . .
(!is_numeric($_SESSION['varsta'])) = Dacă valoarea câmpului vârsta nu este
numerică… (!is_numeric).
. . .
(strlen($_SESSION['comentariu']) > 255) = Dacă valoarea câmpului comentariu este
mai mare de 255 caractere… (strlen = numar de caractere în sir -ul dat). Semunul ||
înseamnă OR (sau logic)
• În condiția else, afișă textul, cum că datele au fost introdu se în baza de date, și
efectuăm inserarea.

Laborator SIAD Lucrarea nr. 8
185 În continuare se va realiza un script prin care afișăm în browser datele introduse
în baza de date. Astfel, se realizează un fișier vizualizare.php în care se introduce scriptul
de mai jos:
<?php
require_once ('config.php');
$cerereSQL = 'SELECT * FROM intrari';
$rezultat = mysql_query($cerereSQL);
while($rand = mysql_fetch_array($rezultat)) {
echo '<b>Nume:</b> '.$rand['nume'].' <br>
<b>Prenume:</b> '.$rand['prenume'].' <br>
<b>Varsta:</b> '.$rand['varsta']. ' ani <br>
<b>Email:</b> '.$rand['e -mail'].' <br>
<b>Observatii:</b> '.$rand['observatii'].' <br><br>';
}
?>
Acest fișier va fi accesat astfel: http://localhost/formular/vizualizare.php
Se vor introduce mai multe înregistrări în baza de date, apelând de fiecare dată
http://localhost/formular/index.php , și apoi se accesează
http:/ /localhost/formular/vizualizare.php pentru a vedea rezultatele

8.3 Temă pentru acasă:

Să se creeze o bază de date ce conține cer următoarele câmpuri: nume (tipul text),
vârsta (tipu l text), oraș (tipul text), ocupație (tipul text), codul numeric personal (tipul
text).
Cerințe:
Realizați baza de date, verificați câmpurile (să fie obligatorii, câmpurile nume și
oraș trebuie să conțina numai litere, câmpul cod numeric personal să conț ină numai cifre

Laborator SIAD Lucrarea nr.8
186 și să nu poată fie introduse mai mult de 13 caractere), introduceți în baza de date
informațiile prelucrate prin formular și afișați -le in ordinea:
nume | oraș | ocupație | vârsta | cod numeric personal.

Laborator SIAD Lucrarea nr.9
187
9 Sistem de înregistra re, autentificare și protecție
9.1 Obiective
• Realizarea unei baze de date MySQL, care se va numi autentificare ;
• Realizarea unui formular în php de înregistrare și introducere a datelor în baza de
date , după validarea acestora;
• Realizarea unei pagini d e autentificare;
• Restricționarea unei pagini pentru utilizatorii neautentificați;
• Realizarea unui panou de control în care utilizatorii înregistrați să -și poată
schimba datele personale și parola.

9.2 Realizarea bazei de date
Se verifică dacă aplica ția EasyPHP este pornită (serverul Apache și MySQL).
Se intră în phpMyAdmin (se deschide un browser internet și la adresă se tastează
localhost/phpmyadmin/ ).
Se creează baza de date cu numele " autentificare " și apoi tabela " utilizatori ", cu
7 coloane, ș i care are structura următoare:

Câmp Tip Null Extra Cerințe
ID int(11) nu auto_increment
utilizator char(60) nu
parola char(60) nu parola1 = parola2
nume char(30) nu Numai litere
prenume char(30) nu Numai litere
varsta char(3) nu Numai cifre
localitate char(30)

În directorul rădăcină al serverului Apache (EasyPHP), care este C:\Program
Files \EasyPHP 2.0b1 \www , se creează un folder cu numele autentificare . În acest
director vor trebui create 7 scripturi php, și anume:
• config.php – aici se găsesc datele de autentificare la baza de date – este identic
cu cel de la laboratorul 7, dar trebuie modificate datele de identificare ale bazei
de date – numele acesteie.
• index.php – pagina principală cu le gături către scripturile de înregistrare și
autentificare useri.
• inregistrare.php – script pentru înregistrare de noi utilizatori.
• autentificare.php – script pentru autentificare utilizatori.
• pagina.php – pagina accesibilă numai utilizatorilor autentifi cați.
• profil.php – pagina pentru modificare date personale.
• iesire.php – pagina pentru ieșire din sistem.

Laborator SIAD Lucrarea nr.9
188
if(!isset($_SESSION['parola1'])) $_SESSION['parola1'] = '';
if(!isset($_SESSION['parola2'])) $_SESSION['parola2'] = '';
if(!isset($_SESSION['nume '])) $_SESSION['nume'] = '';
if(!isset($_SESSION['prenume'])) $_SESSION['prenume'] = '';
if(!isset($_SESSION['varsta'])) $_SESSION['varsta'] = '';
if(!isset($_SESSION['localitate'])) $_SESSION['localitate'] = '';

switch($_GET['actiune'])
{ case '': ech o '<table width="309" border="0" cellpadding="0"
cellspacing="0">
<form name="formular" action="inregistrare.php?actiune=validare"
method="post">
<tr>
<td height="36" colspan="4" valign="top"><h1>Formular inregistrare
</h1></td>
</tr>
<tr>
<td width="80" height="19" valign="top">&nbsp;</td>
<td width="15" rowspan="5" valign="top"></td>
<td width="144" valign="top">&nbsp;</td>
<td width="70" valign="top">&nbsp;</td>
</tr>
<tr>
<td height="22" align="right" val ign="top">Utilizator:</td>
<td colspan="2" valign="top">
<input type="text" name="user" value="'.$_SESSION['user'].'">
</td>
</tr>
<tr>
<td height="7"></td>
<td></td>
<td></td>
</tr>
<tr>

9.3
Scriptul de înregistrare
Dup
ă
ce s-au modificat datele
din
config.php
, se creeaz
ă
fi
ș
ierul
inregistrare.php
care va con
ț
ine
urm
ă
torul script:

<
?php
require_once('config.php');

if(!isset($_GET['actiune']))
$_GET['actiune'] = '';
if(!isset($_SESSION['user']))
$_SESSION['user'] = '';

Laborator SIAD Lucrarea nr.9
189 <td height="22" al ign="right" valign="top">Parola:</td>
<td colspan="2" valign="top"><input type="password" name="parola1"
value="'.$_SESSION['parola1'].'"></td>
</tr>
<tr>
<td height="7"></td>
<td></td>
<td></td>
</tr>
<tr>
<td height ="38" align="right" valign="top">Reintroduceti<br>
Parola:</td>
<td>&nbsp;</td>
<td align="middle" valign="middle"><input type="password"
name="parola2" value="'.$_SESSION['parola2'].'"></td>
<td>&nbsp;</td>
</tr>
<tr>
<td height=" 7"></td>
<td valign="top"></td>
<td></td>
<td></td>
</tr>
<tr>
<td height="19" align="right">Nume:</td>
<td>&nbsp;</td>
<td colspan="2" valign="top"><input type="text" name="nume"
value="'.$_SESSION['nume'].'"></td>
</tr>
<tr>
<td height="7"></td>
<td valign="top"></td>
<td></td>
<td></td>
</tr>
<tr>
<td height="22" align="right">Prenume:</td>
<td valign="top"></td>
<td colspan="2" valign="top"><input type="text" name="pren ume"
value="'.$_SESSION['prenume'].'"></td>
</tr>
<tr>
<td height="8"></td>
<td valign="top"></td>
<td></td>
<td></td>
</tr>
<tr>
<td height="22" align="right" valign="top">Varsta:</td>
<td valign="top"></td>
<td colspan="2" valign="top"><input type="text" size="3"
maxLength="3" name="varsta" value="'.$_SESSION['varsta'].'">
ani</td>
</tr>
<tr>
<td height="15"></td>

Laborator SIAD Lucrarea nr.9
190 <td valign="top"></td>
<td></td>
<td></td>
</tr>
<tr>
<td height="22" align="right" valign="top">Localitate:</td>
<td valign="top"></td>
<td colspan="2" valign="top"><input type="text" name="localitate"
value="'.$_SESSION['localitate'].'"></td>
</tr>
<tr>
<td height="19">&nbsp;</td>
<td valign="top"></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td height="24">&nbsp;</td>
<td valign="top"></td>
<td colspan="2" valign="top"><input name="Trimite" type="submit"
id="Trimite" value="Trimite">
<input name="Reseteaza" type="reset" id="Reseteaza"
value="Reseteaza"> </td>
</tr>
<tr>
<td height="24">&nbsp;</td>
<td valign="top"></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</form>
</table>';
break; case
'validare':
$_SESSION['user'] = $_POST['user'];
$_SESSION['parola1'] = $_POST['parola1'];
$_SESSION['parola2'] = $_POST['parola2'];
$_SESSION['nume'] = $_POST['nume'];
$_SESSION['prenume'] = $_POST['prenume'];
$_SESSION['varsta'] = $_POST['varsta'];
$_SESSION['l ocalitate'] = $_POST['localitate'];

if(($_SESSION['user'] == '') || ($_SESSION['parola1'] == '') ||
($_SESSION['parola2'] != $_SESSION['parola1']) || ($_SESSION['nume']
== '') || ($_SESSION['prenume'] == '') || ($_SESSION['varsta'] == '')
|| (!is_num eric($_SESSION['varsta'])) || (strlen($_SESSION['varsta'])
< 2) || ($_SESSION['localitate'] == ''))
{
echo 'Nu ai introdus date in formular sau cele introduse nu sunt
corecte. <br>
Apasa <a href="inregistrare.php">aici</a> pentru a te intoarce
la pagina anterioara.';
} else
{
echo 'Va multumim. <br>
Datele au fost introduse cu succes in baza de date. <br>

Laborator SIAD Lucrarea nr.9
191 Pentru a va autentifica apasati <a
href="autentificare.php">aici</a>.';

$cerereSQL = "INSERT INTO `utilizatori` (`utilizator `, `parola`,
`nume`, `prenume`, `varsta`, `localitate`)
VALUES ('".addentities($_SESSION['user'])."',
'".md5($_SESSION['parola1'])."', '".addentities($_SESSION['nume'])."',
'".addentities($_SESSION['prenume'])."',
'".addentities($_SESSION[ 'varsta'])."',
'".addentities($_SESSION['localitate'])."')";
mysql_query($cerereSQL);

$_SESSION['user'] = '';
$_SESSION['parola1'] = '';
$_SESSION['parola2'] = '';
$_SESSION['nume'] = '';
$_SESSION['prenume'] = '';
$_SESSION['varsta'] = '';
$_SESSION['localitate'] = '';
} break; }
?>
9.3.1 Explicarea scriptului
inregistrare.php
Ca o a II -a linie din script, observăm linia if(!isset($_GET['actiune']))
$_GET['actiune'] = '' ; Această linie, dacă nu găsește $_GET[‘actiune’] ca fiind setată,
o va s eta. La fel și restul:
if(!isset($_SESSION['user'])) $ _SESSION['user'] = '';
if(!isset($_SESSION['parola1'])) $ _SESSION['parola1'] = '';
if(!isset($_SESSION['parola2'])) $ _SESSION['parola2'] = '';
if(!isset($_SESSION['nume'])) $ _SESSION['nume'] = '';
if(!isset($_SESSION['prenume'])) $ _SESSION['prenume'] = '';
if(!isset($_SESSION['varsta'])) $ _SESSION['varsta'] = '';
if(!isset($_SESSION['localitate'])) $ _SESSION['localitate'] = '';

Observăm construcția if, care are ca și condiție negativă (!) o funcție isset (se
folosește numai pentru a verifica dacă o variabilă există, returnează adevărat atunci când
o găsește și fals atunci când nu o găsește). Prin urmare, cu această construcție if..
verificăm dacă $_GET[‘actiune’] este setat, dacă nu, o setăm noi.
În continuare, uitându -ne peste script, observăm construcția switch . Am folosit
aceasta pentru a implementa mai multe acțiuni într -o singură pagină.
După cum vedem, primul case este null, ceea ce înseamnă că se execută scriptul
pentru pagina curenta .php.
Avem un formular în care sunt 7 câmpuri: utilizator, parola, reintroducerea
parolei, nume, prenume, vârsta și localitate.
Daca va uitați atenți, o să observați că în valoarea câmpurilor avem declarate niște
sesiuni:
<input type="text" name="user" value=" '.$_SESSION['user'].'">

Sesiunile au fost explicate în laboratorul anterior.

Laborator SIAD Lucrarea nr.9
192
Vom seta câte o sesiune pentru fiecare câmp, astfel încât să păstrăm datele scrise
de el, iar dacă utilizatorul completează greșit câmpurile și este redirecționat la pagina cu
formularul, datele introduse de el vor apărea din nou în formular, astfel încât el va putea
să corecteze doar câmpurile în care a greșit.
Ca acțiune a formularului este setat inregistrare.php?actiune=validare
Acest case îl găsiți la linia 119.
După c um vedeți, avem declarate sesiunile de care ne vom folosi în valoarea
câmpurilor din formular, și anume:
$_SESSION['user'] = $_POST['user'];

Valoarea acestei sesiuni user, este valoarea POST cu numele user, și tot așa.
În următoarele linii de cod avem structura if și else cu condițiile necesare, iar dacă
condițiile nu sunt adevărate, ne rezultă eroarea, dacă sunt acceptate, rezultă mesajul de
mulțumire și inserarea în baza de date, apoi setarea sesiunilor folosite ca fiind nule.
După acest case cu num ele 'validare', vom închide structura switch, respectiv
scriptul php.
Observăm ca la introducerea în baza de date am complicat procedeul.
Motivul este pentru a ne proteja de procedeul numit SQL INJECTION.
Aceasta operațiune se folosește pentru a introdu ce vulnerabilități în comanda care
trimite datele la baza de date (comanda query) și cu ajutorul acestora, se poate păcăli cu
ușurință baza de date.
Pentru a proteja datele care se introduc prin formular, ne -am folosit de o funcție,
și anume: addentities( );
9.3.2 Exemplu de script de atac:
SELECT * FROM `tabela` WHERE camp = 'orice' OR 'x'='x';
Observați că utilizatorul poate păcăli comanda SQL, introducând ca VALOARE
a câmpului: orice' OR 'x'='x , astfel încât comanda SQL se va “modifica”. Funcția
addle ntities() ; va transforma caracterele speciale din html în coduri.
Exemplu: din codul html <html> ne va rezulta &lt;html&gt ; sau dacă utilizatorul
introduce ‘ sau “ în câmpul innput, acestea se vor transforma în: &#039 ; sau &quot ; . . .
Protecția cu aceas tă funcție se face pentru ca atunci când citim din baza de date
un cod html, să nu fie interpretat de către browser ci, doar să fie afișat.
Aplicație experimentală:
Puneți intr -un fișier test.php codul: echo"<html>" și apoi puneți și
echo"&lt;html&gt" ; testați și observași rezultatul.

Următoarea noutate din comanda noastră SQL este funcția md5();
Aceasta funcție am folosit -o pentru a coda parola noastră și astfel a o introduce în
baza de date, neputând fi decodată de către nimeni.
md5 este o funcție PHP care codează o parolă în mod teoretic ireversibil:
<?php
$parola = 'parola';
echo md5($parola);
?>

Laborator SIAD Lucrarea nr.9
193 Puneți acest cod într -un fișier md5.php apoi testați și veți observa următorul
rezultat: 8287458823facb8ff918dbfabcd22ccb

9.3.3 Funcții în PHP
O funcție este folosită pentru a separa codul care realizează un singur task bine
definit. Acest lucru face codul mai lizibil și ne permite să îl reutilizăm de fiecare dată
când trebuie să efectuăm același task.
Argumentele unei funcții trebuie separate pri n virgulă, și, implicit, acestea sunt
transmise prin valoare. Pentru ca funcția să returneze un rezultat se folosește construcția
return care primește ca parametru o expresie care reprezintă valoarea funcției. În
momentul în care este întâlnită construcția return , execuția funcției se încheie.
În PHP sunt foarte multe funcții predefinite, însă puteți să vă concepeți și propriile
funcții.
Apelul unei funcții se face: nume_functie();
Majoritatea funcțiilor necesită unul sau mai mulți parametrii – informați i oferite
funcției atunci când este apelată și care influențează rezultatul execuției funcției –
Apelul unei funcții cu parametru se realizează astfel:
nume_functie($parametru) ;
Dacă încercați să apelați o funcție care nu există, veți primi un m esaj de eroare.
9.3.4 Exemple de creare funcții:
<?php
function functie_nume($nume)
{ $prenume = 'Vasile'; return
$nume.' '.$prenume;
}
echo functie_nume('Popescu');
?>

În exemplul următor se calculează cu ajutorul unei funcții PHP, pătratul unui
număr.
<?php
function patrat($n) {
return $n * $n;
}
echo '4^2 = <b> '.patrat(4).' </b>';
?>
Observați că am atribuit valoarea 4 funcției noastre cu numele patrat, iar rezultatul
apelării acesteia este calculul din interiorul funcției: return $n * $n ; adică returnează 4 x
4, care ne dă 16.

9.4 Scriptul de autentificare
La fel ca si la scriptul de înregistrare,
observăm setarea $_GET[‘actiune’] ca fiind nulă,
apoi deschiderea structurii switch.
În case null avem formularul de autentificare ce cup rinde 2 câmpuri: utilizator ți
parolă.

Laborator SIAD Lucrarea nr.9
194
else În case validare , avem sesiunea user cu valoarea postului user urmată de
construcția if și else cu condițiile aferente.
Fișierul autentificare.php conține:

<?php
require_once('config.php');

if(!isset($_GET['a ctiune'])) $_GET['actiune'] = '';

switch($_GET['actiune'])
{ case '': echo '<form action="autentificare.php?actiune=validare"
method="post">
Utilizator: <input type="text" name="user" value=""><br>
Parola: <input type="password" name="par ola" value=""><br>
<input type="submit" name="Login" value="Login">
</form>';
break; case
'validare':

$_SESSION['user'] = $_POST['user'];

if(($_POST['user'] == '') || ($_POST['parola'] == ''))
{
echo 'Completeaza casutele. <Br>
Apasati <a href="autentificare.php">aici</a> pentru a va intoarce
la pagina precedenta.';
}
{
$cerereSQL = "SELECT * FROM `utilizatori` WHERE
utilizator='".htmlentities($_POST['user'])."' AND
parola='".md5($_POST['parola'])."'";
$rezultat = mysql_query($c erereSQL);
if(mysql_num_rows($rezultat) == 1)
{
while($rand = mysql_fetch_array($rezultat))
{
$_SESSION['logat'] = 'Da';
echo '<META HTTP -EQUIV=Refresh CONTENT="0; URL=pagina.php">';
}
}
el
se
{
echo 'Date incorecte. <Br>
Apasati <a href="autentificare.php">aici</a> pentru a va
intoarce la pagina precedenta.';
}
}
brea
k; }
?>

Laborator SIAD Lucrarea nr.9
195 În aceasta construcție else, avem selectarea din baza de date unde câmpul
utilizator este egal cu POST user, iar parola este egală cu criptarea paro lei pentru
POST parola.
Dacă numărul de rânduri rezultate este 1, atunci setăm o sesiune cu numele
logat și valoarea Da, apoi redirecționăm – cu ajutorul etichetei HTML meta refresh
– către pagina utilizatorului.
Dacă numărul de rânduri rezultate nu este 1, atunci afișăm un mesaj de eroare.
În cazul în care rezultatele au fost găsite în baza de date, autentificarea s -a efectuat
cu succes și vom fi redirecționați în pagina.php
9.5 Scriptul pagina utilizator – pagina.php
<?php
require_once('config.php') ;

if(!isset($_SESSION['logat'])) $_SESSION['logat'] = 'Nu';
if($_SESSION['logat'] != 'Da')
{ echo 'Pentru a accesa aceasta pagina, trebuie sa va
autentificati.
<br>
Pentru a va autentifica, apasati <a href = "autentificare.php">
aici</a><br>
Pentru a va inregistra, apasati <a href = "inregistrare.php">
aici</a>';
}
else
{
echo 'Bine ai venit, <b><i>'.$_SESSION['user'].'</b></i>!<br><br>
<a href="profil.php">Schimba date personale</a><br><br>
<a href="iesire.php">Iesire</a>';
}
?>

Observam ca avem o construcție if și else.
Dacă sesiunea cu numele logat nu are valoarea Da executăm o buclă de cod, dacă
sesiunea logat are valoarea Da, executăm pagina pentru utilizator.
Să ne reamintim că această sesiune $_SESSION[‘logat’] == ‘Da ’; a fost setată
atunci când autentificarea s -a realizat cu succes.
Accesați http://localhost/autentificare/pagina.php, fără să vă autentificați, și veți
observa mesajul de eroare, apoi autentificați -vă și veți observa pagina utilizatorului.
Din această pagină, vă
puteți schimba datele personale
precum și parola, iar apoi puteți
să ieșiți din sistem folosind linkul
“ieșire”.

9.6 Scriptul profil.php
<?php
require_once('config.php');

Laborator SIAD Lucrarea nr.9
196 if(!isset($_GET['actiune'])) $_GET['actiune'] = '';
if(!isset($_S ESSION['logat'])) $_SESSION['logat'] = 'Nu';

if($_SESSION['logat'] != 'Da')
{ echo 'Pentru a accesa aceasta pagina, trebuie sa va
autentificati.
<br>
Pentru a va autentifica, apasati <a href="autentificare.php">
aici</a><br>
Pentru a va inregistr a, apasati <a
href="inregistrare.php"> aici</a>'; } else {
switch($_GET['actiune'])
{ case '': echo '<h1>Profilul
dumneavoastra</h1>
Apasati <a href="profil.php?actiune=date_personale">aici</a>
pentru a schimba datele personale.<br>
Apasati <a hr ef="profil.php?actiune=parola">aici</a> pentru a
schimba parola dumneavoastra.<br><br>
<a href="pagina.php">Intoarceti`va la pagina principala.</a>';
break; case
'date_personale':
$cerereSQL = 'SELECT *
FROM `utilizatori` WHERE
utilizator="'.$_SES SION['u
ser'].'"'; $rezultat =
mysql_query($cerereSQL);
while($rand =
mysql_fetch_array($rezulta
t)) {
echo '<table width="347"
border="0" cellpadding="0"
cellspacing="0">
<form name="formular"
action="profil.php?actiune=validare" method="post ">
<tr>
<td height="50" colspan="4" valign="top"><h1>Modifica date
personale</h1></td>
</tr>
<tr>
<td width="80" height="19">&nbsp;</td>
<td width="15">&nbsp;</td>
<td width="214">&nbsp;</td>
<td width="38">&nbsp;</td>
</tr>

<tr>
<td height="10"></td>
<td></td>
<td></td>
</tr>
<tr>
<td height="22" align="right" valign="top">Nume:</td>
<td valign="top"></td>
<td valign="top"><input type="text" name="nume"
value="'.$rand['nume '].'"></td>
<td></td>

Laborator SIAD Lucrarea nr.9
197 </tr>
<tr>
<td height="9"></td>
<td valign="top"></td>
<td></td>
<td></td>
</tr>
<tr>
<td height="22" align="right" valign="top">Prenume:</td>
<td valign="top"></td>
<td valign=" top"><input type="text" name="prenume"
value="'.$rand['prenume'].'"></td>
<td></td>
</tr>
<tr>
<td height="9"></td>
<td valign="top"></td>
<td></td>
<td></td>
</tr>
<tr>
<td height="22" align="right" valign="to p">Varsta:</td>
<td valign="top"></td>
<td valign="top"><input type="text" size="3" maxLength="3"
name="varsta" value="'.$rand['varsta'].'">
ani</td> <td></td>
</tr>
<tr>
<td height="8"></td>
<td valign="top"></td>
<td></td>
<td></td>
</tr>
<tr>
<td height="22" align="right" valign="top">Localitate:</td>
<td valign="top"></td>
<td valign="top"><input type="text" name="localitate"
value="'.$rand['localitate'].'"></td>
<td></td>
</tr>
<tr>
<td height="14"></td>
<td valign="top"></td>
<td></td>
<td></td>
</tr>
<tr>
<td height="24"></td>
<td valign="top"></td>
<td valign="top"><input name="Trimite" type="submit" id="Trimite"
value="Mod ifica date">
<input name="Reseteaza" type="reset" id="Reseteaza"
value="Reseteaza"> </td>
<td></td>
</tr>
<tr>

Laborator SIAD Lucrarea nr.9
198 <td height="19"></td>
<td valign="top"></td>
<td>&nbsp;</td>
<td></td>
</tr>
</form>
</table>'; } break; case 'parola':

echo '<table width="309" border="0"
cellpadding="0" cellspacing="0">
<form name="formular"
action="profil.php?actiune=validare" method="post">
<tr>
<td height="36" colspan="4" valign="top"><h1>Modifica
parola</h1></td>
</tr>
<tr>
<td width="80" height="19" valign="top">&nbsp;</td>
<td width="15" rowspan="5" valign="top"></td>
<td width="144" valign="top">&nbsp;</td>
<td width="70" valign="top">&nbsp;</td>
</tr>
<tr>
<td height="22" align="right" valign="top">Parola:</td>
<td colspan="2" valign="top">
<input type="password" name="parola1" value=""> </td>
</tr>
<tr>
<td height="7"></td>
<td></td>
<td></td>
</tr>
<tr>
<td height="22" alig n="right" valign="top">Reintroduceti
parola:</td>
<td colspan="2" valign="middle"><input type="password"
name="parola2" value=""></td>
</tr>
<tr>
<td height="7"></td>
<td></td>
<td></td>
</tr>
<tr>
<td height="24">&nb sp;</td>
<td valign="top"></td>
<td colspan="2" valign="top"><input name="Trimite" type="submit"
id="Trimite" value="Modifica parola">
<input name="Reseteaza" type="reset" id="Reseteaza"
value="Reseteaza"> </td>
</tr>
<tr>
<td height="24">&nbsp;</td>
<td valign="top"></td>
<td>&nbsp;</td>
<td>&nbsp;</td>

Laborator SIAD Lucrarea nr.9
199 </tr>
</form>
</table>'; break;
case 'validare':

if(!isset($_POST['parola1'])) $_SESSION['parola1'] = ''; else
$_SESSION['parola1'] = $_POST['parola1'] ;

if(!isset($_POST['parola2'])) $_SESSION['parola2'] = '';
else $_SESSION['parola2'] = $_POST['parola2'];
if(!isset($_POST['nume'])) $_SESSION['nume'] = ''; else
$_SESSION['nume'] = $_POST['nume'];

if(!isset($_POST['prenume'])) $_SESSION['prenume'] = '';
else $_SESSION['prenume'] = $_POST['prenume'];

if(!isset($_POST['varsta'])) $_SESSION['varsta'] = '';
else $_SESSION['varsta'] = $_POST['varsta'];

if(!isset($_POST['localitate'])) $_SESSION['localitate'] = '';
else $_SESSION['localitate'] = $_P OST['localitate'];

if(($_POST['Trimite'] == 'Modifica date') && ($_SESSION['nume'] == ''
|| $_SESSION['prenume'] == '' || $_SESSION['varsta'] == '' ||
!is_numeric($_SESSION['varsta']) || strlen($_SESSION['varsta'] < 2) ||
$_SESSION['localitate'] == '' ))
{
echo 'Completeaza campurile.<br>
Apasa <a href="profil.php?actiune=date_personale">aici</a>
pentru a te intoarce.';
}
elseif(($_POST['Trimite'] == 'Modifica date') && ($_SESSION['nume'] !=
'' || $_SESSION['prenume'] != '' || $_SESSION['var sta'] != '' ||
is_numeric($_SESSION['varsta']) || strlen($_SESSION['varsta'] >= 2)
||
$_SESSION['localitate'] != ''))
{
echo 'Datele au fost modificate. <br>
Apasa <a href="pagina.php">aici</a> pentru a te intoarce la
pagina principala.';
$cerereSQL = "UPDATE `utilizatori` SET
nume='".addentities($_SESSION['nume'])."',
prenume='".addentities($_SESSION['prenume'])."',
varsta='".addentities($_SESSION['varsta'])."',
localitate='".addentities($_SESSION['localitate'])."' WHERE
utilizator='".$_SESSION[ 'user']."'";
mysql_query($cerereSQL);

$_SESSION['nume'] = '';
$_SESSION['prenume'] = '';
$_SESSION['varsta'] = '';
$_SESSION['localitate'] = '';
}
elseif(($_POST['Trimite'] == 'Modifica parola') &&

Laborator SIAD Lucrarea nr.9
200 ($_SESSION['parola1'] == '' || $_SESSION['par ola1'] !=
$_SESSION['parola2']))
{
echo 'Completeaza campurile.<br>
Apasa <a href="profil.php?actiune=parola">aici</a> pentru a
te intoarce.'; }
elseif(($_POST['Trimite'] == 'Modifica parola') &&
($_SESSION['parola1'] != '' || $_SESSION['parola 1'] ==
$_SESSION['parola2']))
{
echo 'Parola a fost modificata. <br>
Apasa <a href="pagina.php">aici</a> pentru a te intoarce la
pagina principala.';
$cerereSQL = "UPDATE `utilizatori` SET
parola='".md5($_SESSION['parola1'])."' WHERE
utilizator ='".$_SESSION['user']."'";
mysql_query($cerereSQL);

$_SESSION['parola1'] = '';
$_SESSION['parola2'] = '';
}
break;
}
}
?>

Și în acest script, la fel ca și în celelalte, ne -am folosit de construcția switch și
case.
În case null , avem legătur ile către următoarele case unde vom avea formularele
de prelucrare a datelor existente utilizatorului autentificat.
În case ‘date_personale’: selectăm tot din baza de date unde utilizator este egal
cu utilizatorul autentificat. Dacă conexiunea returnează rezultate, executăm formularul de
prelucrare a datelor, iar în câmpul value al fiecărui input vom seta ca valoare câmpul din
baza de date aferent acelui input.

Exemplu :
<input type="text" name="nume" value="'.$rand['nume'].'">

Observați că acest cas e, precum și cel de modificare parolă, se folosește de aceeași
acțiune, respectiv: profil.php?actiune=validare
Da, este posibil deoarece am setat 2 valori diferite pentru cele 2 formulare:
• pentru formularul cu date am setat ca valoare: “Modifica date” iar pentru cel cu
parola am setat “Modifica parola”, apoi, în funcție de ce buton era apăsat, am
realizat condițiile if.

9.7 Scriptul iesire.php
Acest script conține funcțiile ce golesc și distrug sesiunile.

Laborator SIAD Lucrarea nr.9
201 <?php
session_start();
session_destroy();
session_unset();
echo 'Ati iesit din sistem. <br>
Pentru a va intoarce la pagina principala, apasati
<a href="index.php">aici</a>';
?>

Laborator SIAD Lucrarea nr.10
202
10 Realizarea unui formular de contact
10.1 Obiective
• Realizarea unei pagini php care să conțină un f ormular de contact pentru trimis
date prin e -mail;
• Realizarea unei pagini php de prelucrare și trimitere a mesajului.

Formularul trebuie să aibă cinci câmpuri (care sunt obligatorii), și anume:
• e-mail;
• nume – doar litere;
• prenume – doar litere; • subiect;
• mesaj.

10.2 Mod de lucru:
În directorul www al serverului Apache se creează directorul contact în care se
salvează fișierul index.php creat cu PHPDesing2005, și care va conține următorul script:

<html>
<head>
<title>Formular de contact< /title>
</head>
<body>
<form action="trimite.php" method="post">

E-Mail: <input type="text" name="email" value=""> <br>
Nume: <input type="text" name="nume" value=""> <br>
Prenume: <input type="text" name="prenume" value=""> <br>
Subiect: <input type="text" name="subiect" value=""> <br>
Mesaj: <textarea name="mesaj" cols="60" rows="6"></textarea>

<br><br>
<input type="submit" name="Trimite" value="Trimite">
<input type="reset" name="Reseteaza" value="Reseteaza">
</form>
</body>
</html>
Se salvează și se vizualizează în browser
accesand http://localhost/contact/index.php.

Se crează un fișier numele trimite.php în care se introduce codul de mai jos:
<?php
if(($_POST['email'] == '') || ($_POST['nume'] == '') ||
(is_numeric($_POST['nume'])) ||
($_POST['prenume'] == '') || (is_numeric($_POST['prenume'])) ||
($_POST['subiect'] == '')
|| ($_POST['mesaj'] == ''))

Laborator SIAD Lucrarea nr.10
203 {
echo 'Completati campurile corect <br>
Apasati <a href="index.php">aici</a> pentru a va intoa rce la
pagina principala.';
}
else
{
$catre = ' adresaemail@yahoo.com ';
$data_trimitere = date('d -m-Y H:i:s');
$subiect = $_POST['subiect'];
$mesaj = '
<html>
<head>
<title>Formular de Contact</title>
</head>
<body>
<p><tt>Data trimitere: '.$ data_trimitere.' </tt></p>
<table>
<tr>
<td><tt> Nume: '.$_POST['nume'].' </tt></td>
</tr>
<tr>
<td><tt> Prenume: '.$_POST['prenume'].' </tt></td>
</tr>
<tr>
<td><tt> E -Mail: <a href="mailto:'.$_POST['email'].'"> '.$_POST
['email'].'</a> </tt></t d>
</tr>
<tr>
<td><tt> Mesaj: <br><br> '.$_POST['mesaj'].' </tt></td>
</tr>
</table>
</body>
</html>';
$headere = "MIME -Version: 1.0 \r\n";
$headere .= "Content -type: text/html; charset=iso -88591\r\n";
headere .= "From: ".$_POST['nume']."
".$_POST ['prenume']."<".$_POST['email']."> \r\n";
mail($catre, $subiect, $mesaj, $headere); echo
'Mesajul a fost trimis';
}
?>
Modificați adresa de email din variabila $catre ='adresaemail@yahoo.com' ;
cu email -ul dvs.
Pentru a face acest script să trimita mail, este aveti nevoie de un server SMTP, un
server de E -Mail.
Vă recomand serverul QK care poate fi descărcat de
la adresa http://www.qksoft.com/ După ce ați instalat serverul și l -ati pornit, ar
trebui să vă apară în bara de start de lânga ceas.
Testați scriptul și verificați email -ul dvs pentru a vedea dacă ați primit mesajul.
(În caz că nu apare în Inbox, uitați -vă în Bulk).

Laborator SIAD Lucrarea nr.10
204 Observați că în scriptul trimite.php ne-am folosit de condițiile if și else (cond iții
pe care deja le știam) însă am folosit și 2 noi functii, și anume: date(); și mail() ;

10.2.1 Funcția date();
Această funcție returnează un string ce conține data. Acestei funcții i se pot atribui
parametrii, parametrii ce semnifică formatul de af ișare a datei.
Această funcție returnează datele în engleză, pentru a returna în română, trebuie
să vă faceți propria funcție.
Exemple de folosire a funcției date();
Realizați un fișier cu numele data.php și introduceți codul de mai jos:
<?php
$data = date("d.m.Y");
echo 'Data curenta este: '.$data.'';
?>
Salvați și vizualizați în browser http://localhost/contact/data.php .
Și așa mai departe, vă puteți “juca” cu funcția date și parametrii ei pentru a obține
rezultatele dorite:
<?php
$data = date("d.m.Y");
$ora = date("H:i:s");
echo 'Data curenta este: '.$data.' si ora '.$ora.'';
?>
10.2.2 Functia mail();
După cum vedeți în scriptul trimite.p hp, ne-am folosit de această funcție PHP
pentru a trimite datele culese din formular în email -ul nostru.
Un simplu exemplu de folosire ar fi următorul:
<?php

Laborator SIAD Lucrarea nr.10
205 mail("adresamail@yahoo.com", "Subiectul meu", "Line 1 \nLine 2\nLine
3");
?>
Pentru ca trimit erea mail -ului să se facă mai rapid și mai ușor și să fie mai ușor de
interpretat de către serverul de email și client, trebuie să îi definim parametrii pentru
headere.
<?php
mail("adresamail@yahoo.com", "Subiectul", "Mesajul",
"From: adresamail@gmail.c om\r\n" . "Reply -To:
adresamail@hotmail.com \r\n"."X-Mailer: PHP/"
. phpversion());
?>

Acum, analizând exemplul nostru de trimitere email din scriptul trimite.php ,
observăm că de fapt nu este așa greu precum pare, ci chiar este foarte ușor: După cum
vedeți, am declarat niște variabile:
$catre = 'adresamail@yahoo.com'; // adresa de email unde primim informațiile
$data_trimitere = date('d -m-Y H:i:s'); // data la care mesajul a fost trimis
$subiect = $_POST['subiect']; // subiectul (pe care l -a completat utilizatorul în
form)

Apoi avem variabila $mesaj ce conține ca valoare un cod HTML cu datele trimise
prin formular și variabila $data_trimitere.
Și, ca ultimă alcătuire, avem headerele și funcția mail ce conține variabilele setate
mai sus.
mail($cat re, $subiect, $mesaj, $headere);

Laborator SIAD Lucrarea nr.11
206
11 Sistem de căutare în baza de date
11.1 Obiective
• Realizarea unei baze de date mysql cu următoarele câmpuri: ID, titlu, adresa,
descriere, vizite;

Tabela bazei de date trebuie să aibă cinci câmpuri (car e sunt obligatorii), și anume:
• id – int(11), not -null, auto_increment ;
• titlu – varchar(255), not -null, cu minim 2 caractere, cel mult 255;
• adresa – varchar(255), not -null, cu minim 2 caractere, cel mult 255; • descriere
– varchar(255), not -null, cu min im 2 caractere, cel mult 255;;
• vizite – bigint(10), not -null, default = 0.

11.2 Mod de lucru:
În primul rând, vom crea baza de date cautare care va avea tabela intrari cu 5
cele coloane și cu proprietățile acestora, prezentate mai sus.
Vom crea apoi, în directorul rădăcină al serverului C: \Program Files \EasyPHP
2.0b1 \www directorul numit cautare .
În acesta vom crea fișierul config.php în care introducem codul de mai jos (identic
cu celelalte fișiere config.php utilizate în laboratoarele anterioare):

<?php session_start();
set_time_limit(0);
error_reporting(E_ALL
);

// Informatii baza de date
$AdresaBazaDate = "localhost";
$UtilizatorBazaDate = "root";
$ParolaBazaDate = "";
$NumeBazaDate = "cautare";

$conexiune =
mysql_connect($Adresa BazaDate,$UtilizatorBazaDate,$ParolaBazaDate) or
die("Nu ma pot conecta la MySQL!");
mysql_select_db($NumeBazaDate, $conexiune) or die("Nu gasesc baza de
date!");
function addentities($data){
if(trim($data) != ''){
$data = htmlentities($data, E NT_QUOTES);
return str_replace(' \\', '&#92;', $data);
} else return $data;
} // End addentities() –––––
?>

Laborator SIAD Lucrarea nr.11
207
În continuare se realizează fișierul index.php în care se introduce codul de mai
jos, și se vizualizează în browser.
<?php
echo '<a href="adauga.php">Adauga site</a> | <a href="cauta.php">Cauta
site</a>'; ?>

11.2.1 Fișierul adauga.php
Pagina index.php va avea două legături către paginile adauga.php și
cauta.php . În continuare vom realiza pagina adauga.php în care introd ucem codul de
mai jos:
<?php
require_once 'config.php';

if(!isset($_GET['pag'])) $_GET['pag'] = '';
if(!isset($_SESSION['titlu'])) $_SESSION['titlu'] = '';
if(!isset($_SESSION['adresa'])) $_SESSION['adresa'] = '';
if(!isset($_SESSION['descriere'])) $_ SESSION['descriere'] = '';

switch($_GET['pag'])
{ case '' : echo '<form name="adauga"
action="adauga.php?pag=verifica" method="post">
Titlu: <br> <input type="text" name="titlu"
value="'.$_SESSION['titlu'].'"><br><br>
Adresa: <br> <input type="text" name="adresa"
value="'.$_SESSION['adresa'].'"><br><br>
Descriere: <br> <textarea name="descriere" rows="6" cols="45"
value="'.$_SESSION['descriere'].'">'.$_SESSION['descriere'].'</text
a rea><br><br>
<input type="submit" name="Adaug a" value="Adauga">
</form>';
break; case
'verifica' :

$_SESSION['titlu'] = $_POST['titlu'];
$_SESSION['adresa'] = $_POST['adresa'];
$_SESSION['descriere'] = $_POST['descriere'];

if(($_SESSION['titlu'] == '') || (strlen($_SESSION['titlu']) < 2) ||
(strlen($_SESSION['titlu']) > 255) || ($_SESSION['adresa'] == '') ||
(strlen($_SESSION['adresa']) < 2) || (strlen($_SESSION['adresa']) >
255) || ($_SESSION['descriere'] == '') ||
(strlen($_SESSION['descriere']) < 2) ||
(strlen($_SESSION['descriere'] ) > 255))
{ echo 'Completeaza corect campurile. <br>
Vezi daca: ai completat campurile, daca ai scris mai mult
de 2 caractere si mai putin de 255<br><br>
Apasa <a href="adauga.php">aici</a> pentru a te intoarce.';
} else
{

Laborator SIAD Lucrarea nr.11
208 $cerereSQL = "INSE RT INTO `intrari` (`titlu`, `adresa`,
`descriere`)
VALUES ('".addentities($_SESSION['titlu'])."',
'".addentities($_SESSION['adresa'])."',
'".addentities($_SESSION['descriere'])."');";
mysql_query($cerereSQL);

$_SESSION['titlu'] = '';
$_SESSION['adresa'] = '';
$_SESSION['descriere'] = '';

echo 'Am introdus datele in baza de date. <br>
Apasa <a href="index.php">aici</a> pentru a te intoarce la
pagina principala.';
}
}
?>
break
;

Laborator SIAD Lucrarea nr.11
209 Formularul prin care vom adăuga date în baza de date. P rivind
codul putem deduce:
• instrucțiunea switch și case este folosită pentru a delimita paginile;
• instrucțiunea if și else pentru a condiționa rezultatele.

În case -ul default, case ' ': , avem formularul cu câmpurile: titlu, adresa,
descriere iar ca va loare a acestora avem setate sesiunile corespunzătoare lor.
În case -ul 'verific ă', observăm setarea sesiunilor cu date trimise de utilizator
prin metoda $_POST , instrucțiunea if, în care avem condițiile, apoi instrucțiunea else
ce va executa introducerea în baza de date, golirea sesiunilor folosite și afișarea unui text
în pagină.
Ca protecție a introducerii datelor, s -a folosit funcția addentities() . Introduceți
câteva adrese în baza de date, pentru a testa căutarea.

11.2.2 Fișierul cauta.php
Scriptul pentru pagina cauta.php :

<?php
require_once 'config.php';

if(!isset($_GET['pag'])) $_GET['pag'] = '';
switch($_GET['pag']) {
case '': echo '<form name="cauta" action="cauta.php?pag=cauta"
method="post"> Titlu: <input type="text" name=" cauta" value="">
<input
type="submit" name="Cauta" value="Cauta"> <br>
<a href="cauta.php?pag=cautare -avansata">Cautare avansata</a>
</form>';
break; case 'cauta':

if($_POST['cauta'] == '') {
echo 'Introdu un cuvant pentru a
cauta in baza de date. <br>
Apasa <a href="cauta.php">aici</a> pentru a te intoarce.';
} elseif(strlen($_POST['cauta']) < 3) {
echo 'Cuvantul trebuie sa contina cel putin 3 caractere. <br>
Apasa <a href="cauta.php">aici</a> pentru a te intoarce.';
} else {
$cerereSQL = 'SELECT * FROM `intrari` WHERE `titlu` LIKE
"%'.addentities($_POST['cauta']).'%"';
$rezultat = mysql_query($cerereSQL);
if(mysql_num_rows($rezultat) > 0) {
while($rand = mysql_fetch_array($rezultat)) { echo
'<a href="'.$rand[' adresa'].'">'.$rand['titlu'].'</a> –
'.$rand['adresa'].'<br> <i>'.$rand['descriere'].'</i>
<br><br>';
}
} else {

Laborator SIAD Lucrarea nr.11
210 echo 'Nu au fost gasite rezultate pentru cautarea: <font
color="red"><b><i>'.addentities($_POST['cauta']).'</i></b></font>
<br>
Apasati <a href="cauta.php">aici</a> pentru a va intoarce';
}

} break; case 'cautare –
avansata':

echo '<form name="cauta"
action="cauta.php?pag=cautare –
avansata2" method="post">
Cauta: <input type="text" name="cauta" value=""> <br><br>
in <input type="checkbox" name="in1" value="titlu" id="titlu">
<label for="titlu">Titlu</label> |
<input type="checkbox" name="in2" value="adresa"
id="adresa"> <label for="adresa">Adresa</label> |
<input type="checkbox" name="in3" value="des criere"
id="descriere"> <label for="descriere">Descriere</label> <br><br>
<input type="submit" name="Cauta" value="Cauta"> <br>
</form>';

break; case 'cautare –
avansata2':

if(!isset($_POST['in1'])) $_POST['in1'] = '';
if(!isset($_POST['in2' ])) $_POST['in2'] = '';
if(!isset($_POST['in3'])) $_POST['in3'] = '';

if($_POST['cauta'] == '') {
echo 'Introdu un cuvant pentru a cauta in baza de date. <br>
Apasa <a href="cauta.php">aici</a> pentru a te intoarce.';
} elseif(strlen($_POST['ca uta']) < 3) {
echo 'Cuvantul trebuie sa contina cel putin 3 caractere. <br>
Apasa <a href="cauta.php">aici</a> pentru a te intoarce.';
} else {
if(($_POST['in1'] != 'titlu') && ($_POST['in2'] != 'adresa') &&
($_POST['in3'] != 'descriere')) {
$cerereSQL = 'SELECT * FROM `intrari` WHERE `titlu` LIKE
"%'.addentities($_POST['cauta']).'%"';
$in = '';
} elseif(($_POST['in1'] == 'titlu') && ($_POST['in2'] != 'adresa') &&
($_POST['in3'] != 'descriere')) {
$cerereSQL = 'SELECT * FROM `intrari` WHERE `titlu` LIKE
"%'.addentities($_POST['cauta']).'%"';
$in = 'titlu';
} elseif(($_POST['in1'] != 'titlu') && ($_POST['in2'] == 'adresa') &&
($_POST['in3'] != 'descriere')) {
$cerereSQL = 'SELECT * FROM `intrari` WHERE `adresa` LIKE
"%'.addentities($_P OST['cauta']).'%"';
$in = 'adresa';
} elseif(($_POST['in1'] != 'titlu') && ($_POST['in2'] != 'adresa') &&
($_POST['in3'] == 'descriere')) {
$cerereSQL = 'SELECT * FROM `intrari` WHERE `descriere` LIKE

Laborator SIAD Lucrarea nr.11
211 "%'.addentities($_POST['cauta']).'%"';
$in = 'd escriere';
} elseif(($_POST['in1'] == 'titlu') && ($_POST['in2'] == 'adresa') &&
($_POST['in3'] != 'descriere')) {
$cerereSQL = 'SELECT * FROM `intrari` WHERE `titlu` LIKE
"%'.addentities($_POST['cauta']).'%" AND `adresa` LIKE
"%'.addentities($_POST[' cauta']).'%"';
$in = 'titlu, adresa';
} elseif(($_POST['in1'] != 'titlu') && ($_POST['in2'] == 'adresa') &&
($_POST['in3'] == 'descriere')) {
$cerereSQL = 'SELECT * FROM `intrari` WHERE `adresa` LIKE
"%'.addentities($_POST['cauta']).'%" AND `descrier e` LIKE
"%'.addentities($_POST['cauta']).'%"';
$in = 'adresa, descriere';
} elseif(($_POST['in1'] == 'titlu') && ($_POST['in2'] == 'adresa') &&
($_POST['in3'] == 'descriere')) {
$cerereSQL = 'SELECT * FROM `intrari` WHERE `titlu` LIKE
"%'.addentitie s($_POST['cauta']).'%" AND `adresa` LIKE
"%'.addentities($_POST['cauta']).'%" AND `descriere` LIKE
"%'.addentities($_POST['cauta']).'%"';
$in = 'titlu, adresa, descriere';
}

$rezultat = mysql_query($cerereSQL);
if(mysql_num_rows($rezultat) > 0) { echo
'Cautati in: <font color="red">'.$in.'</font> dupa:
<font
color="red"><b>'.addentities($_POST['cauta']).'</b></font><br><br>';
while($rand = mysql_fetch_array($rezultat)) {
echo '<a href="'.$rand['adresa'].'">'.$rand['titlu'].'</a> –
'.$rand['adresa'].'<br> <i>'.$rand['descriere'].'</i> <br><br>';
}
} else {
echo 'Nu au fost gasite rezultate pentru cautarea: <font
color="red"><b><i>'.addentities($_POST['cauta']).'</i></b></font> in
<font color="red">'.$in.'</font><br>
Apasati <a href="cauta.php?pag=cautareavansata">aici</a>
pentru a va intoarce';
}
}
break;
}
?> comandă SQL:

$cerereSQL = 'SELECT * FROM `intrari` WHERE `titlu` LIKE
"%'.addentities($_POST['cauta']).'%"';

Această comandă SQL, selectează tot din baza de date unde câmpul titlul conține
cuvântul trimis prin formular $_POST['cauta'].
Aceasta este o căutare simplă în baza de date, după titlu, însă se poate realiza și o
căutare mai avansată după titlu, adresă sau descirere.
Analizând case -ul 'cautare avansata': , observă, scriptul pentru căutare
avansată:

Laborator SIAD Lucrarea nr.11
212 if(($_POST['in1'] != 'titlu') && ($ _POST['in2'] != 'adresa') &&
($_POST['in3'] != 'descriere'))
{
$cerereSQL = 'SELECT * FROM `intrari` WHERE `titlu` LIKE
"%'.addentities($ _POST['cauta' ]).'%"';
$in = '';
}
Această parte de cod se interpretează astfel:
Dacă valoarea post in1 nu este egală cu titlu, și valoarea post in2 nu este egală cu
adresa, și valoarea post in3 nu este egală cu descriere:
{ creează o variabilă cerereSQL care să ca ute doar în titlu după textul
dat, creează o variabilă cu numele "in" cu valoare nulă,
}

adică, dacă nu se selectează nici o opțiune, căutarea se va efectua ca cea anterioară, adică
doar după câmpul titlu.

elseif(($_POST['in1'] == 'titlu') && ($ _POST['in2'] != 'adresa') &&
($_POST['in3'] != 'descriere'))
{
$cerereSQL = 'SELECT * FROM `intrari` WHERE `titlu` LIKE
"%'.addentities($_POST['cauta']).'%"';
$in = 'titlu';
}
Dacă valoarea post in1 este egală cu titlu (adică dacă opțiunea titlu a fost
selectată), și dacă valorile post -ului 2 și 3 nu sunt selectate
{ creează o variabila cerereSQL care să caute în titlu după textul
dat creează o variabilă cu numele “in” cu valoarea titlu
}
…………
….
elseif(($_POST['in1'] == 'titlu') && ($ _POST['in2'] == 'adresa') &&
($_POST['in3'] != 'descriere'))
{
$cerereSQL = 'SELECT * FROM `intrari` WHERE `titlu` LIKE
"%'.addentities($ _POST['cauta']).'%" AND `adresa` LIKE
"%'.addentities($ _POST['cauta']).'%"';
$in = 'titlu, adresa';
}
Dacă valoarea post i n1 este egală cu titlu (adică dacă opțiunea titlu a fost
selectată), și dacă valoarea post -ului in2 este egală cu adresa (adică dacă și opțiunea
adresa a fost bifată), și dacă valoarea post -ului in3 nu este descriere
{ creează o variabilă cerereSQL care să caute în titlu și adresa după textul
dat creează o variabilă cu numele “ in” cu valoarea titlu, adresa }
…………
….
Efectuați un test în browser, în funcție de adresele introduse de dumneavoastră în
formular, bifați opțiunile pe rând și testați.

Laborator SIAD Lucrarea nr.11
213
Deduc eți rolul variabilei in și de ce a fost utilizată.

Laborator SIAD Lucrarea nr.12
214
12 Sistem de blocare acces al unui utilizator aspra site -ului,
sistem de contorizare a click -urilor pe un link
12.1 Obiective
• Realizarea a două pagini în php, index și admin cu următoarea str uctură:
• admin.php:
o utilizator sau adresa IP (tip text, not null, între 2 și 255 caractere) ; o
motiv (tip text, not null, între 2 și 255 caractere);
• realizarea unei pagini php în care să se contorizeze clck -urile efectuate pe un link
din pagină.

12.2 Partea I – blocare accces
Baza de date pe care o vom folosi în această lucrare a fost folosită și în lucrarea
nr. 8 (mysql -2), însa va trebui să mai creăm un tabel. Intrăm în phpMyAdmin, selectam
baza de date cu numele autentificare , apoi creăm o no uă tabelă cu numele acces_interzis
cu 3 coloane si anume:
• id – int(11), not -null, auto_increment ;
• interzis – char(60), not -null;
• motiv – char(255), not -null;

12.2.1 Mod de lucru:
În primul rând, vom crea în baza de date autentificare tabelul acces_ interzis cu
3 cele coloane și cu proprietățile acestora, prezentate mai sus.
Vom crea apoi, în directorul rădăcină al serverului C: \Program Files \EasyPHP
2.0b1 \www directorul numit interzicere .
În acesta vom crea fișierul config.php în care introducem co dul de mai jos (identic
cu celelalte fișiere config.php utilizate în laboratoarele anterioare):

<?php session_start();
set_time_limit(0);
error_reporting(E_ALL)
;

// Informatii baza de date
$AdresaBazaDate = "localhost";
$UtilizatorBazaDate = "roo t";
$ParolaBazaDate = "";
$NumeBazaDate = "autentificare";

$conexiune = mysql_connect ($AdresaBazaDate, $UtilizatorBazaDate,
$ParolaBazaDate) or die("Nu ma pot conecta la MySQL!");
mysql_select_db($NumeBazaDate, $conexiune) or die("Nu gasesc baza de
date!");

Laborator SIAD Lucrarea nr.12
215 function addentities($data){
if(trim($data) != ''){
$data = htmlentities($data, ENT_QUOTES);
return str_replace(' \\', '&#92;', $data);
} else return $data;
} // End addentities() –––––
?>

În continuare se realiz ează fișierul index.php în care se introduce codul de mai
jos, și se vizualizează în browser.
<?php
require_once 'config.php';

$_SESSION['utilizator'] = 'student';
$adresa_ip = $_SERVER['REMOTE_ADDR'];

$cerereSQL = 'SELECT * FROM `acces_interzis` WHERE
interzis="'.$_SESSION['utilizator'].'" OR interzis="'.$adresa_ip.'"';

$rezultat = mysql_query($cerereSQL);
if(mysql_num_rows($rezultat) > 0)
{
while($rand = mysql_fetch_array($rezultat)) {
$motiv = $rand['motiv'];
}
}
if(isset($m otiv)) {
echo 'Acces interzis asupra paginii, motivul: <i>'.$motiv.'</i>';
} else {
echo 'Continutul paginii.<br>
Apasa <a href="admin.php">aici</a> pentru a interzice acces -ul
asupra paginii.';

Observați faptul că la începutul paginii avem se tată sesiunea cu utilizatorul logat
(acum am definit -o manual, normal această sesiune o setați atunci când utilizatorul se
autentifică, pagina index.php fiind una din paginile protejate, prin urmare vom avea
sesiunea cu numele utilizatorului).
Adresa IP a utilizatorului o luăm cu ajutorul variabilei globale $_SERVER,
REMOTE_ADDR .
După ce am obținut utilizatorul sau adresa ip a acestuia, avem comanda SQL care
selectează tot din tabela acces_interzis unde interzis este utilizator ori interzis este adresa
ip.
Dacă returnează rezultate, setăm variabila $motiv , cu valoarea rândului motiv din
baza de date, apoi realizăm o construcție if cu condiția: dacă este setată variabila motiv,
}

?>

Laborator SIAD Lucrarea nr.12
216 înseamnă că au fost găsite rezultate, înseamnă că utilizatorul apare în baza d e date ca fiind
blocat, prin urmare afișăm un mesaj de eroare.
Dacă nu, afișăm conținutul paginii web.
Creați o pagină cu numele admin.php , introduceți codul de mai jos, apoi testați
în browser.

<?php
require_once 'config.php';

if(!isset($_GET[' pag'])) $_GET['pag'] = '';
switch($_GET['pag']) { case '': echo '<form
name="adauga" action="admin.php?pag=verifica"
method="post">
Utilizator sau Adresa IP <br> <input type="text"
name="interzis"><br><br>
Motiv <br> <input type="text" name=" motiv"><br><br>
<input type="submit" name="Adauga" value="Adauga">
</form>';
break; case 'verifica': if (($_POST['interzis'] == '') ||
(strlen($_POST['interzis']) < 2) ||
(strlen($_POST['interzis']) > 255) || ($_POST['motiv'] == '') ||
(strlen( $_POST['motiv']) < 2) || (strlen($_POST['motiv']) > 255))
{
echo 'Completeaza corect campurile. <br>
Vezi daca: ai completat campurile, daca ai scris mai mult de
2 caractere si mai putin de 255<br><br>
Apasa <a href="admin.php">aici</a> pe ntru a te intoarce.';
} else {

$cerereSQL = "INSERT INTO `acces_interzis` (`interzis`, `motiv`)
VALUES ('".addentities($_POST['interzis'])."',
'".addentities($_POST['motiv'])."');";
mysql_query($cerereSQL);

echo 'Am introdus datele i n baza de date. <br>
Apasa <a href="index.php">aici</a> pentru a te intoarce la
pagina principala.';
} break; }
?>

Observați faptul că în case default, case '':,
avem formularul de blocare utilizator sau IP și
o căsuță cu motivul care va apare a tunci când
un utilizator blocat accesează adresa.
A II-a parte, cea cu validarea și înserarea
în baza de date, vă este cunoscută.
Introduceți, spre exemplu, adresa dvs
locală: 127.0.0.1 și un motiv apoi testați în
browser accesând pagina principală index .php .

Laborator SIAD Lucrarea nr.12
217
Descoperiți modalitatea de a înlătura adresa mai sus introdusă, pentru a da acces
utilizatorului la pagina index.php .
12.3 Partea a II -a – contorizare click -uri
Avem nevoie de o bază de date. În acest scop o vom folosi pe aceea care a fost
utilizată în lucrarea cu scripturile de căutare. Vom utiliza celula vizite din baza de date
cautare , tabela intrari .
În directorul rădăcină al serverului web (Apache) vom crea directorul
contorizare , în care vom copia fișierul config.php din directorul contori zare (este
același, deoarece ne conectăm la aceeași bază de date).
Realizăm o pagină cu numele index.php , în care introducem scriptul de mai jos:

<?php
require_once('config.php');

if(!isset($_GET['pag'])) $_GET['pag'] = '';
switch($_GET['pag'])
{ case
'':
$cerereSQL = 'SELECT * FROM `intrari`';
$rezultat = mysql_query($cerereSQL);
while($rand = mysql_fetch_array($rezultat))
{
echo '<a href="index.php?pag=
redirectionare&id='.$rand['id'].'">'.$rand['titlu'].'</a> –
'.$rand['adresa' ].' <font color="blue" size="2">(vizualizari:
'.$rand['vizite'].')</font> <br>
<i>'.$rand['descriere'].'</i> <br><br>'; } break; case
'redirectionare': if (!is_numeric($_GET['id'])) {
echo 'ID nu este numeric, ce incerci sa faci?';
} else {
$cerereSQL = 'SELECT * FROM `intrari` WHERE id="'.$_GET['id'].'"';
$rezultat = mysql_query($cerereSQL);
while($rand = mysql_fetch_array($rezultat))
{ header("Location:
".$rand['adresa']."");
$cerereSQL = 'UPDATE `intrari` SET vizite="'.($rand
['vizite']+1).'" WHERE id="'.$rand['id'].'"';
$rezultat = mysql_query($cerereSQL);
}
}
break; }
?>

Observați că în primul case avem selectarea și afișarea în pagină a tuturor
adreselor introduse din proiectul căutare; mai observați și transferarea prin: <a
Rezultat:

Laborator SIAD Lucrarea nr.12
218 href="index.php?pag=redirectionare&id='.$rand['id'].'"> a id -ului
corespundator fiecărei intrări.
În al II -lea case avem verificarea dacă valoarea trimisă prin $_GET este numerică.
Dacă nu este numerică, afișăm un mesaj de eroare, ia r dacă este, selectăm tot din baza de
date unde id -ul este id -ul trimis prin get.

Redirecționăm utilizatorul către pagina selectata prin metoda header Location.
header("Location: ".$rand['adresa']."");
Apoi updatam vizitele cu +1, unde id -ul este id -ul trimis prin $_GET. Accesați
din nou pagina principală index.php și observați rezultatele:

OBS : php este un limbaj case sensitive, dacă unul din câmpurile din baza de date
are numele scris cu litere mari (de exemplu ID), atunci scriptul index -php de ma i sus
trebuie corectat (să fie scris ID și nu id).

219
Bibliografie

1. http://www.bsdguides.org/guides/freebsd/
2. http://www.cssplaza.com/tutoriale -css/
3. http://www.dplus.ro/resurse.php#ghid
4. http://www.drogorean u.ro/tutorials/index.php
5. http://www.freebsd.org/
6. http://freebsd.ournet.md/docs/system/index.phtml
7. http://www.geocities.com/WallStreet/Floor/7071/jstutor.htm
8. http://www.infodamina.ro/jscript/index.html
9. http://www.itzone.ro/tutoriale.php?categorie_id=9
10. http://jalobean.itim -cj.ro/Cursuri/www.my -sql.go.ro/instalare.htm#mysqll
11. http:// www.linux -magazin.ro/
12. http://www.mcli.dist.maricopa.edu/tut/lessons.html
13. http://www.mydigitallife.info/2006/04/13/installing -web-server -in-freebsd –
60with-apache -22-mysql -50-and-php-5-part-4/
14. www.oriceon.com/tutoriale
15. http://www.supremeweb.org/fusion/news.php
16. http://www.rofug.ro/
17. http://www.tutoriale.far -php.ro/
18. http://www.worklance.com/htmltutorial/
19. The PHP begginers tutorial – Leendert Brouwer, PHP Pocket Reference editia 2 –
O’Reilly, Manual PHP (ro) HTML And XHT ML The Definitive Guide editia 5 –
O’Reilly;
20. Inițiere în PHP & MySQL, Valentin Ivașcu, 06.2005

Cuprins

1. CONCEPTELE INTERNETULUI …………………………………………………………………………………….5
1.1. MODELUL DE REFERIN ȚĂ OSI……………………………………………………………………………………….5
1.2. CLASIFICAREA TEHNOLOGIILOR
INTERNET ……………………………………………………………………..9
1.2.1. Tehnologii Interne t Hardware……………………………………………………………………………………..9
1.2.2. Tehnologii Internet de comunicații………………………………………………………………………… …..10
1.2.3. Tehnologii I nternet Software ……………………………………………………………………………………..12
1.2.4. Tehnologii Internet Dataware……………………………………………………………………………………. 13
2. SERVICI I INTERNET SUB FREE BSD ………………………………………………………………………….14
2.1. ISTORIA ȘI DEZVOLTAREA FREEBSD…………………………………………………………………………….14
2.1.1. FreeBSD 5 — schimbări și dezvoltare…………………………………………………………………………15
2.1.2. FreeBSD 6 și 7………………………………………………………………………………………………… ………16

Tehnologii Internet
220 2.1.3. Compatibilitate cu Linux……………………………………………………………………………………………16
2.1.4. Licență
…………………………………………………………………………………………………………….. …….16
2.1.5. Produse derivate din FreeBSD …………………………………………………………………………………..1 7
2.1.6. TrustedBSD…………………………………………………………………………………………….. ………………17
2.2. CONFIGURAREA UNUI SERVER MULTIFUNCȚIONAL PE BAZA LA FREEBSD………………………….18
2.2.1. Introducere: …………………………………………………………………………………………… …….. ………..18
2.2.2. Instalarea sistemului……………………………………………………………………………………. …………..18
2.2.3. Setarea marșrutizatorului………………………………………………………… ……………………………….19
2.2.4. Mail server…………………………………………………………………………………………….. ……………….20
2.2.4.1. Setarea SMTP ………………………………………. …………………………………………………………………20
2.2.4.2. Configurarea POP3 și IMAP………………………………………………………………………………………2 1
2.2.5. FTP server ………………….. ………………………………………………………………………………………….21
2.2.6. Web server (Apache + PHP) ……………………………………………………………………………….. ……22
2.2.7. Instala rea MySQL…………………………………………………………………………………………………….2 2
3. SERVICII INTERNET SUB WINDOWS…………………………………………………………………………27
3.1. GENERALIT ĂȚI………………………………………………………………………………………………………….27
3.2. CONFIGURAREA WINDOWS 2000 CA SERVER DE DOMENIU ………………………………………………27
3.3.1. Instalare Active Directo ry………………………………………………………………………………………….28
3.3.2. Dezinstalarea serviciului Active Directory…………………………………………………………………..30
3.3. INSTALAREA ȘI CONFIG URAREA UNUI SERVER DE
WEB……………………………………………………30 3.4. CONFIGURAREA SERVERULUI CA UN
GATEWAY ……………………………………………………………..31
4. PROTOCOALE SI SERVICII………………………. ………………………………………………………………..33
4.1. DNS (DOMAIN NAME SERVICE )…………………………………………………………………………………..33
4.1.1. Introducere……………………………… ………………………………………………………………………….
…..33
4.1.2. Instalarea și configurarea serverului BIND
…………………………………………………………………34 4.2. REMOTE LOGIN (SSH, TELNET ) –
SSH…. ……………………………………………………………………..35 4.2.1. Arhitectura lui
SSH…………………………………………………………………………………………………..35
4.3. HTTP – PROTOCOLUL HTTP ………………………………………………………………………………………..37
4.3.1. Modul de funcționare…………………………………………………………………………………………… …..37
4.3.2. Transferul
argumen telor……………………………………………………………………………………………38 4.3.3.
Versiuni……………………………………………………………………………………………………… ……….. …39
4.3.4. Metode ………………………………………………………………………………………………………. …………..39
4.3.5. Serverul Web Apache…………………………………………………………………………… …………………..40
4.3.5.1. Instalare Apache 2.2.2…………………………………………………………………………………………. ……40
4.3.5.2. Instalare MySQL 5.0……………………………………………….. ……………………………………………….41
4.3.6. Instalare PHP 5.1.4 …………………………………………………………………………………….. …………..42
4.4. FTP – PROTOCOLUL FTP …………………………… ………………………………………………………………43
4.4.1. Instalarea și configurarea unui server FTP………………………………………………………………….43
4.5. SMTP – PROTOCOLUL SMTP……………………………… ………………………………………………………45
4.5.1. Funcționare…………………………………………………………………………………………………… ………..45
4.5.2. Realizarea comunicației SMTP – exemplu……….. ………………………………………………………….46
4.6. POP – PROTOCOLUL POP……………………………………………………………………………………………47
4.6.1. Operația de
bază……………………………. ………………………………………………………………………..47 4.6.1.1. Starea
AUTHORIZATION………………………………………………………………………………………..48
4.6.1.2. Starea TRANSACTION……………… …………………………………………………………………………….49
4.6.1.3. Starea UPDATE…………………………………………………………………………………………………. ……51
4.6.2. Concluzii…………. ……………………………………………………………………………………………………..54
4.6.3. protocolul IMAP ………………………………………………………………………………………… ………… …55

221 4.7. PROTOCOALE CRIPTOGRAFICE SSL ȘI TLS…………………………………………………………………….55
4.7.1. Descriere și funcționare……………………………………………………………………………………….. …..55
4.7.2. Aplicații ale
SSL……………………………………………………………………………………………………….56
5. LIMBAJE DE PROGRAMARE ȘI TEHNOLOGII WEB…………………………………………………58
5.1. INTRODUCERE …………………………………………………………………………………………………………..58 5.2.
HTML …………………………………………………………………………………………………. …………………59
5.2.1. Introducere…………………………………………………………………………………………………… …………59
5.2.2. Operatori, cuvinte cheie HTML……………………………………………………. ……………………………60
5.2.3. Fonturi………………………………………………………………………………………………………. …………..61
5.2.4. Blocuri de text……………………………………………………. ……………………………………………………61
5.2.5. Imagini………………………………………………………………………………………………………. …………..63
5.2.6. Legături (Link –
uri)………………….. ………………………………………………………………………………64 5.2.7.
Liste………………………………………………………………………………………………………… ……………..65
5.2.8. Tabele…. …………………………………………………………………………………………………………….. …..67
5.2.9. Ferestre sau cadre în HTML…………………………………………………………………………………… …69
5.2.10.
Formulare…………………………………………………………………………………………………….. ………70
5.3. LIMBAJUL XML……………………………………………………………………………….. ………………………74
5.4.
XHTML………………………………………………………………………………………………………… ………..74
5.5. CSS…………………………………………………………….. ………………………………………………………….74
5.3.1. Introducere în css…………………………………………………………………………………………….. ………74
5.3.2. Sintaxa css……………………………… ……………………………………………………………………………….76
5.3.3. Clasele css…………………………………………………………………………………………………… ………….78
5.3.4. IDurile css…….. ………………………………………………………………………………………………………..79
5.5.5. Utilizarea css în paginile
(X)HTML…………………………………………………………………………….79 5.5.5.1. Divizii
…………………………………………………………………………………………………………….. ……..79
5.5.5.2. Spanul css…………………………………………………………………………. …………………………………….80
5.5.5.3. Marginile css…………………………………………………………………………………………………. ………..80
5.5.5.4. Padding css………………………………………….. ………………………………………………………………….81
5.5.5.5. Fonturi css…………………………………………………………………………………………………… ………….82
5.5.5.6. Ancore, linkuri și pseudo
clase……………………………………………………………………………………83 5.5.5.7. Pseudo Clasele
…………………………………………………………………………………………………………84 5.5.5 .8.
Fundaluri css…………………………………………………………………………………………………. ………..85
5.5.6. Validarea fișierelor CSS …………………………………………………………………….. …………………….85
5.6. AMP –APACHE , MYSQL, PHP……………………………………………………………………………………86
5.7. INTRODUCERE ÎN PHP………………………………………………………………………….. ……………………89
5.7.1. Elemente de bază ……………………………………………………………………………………………… ……..89
5.7.2. Tipuri de date, variabile, constante, operatori ……………………………………. ……………………….89
5.7.3. Structuri de
control…………………………………………………………………………………………………..92 5.7.3.1.
Instrucțiunile If , If -Else și elseif…………………………….. …………………………………………………92 5.7.3.2.
Bucla WHILE ………………………………………………………………………………………………….. ……..93 5.7.3.3.
Instrucțiunea SWITCH…………………. …………………………………………………………………………..93 5.7.3.4.
Instrucțiunea for……………………………………………………………………………………………… ……….93
5.7.3.5. Structura FOREACH . ……………………………………………………………………………………………….94
5.7.3.6. Instrucțiunea BREAK …………………………………………………………………………………………… ….95

Tehnologii Internet
222 Cuprins
5.7.3.7. Instrucțiunea CONTINUE…………………………………………………………………………………………. 95
5.7.3.8. Alte structuri PHP…………………………………………………………………………………………….. ……..96
5.7.4. Lucrul cu formularele …………………………………………………………………………………… ………….96
5.7.4.1. Prelucrarea datelor din formular……………………………………………………… ………………………….96 5.7.4.2.
Verificarea datelor trimise prin formular………………………………………………………………………97 5.8.
INTRODUCERE ÎN MYSQL……………………………………………………… …………………………………..98
5.8.1. Crearea bazelor de date………………………………………………………………………………….. ………100
5.8.2. Utilizarea PHP pentru conectarea la MySQL …………………… ……………………………………….102
5.8.2.1. Comanda SELECT………………………………………………………………………………………………… .103
5.8.2.2. Comanda INSERT …………………………………… …………………………………………………………….104
5.8.2.3. Comanda UPDATE………………………………………………………………………………………………… 105
5.8.2.4. Comanda DELETE …………….. ………………………………………………………………………………….106
5.9. ASP, ASPX(.NET)……………………………………………………………………………………………………107
5.10. JAVASCRIPT ……………………………………………………………………………………………………………107
5.11. AJAX – TEHNOLOGIA AJAX, ………………………………………………………………………………………11 2
6. CREAREA PAGINILOR WEB CU DREAMWEAVER………………………………………………….113
6.1. GENERALIT ĂȚI………………………………………………………………………………………………………..113 6.2.
CREAREA UNUI SIT WEB ……………………………………………………………………………………………114 6.3.
CREAREA PAGINILOR WEB …………………………………………………………………………………………116 6.4.
CREAREA ȘI UTILIZAREA STILURILOR ………………………………………………………………………….118
6.4.1. Realizarea unei foi de stiluri……………………………………………………………………………. ………118

Lucrări de laborator

L1 INSTALAREA ȘI CONFIGURAREA SERVERULUI APACHE, PHP ȘI MYSQL PE
FREEBSD ……………………………………………………………………………………………………… ……………………..121
1.1 OBIECTIVE …………………………………………………………………………………………………………….. 121 1.2
INSTALAREA SI CONFIGURAREA MYSQL………………………………………………………………… ….121
1.2.1 Instalarea MySQL Server 5 din colecția de porturi FreeBSD……………………………………122
1.2.2 Instalarea phpMyAdmin – (nu merge fără PHP) …………………………………………………….123 1.3
INSTALAREA ȘI CO NFIGURAREA APACHE 22…………………………………………………………………123
1.4 INSTALAREA ȘI CONFIGURAREA PHP………………………………………………………………………….124
1.5 VERIFICAREA INSTALĂRII APACHE , PHP ȘI MYSQL , VERIFICAREA /MODIFICAREA FIȘIERELOR
DE CONFIGURARE …………………………………………………………………………………………………………….. ….126
1.5.1 Verificarea serverului Web
Apache………. ………………………………………………………………126 1.5.2 Verificarea funcționării
PHP ……………………………………………………………………………….127
1.5.3 Verificarea funcționării phpMyAdmin….. ……………………………………………………………….127
1.6 INSTALAREA ȘI CONFIGURAREA UNUI SERVER FTP……………………………………………………….128
L2 INSTALAREA ȘI CONFIGURAREA SERVERULUI APACHE, PHP ȘI MYSQL PE
SISTEMUL DE OPERARE WINDOWS…………………………………………………………………………………131
2.1 OBIECTIVE ……………………………………………………………………………………………….. ……………131
2.2 INSTALAREA ȘI CONFIGURAREA EASYPHP-2.0B1…………………………………………………………131 2.3
INSTALAREA APLICA ȚIEI PHPMYADMIN ……………………………………………………………………..133
2.4 PHP DESIGNER 2005………………………………………………………………………………………………..134
2.4.1 Prima pagină HTML ……………………………………………………………………………….. …………134
2.4.2 Prima pagină PHP ……………………………………………………………………………………………..1 35
L3 PRIMII PAȘI ÎN HTML……………………………………………………………………… ………………………..137

223 3.1 OBIECTIVE …………………………………………………………………………………………………………….. 137 3.2
INTRODUCERE …………………………………………………….. ………………………………………………….137
3.3 ELEMENTE CONSTRUCTIVE ………………………………………………………………………………………..138
3.3.1 Blocuri preformatate …………………………. ……………………………………………………………….138
3.3.2 Culoarea de fond………………………………………………………………………………………………. .138
3.3.3 Culoarea textului………….. ……………………………………………………………………………………139
3.3.4 Stiluri pentru blocurile de text………………………………………………………………………………140
3.3.5 Stiluri fizice si logice …………………………………………………………………………………………..141
L4 PRINCIPALELE STRUCTURI ÎN HTML …………………………………………………………………….143
4.1 OBIECTIVE ……………………………………………………………………………………………………………..14 3 4.2
RECAPITULARE …………………………………………………………………………………………………. ……143
4.3 LEGĂTURI – LINK -URI ………………………………………………………………………………………………143
4.3.1 Ancore ………………………………………………………………………………. ……………………………..144
4.4 LISTE…………………………………………………………………………………………………………….. ………145
4.4.1 Liste neordonate…………………………………… ……………………………………………………………145
4.4.2 Liste ordonate………………………………………………………………………………………………… ….145
4.5 TABELE ……………………… ………………………………………………………………………………………….146
4.5.1 Alinierea tabelului……………………………………………………………………………………………. ..147
4.5.2 Definirea culorilor de fond pentru un tabel…………………………………………………………….147
4.5.3 Dimensionarea celulei unui tabel………………………………………………………………………….148
4.5.4 Dimensionarea unui tabel…………………………………………………………………………………….148
4.5.5 Titlul unui tabel ………………………………………………………………………………………….. ……..148
4.5.6 Cap de tabel………………………………………………………………………………………………….. …..148
4.5.7 Celule vide ale unui tabel………………………………………………………… ………………………….149
4.5.8 Atributul " nowrap "…………………………………………………………………………………………… 149
4.5.9 Subblocurile unui tabel……………………………………………….. ………………………………………149
L5 PRIMII PAȘI ÎN PHP…………………………………………………………………………………………….. …….150
5.1 OBIECTIVE ………………………………………….. …………………………………………………………………150 5.2
INTRODUCERE …………………………………………………………………………………………………………150
5.2.1 Sintaxa…………………. …………………………………………………………………………………………..150
5.2.2 Aplicații de început…………………………………………………………………………………………… ..151 5.3
VARIAB ILE SI TIPURI DE DATE ÎN PHP…………………………………………………………………………152
5.3.1 Lucrul cu variabile si tipuri de date ………………………………………………………………………152
5.3.2 Variabile dinamice …………………………………………………………………………………………….. 154 5.4
COD PHP ÎN COD HTML………………………………………………………………………………………….. 154
L6 CONSTRUIREA UNUI SITE ÎN PHP ……………………………………………………………………………156
6.1 OBIECTIVE ………………………………………………………………………………………………… …………..156 6.2
INTRODUCERE …………………………………………………………………………………………………………156 6.3
ELEMENTELE COMPONENTE ………………………………………………………………. ……………………..157
6.3.1 index ……………………………………………………………………………………………………….. ……….157
6.3.2 head ………………………………………………………. …………………………………………………………157
6.3.3 body…………………………………………………………………………………………………………. ………159
6.3.4 Meniurile orizontal și vertica l ………………………………………………………………………………161
6.3.5 Conținut……………………………………………………………………………………………………… …….161
6.3.6 Module …………………………………………………………………………………………………………….. .163
6.3.7 Footer, modulul data și ora……………………………………………………………………………….. ..163 6.4
MOD DE LUCRU ……………………………………………………………………………………………………….165
L7 STILURI CSS ȘI CHESTIONAR ÎN PHP……………………………………………………………….. …….166
7.1 OBIECTIVE …………………………………………………………………………………………………………….. 166
7.2 UTILIZAREA FI ȘIERELOR CSS EXTERNE ………………………………………………….. ……………………166

Tehnologii Internet
224 7.3 CREAREA CHESTIONARELOR ÎN PHP ……………………………………………………………………………168
Cuprins

L8 FORMULAR DE PRELUCRARE A DATELOR DIN BAZA DE DATE MYSQL……………172
8.1 OBIECTIVE …………………………………………………………………………………………………………….. 172
8.2 REALIZAREA BAZEI DE DATE ……………………………………………………………………………….. ……172 8.3
TEMĂ PENTRU ACAS Ă: ……………………………………………………………………………………………..177
L9 SISTEM DE ÎNREGISTRARE, AUTENTIFICARE ȘI PROTECȚIE……………………………..178
9.1 OBIECTIVE …………………………………………………………………………………………………………….. 178
9.2 REALIZAREA BAZEI DE DATE …………………………………………………………………………………… ..178
9.3 SCRIPTUL DE ÎNREGISTRARE ………………………………………………………………………………………179
9.3.1 Explicarea scriptului inregistrare.php …………………………………………………………… ……..182
9.3.2 Exemplu de script de atac: …………………………………………………………………………………..183
9.3.3 Funcții în PHP………………………………………………………………………….. ……………………….184
9.3.4 Exemple de creare funcții:……………………………………………………………………………………184
9.4 SCRIPTUL DE AUTENTIFICARE ……………………………………………….. ………………………………….184
9.5 SCRIPTUL PAGINA UTILIZATOR – PAGINA .PHP ………………………………………………………………186
9.6 SCRIPTUL PROFIL .PHP……………………………………………………….. ……………………………………..186 9.7
SCRIPTUL IESIRE .PHP………………………………………………………………………………………………..191
L10 REALIZAREA UNUI FORMULAR DE CONTACT………………………… ……………………………192
10.1 OBIECTIVE …………………………………………………………………………………………………………….. 192
10.2 MOD DE LUCRU :…………………………………………… …………………………………………………………192
10.2.1 Funcția date();……………………………………………………………………………………………….1 94
10.2.2 Functia mail();……………………. …………………………………………………………………………194
L11 SISTEM DE CĂUTARE ÎN BAZA DE DATE………………………………………………………………..196
11.1 OBIECTIVE …………………………… ………………………………………………………………………………..196
11.2 MOD DE LUCRU :………………………………………………………………………………………………………196
11.2.1 Fișierul a dauga.php………………………………………………………………………………………..197
11.2.2 Fișierul cauta.php…………………………………………………………………………………………..199
L12 SISTEM DE BLOCARE ACCES AL UNUI UTILIZATOR ASPRA SITE -ULUI, SISTEM
DE CONTORIZARE A CLICK -URILOR PE UN LINK ………………………………………………………..203
12.1 OBIECTIVE ………………………………………………………. …………………………………………………….203
12.2 PARTEA I – BLOCARE ACCCES ……………………………………………………………………………………203
12.2.1 Mod de lucru: ……………………………… ………………………………………………………………..203
12.3 PARTEA A II-A – CONTORIZARE CLICK -URI…………………………………………………………………..206
BIBLIOGRAFIE ………………………………… ………………………………………………………………………………..208
CUPRINS………………………………………………………………………………………………………. ……………………..209

Similar Posts