Sunteți pe pagina 1din 52

Metode si Tehnologii Distribuite

(Modul 2, sem 1, 2020-2021)

cod classroom: ​ulrogt4


https://classroom.google.com/c/ODQ0Nzg1MjI2MDNa?cjc=ulrogt4
Pentru a participa la întâlnirea video, dă clic pe acest link:
https://meet.google.com/aij-tudi-dwn

Competente transversale
● Cunoaşterea şi utilizarea noţiunilor fundamentale legate de tehnologiile Web bazate
pe XML.
● Capacitatea de a implemnta fişiere de format XML Capacitatea de a utiliza si
modifica conform cerintelor cu interfeţel grafice cu concepte SOA.
● Capacitatea de a proiecta şi realiza aplicaţii complexe care utilizeaza limbajele de tip
XML pentru serviciile Web.
● Capacitatea de a explica modul de constructie a diferitelor aplicaţii distribuite bazate
pe XML
● Capacitatea de a interpreta rezultatele obtinute.

Obiectivul general al disciplinei


● I​ nsuşirea specificaţiilor limbajului XML.
● Crearea capacităţii de a realiza aplicatii distribuite si/sau paralele.
● Crearea capacităţii de a relationa cunostintele anterioare cu noile cunostinte
dobandite.
● Capacitatea de a crea baze de cunoştinţe în fişiere de tip interschimbabil.

Obiective specifice
● Implementarea aplicaţiilor de interschimb de date şi cunoştinţe.

XML ​(Extended Markup Language)

Planul şi programa cursului

1. Introducere şi bazele XML-ului

● Ce este XML (E​x​tended ​Ma


​ rkup ​L​anguage) şi când se foloseşte?
● Familiarizarea cu noţiunea de criptografie în programare şi criptarea PHP (md5, sha,
base64, rsa)
● Clasa SimpleXML - Parsarea XML-urilor, accesul la elemente şi atribute
● Ce este XPath şi cum se creează interogările XML?
● Spațiile de nume XML şi scrierea XML-urilor în fişiere
● Reprezentarea DOM-ului (Document Object Model) în XML
● Manipularea DOMXpath şi SAX XML

2. Servicii web

● Introducere în servicii web şi familiarizarea cu modalităţile lor de aplicare


● Familiarizarea cu noţiunea de SOAP (Simple Object Access Protocol)
● Crearea serviciilor web SOAP şi RPC
● Ce este REST şi cum se foloseşte la crearea unui serviciu web?

XML (Extended Markup Language)

XML sau Extended Markup Language reprezintă un set standard de reguli folosite
pentru definirea datelor în format electronic, respectiv modul în care vom putea reţine datele
simplu şi repede şi să le trimitem cuiva care, de asemenea, le va înţelege deoarece
foloseşte aceleaşi convenţii. Deşi are un rol foarte important în lumea ​programării​, totuşi
XML-ul se clasifică deseori din greşeală în grupul limbajelor de programare.

Anul 1998 se consideră a fi anul apariţiei XML-ului, însă istoria sa a început încă din
anii ‘60 ai secolului trecut, când compania IBM a construit primul limbaj cu mai multe scopuri
pentru serializarea datelor. Acest limbaj s-a numit GML, apoi prin îmbunătăţirea sa a apărut
mai întâi SGML, apoi şi XML, care este şi tema acestui curs. Prin crearea XML-ului, s-a
îndeplinit scopul principal de a se crea un limbaj care să poată fi citit simultan de oameni şi
de calculator. Având în vedere că numeroase limbaje definite pentru a indica sunt bazate
tocmai pe cunoştinţele XML obţinute în cadrul acestui curs, acestea vă vor permite să
lucraţi şi în RSS, XHTML, Scalable Vector Graphics, MusicXML…

Pe lângă faptul că perfecţionarea şi avansarea în continuare în lumea IT vă vor fi


uşurate semnificativ datorită asimilării competențelor practice din cadrul acestui curs, veţi fi
pregătiţi să vă începeţi imediat cariera de programator. Cunoscând XML şi unul dintre cele
mai populare limbaje de program - PHP, veţi avea toate cele necesare pentru a vă distinge
față de concurenţă şi pentru a vă găsi un loc de muncă foarte bine plătit.

Scopul şi descrierea cursului XML/PHP Programming

În acest curs veţi avea posibilitatea de a cunoaşte bazele XML. Ne vom ocupa de
editarea XML-ului prin diferite tehnologii pentru manipulare, folosind limbajul de ​programare
PHP​. Pe parcursul cursului veţi cunoaşte serviciile web şi controlul lor. Pe lângă asta, veţi fi
pregătiţi să creați singuri servicii web de securitate. Veţi învăţa ce sunt elementele
constructive XML şi cum se manipulează prin limbajul de programare PHP.

Pentru ca tuturor cursanţilor să li se asigure o parcurgere cât mai eficientă, precum şi


participarea la lecţii, cursul este împărţit în două module prin intermediul cărora veţi
cunoaşte pas cu pas competențele necesare. În primul modul, accentul cursului va fi pus pe
introducerea în XML şi prezentarea celor mai noi noţiuni. Următoarele lecţii vor fi dedicate
criptării PHP, respectiv claselor XML, parsării XML-urilor şi accesului la elemente şi atribute.

Vă veţi familiariza cu faptul că limbajul folosit pentru manipularea datelor din


documentele XML este XPath, iar cu această ocazie veţi învăţa şi cum se activează
interogările Xpath. În lecţia care urmează veţi cunoaşte spațiile de nume XML şi veţi afla în
ce situaţii se folosesc.

Ultimele două lecţii din primul modul se vor ocupa de noţiunea de DOM (Document
Object Model) şi de modalitatea de abordare a documentelor XML şi XHTML, respectiv
rezolvarea unui „puzzle” care vă va permite manipularea cu uşurinţă a recomandărilor XPath
prin DOM.

În a doua parte a cursului XML/PHP Programming, accentul va fi pus pe cunoaşterea


detaliată a serviciilor web. În cadrul acestor lecţii veţi cunoaşte conceptul de SOAP (Simple
Object Access Protocol) şi vă veţi ocupa de crearea lor, precum şi cu crearea serviciului web
RPC (​remote procedure call​). În ultima lecţie va fi prezentat conceptul de REST
(Representational State Transfer) şi familiarizarea cu logica completă referitoare la utilizarea
acestei noţiuni la crearea unui serviciu web.

După finalizarea cursului, cunoştinţele obţinute vă vor oferi ocazia de a crea în mod
profesional aplicaţii web complexe, sigure şi funcţionale, precum şi servicii bazate pe XML.
Abilităţile practice asimilate vă vor permite să vă construiţi o carieră de succes în IT şi să
deveniţi un expert calificat în domeniul programării web.

03.12.2020

ne intalnim pe meet la adresa:


https://meet.google.com/vkd-gdqk-ncz

● liniile care urmeaza sunt scrise in command prompt.


● pentru a intra in command prompt trebuie sa mergem cu sageata mousului in partea
st. jos a ecranului pe iconul de START si sa tastam cmd. O sa apara acea fereastra
de culoare neagra in care trebuie sa tastam urmatoarele:

C:\Users\admin-WNDC>cd\

C:\>cd xampp\mysql\bin

C:\xampp\mysql\bin>mysql -p -u root -h localhost


Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.4.14-MariaDB mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> ​show databases;


+-----------------------------+
| Database |
+-----------------------------+
| dass |
| info2 |
| information_schema |
| mysql |
| performance_schema|
| phpmyadmin |
| test |
+-----------------------------+
7 rows in set (0.023 sec)

MariaDB [(none)]> ​use info2;


Database changed
MariaDB [info2]>​ show tables;
+---------------------+
| Tables_in_info2 |
+---------------------+
| dirigi |
| info2db |
+---------------------+
2 rows in set (0.000 sec)

MariaDB [info2]> ​select * from info2db;


+------+--------------------------+-------+-----------------+--------+-------+---------+
| nrc | stud | cls | datan | tw | so | bd |
+------+--------------------------+-------+-----------------+--------+-------+---------+
| 111 | albu ioan | IX B | NULL | NULL | NULL | NULL|
| 112 | popescu aurel | IX B | NULL | NULL | NULL | NULL|
| 121 | bratu andrei | XII A | 2020-10-13 | 5| 7| 6|
| 114 | kifor claudiu | X C | NULL | NULL | NULL | NULL|
| 122 | craioveanu nicolae | XII A | 2020-03-04 | 7| 8| 9|
| 333 | avram nicu | X A | 1995-04-03 | 9| 7| 8|
| 331 | avram petru | XI B | 1994-05-23 | 8| 8| 8|
| 332 | pavel ion | IX A | 1995-04-21 | 4| 5| 5|
| 444 | neagu petru | XII A | 2000-05-04 | 8| 9| 7|
| 444 | neagu petru | XII A | 2000-05-04 | 8| 9| 7|
| 444 | neagu petru | XII A | 2000-05-04 | 8| 9| 7|
+------+-------------------------+-------+-----------------+--------+-------+---------+
11 rows in set (0.042 sec)

MariaDB [info2]>
inserare.php

<?php

//include "conexiune.php";
$conn=mysqli_connect("localhost","root","");
mysqli_select_db($conn,"info2");

$nrc=$_POST['nrc'];
$stud=$_POST['stud'];
$cls=$_POST['cls'];
$datan=$_POST['datan'];
$tw=$_POST['tw'];
$so=$_POST['so'];
$bd=$_POST['bd'];
$query="INSERT INTO info2db (nrc,stud,cls,datan,tw,so,bd)
VALUES('$nrc','$stud','$cls','$datan','$tw','$so','$bd')";
if (!mysqli_query($conn,$query)) {
die(mysqli_error());
} else {
echo "datele au fost introduse";
}
//mysql_close($conexiune);
//include "stud.php";

$sql="SELECT * FROM info2db";


$afisare=mysqli_query($conn,$sql);
echo "<table border=2>";
echo "<tr>
<td>Nrc</td>
<td>Stud</td>
<td>cls</td>
<td>Data nasterii</td>
<td>TW</td>
<td>SO</td>
<td>BD</td>
</tr>";

while ($row=mysqli_fetch_row($afisare)) {
echo "<tr>
<td>$row[0]</td>
<td>$row[1]</td>
<td>$row[2]</td>
<td>$row[3]</td>
<td>$row[4]</td>
<td>$row[5]</td>
<td>$row[6]</td>
</tr>";
}
echo "</table>";

?>

afiseaza.php

<?php
$conn=mysqli_connect("localhost","root","");
mysqli_select_db($conn,"info2");

//$sql="SELECT * FROM info2db";


$sql="SELECT info2db.nrc,info2db.stud,info2db.cls,info2db.datan,info2db.tw,
info2db.so,info2db.bd,dirigi.dirig FROM info2db,dirigi where info2db.cls=dirigi.cls and
dirigi.dirig='bbb'";
$afisare=mysqli_query($conn,$sql);
echo "<table border=2>";
echo "<tr>
<td>Nrc</td>
<td>Stud</td>
<td>cls</td>
<td>Data nasterii</td>
<td>TW</td>
<td>SO</td>
<td>BD</td>
<td>dirig</td>
</tr>";

while ($row=mysqli_fetch_row($afisare)) {
echo "<tr>
<td>$row[0]</td>
<td>$row[1]</td>
<td>$row[2]</td>
<td>$row[3]</td>
<td>$row[4]</td>
<td>$row[5]</td>
<td>$row[6]</td>
<td>$row[7]</td>
</tr>";
}
echo "</table>";
?>
07 Dec 2020​ 16:00-20:00

Pentru a functiona cele doua programe de mai sus va trebui sa creati baza de date ​info2​, sa
creati cele doua tabele (​info2db si ​dirigi​) dupa structurile (​show columns from info2db si
show columns from dirigi​), dupa care trebuie sa populati cele doua tabele cu informatii
aproximativ cu cele din tabelele de mai jos (​select * from info2db​ si​ select * from dirigi​).

1.se lanseaza XAMPP


2.se da START pe butoanele Apache+MySQL

3.Click pe Start (in st ecranului, jos)


4.scriem: cmd
5.o sa apara o fereastra neagra (command prompt)
tot ceea ce o sa scriem in aceasta fereastra, urmeaza in continuare, astfel:

C:\>cd xampp\mysql\bin

C:\xampp\mysql\bin>mysql -p -u root -h localhost


Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.4.14-MariaDB mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use info2


Database changed
MariaDB [info2]> show tables;
+---------------------+
| Tables_in_info2 |
+---------------------+
| dirigi |
| info2db |
+---------------------+
2 rows in set (0.001 sec)
MariaDB [info2]> ​show columns from info2db;
+--------+---------+------+------+----------+--------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------+------+------+----------+--------+
| nrc | int(11) | YES | | NULL | |
| stud | text | YES | | NULL | |
| cls | text | YES | | NULL | |
| datan | date | YES | | NULL | |
| tw | int(11) | YES | | NULL | |
| so | int(11) | YES | | NULL | |
| bd | int(11) | YES | | NULL | |
+--------+---------+------+------+----------+--------+
7 rows in set (0.020 sec)

MariaDB [info2]> ​show columns from dirigi;


+-------+------+------+-------+----------+-----------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-------+----------+-----------+
| cls | text | YES | | NULL | |
| dirig | text | YES | | NULL | |
+-------+------+------+-------+----------+-----------+
2 rows in set (0.024 sec)
MariaDB [info2]> ​select * from info2db;
+------+--------------------------+-------+----------------+--------+---------+--------+
| nrc | stud | cls | datan | tw | so | bd |
+------+--------------------------+-------+----------------+--------+---------+--------+
| 111 | albu ioan | IX B | NULL | NULL | NULL | NULL |
| 112 | popescu aurel | IX B | NULL | NULL | NULL | NULL |
| 121 | bratu andrei | XII A | 2020-10-13 | 5| 7| 6|
| 114 | kifor claudiu | X C | NULL | NULL | NULL | NULL |
| 122 | craioveanu nicolae | XII A | 2020-03-04 | 7| 8| 9|
| 333 | avram nicu | X A | 1995-04-03 | 9| 7| 8|
| 331 | avram petru | XI B | 1994-05-23 | 8| 8| 8|
| 332 | pavel ion | IX A | 1995-04-21 | 4| 5| 5|
| 444 | neagu petru | XII A | 2000-05-04 | 8| 9| 7|
| 444 | neagu petru | XII A | 2000-05-04 | 8| 9| 7|
| 444 | neagu petru | XII A | 2000-05-04 | 8| 9| 7|
| 452 | popescu aurel | XII A | 0000-00-00 | 6| 6| 6|
+------+--------------------------+-------+----------------+--------+---------+--------+
12 rows in set (0.030 sec)
MariaDB [info2]> ​select * from dirigi;
+-------+--------+
| cls | dirig |
+-------+--------+
| IX B | AAA |
| XII A | BBB |
| X A | CCC |
| X C | DDD |
| IX A | EEE |
| XI B | FFF |
+-------+--------+
6 rows in set (0.000 sec)

MariaDB [info2]>
09-10 Dec 2020 16:00 - 20:00
Laborator

Informatii de conectare pe meet:

https://meet.google.com/aac-tftt-bkr

In acest laborator, dupa un scurt istoric, o sa explicam pas cu pas cum si la ce este
bun XML.

XML (Extended Markup Language)

XML sau Extended Markup Language reprezintă un set standard de reguli folosite
pentru definirea datelor în format electronic, respectiv modul în care vom putea reţine datele
simplu şi repede şi să le trimitem cuiva care, de asemenea, le va înţelege deoarece
foloseşte aceleaşi convenţii. Deşi are un rol foarte important în lumea ​programării​, totuşi
XML-ul se clasifică deseori din greşeală în grupul limbajelor de program.

Anul 1998 se consideră a fi anul apariţiei XML-ului, însă istoria sa a început încă din
anii ‘60 ai secolului trecut, când compania IBM a construit primul limbaj cu mai multe scopuri
pentru serializarea datelor. Acest limbaj s-a numit GML, apoi prin îmbunătăţirea sa a apărut
mai întâi SGML, apoi şi XML, care este şi tema acestui curs. Prin crearea XML-ului, s-a
îndeplinit scopul principal de a se crea un limbaj care să poată fi citit simultan de oameni şi
de calculator. Având în vedere că numeroase limbaje definite pentru a indica sunt bazate
tocmai pe cunoştinţele XML obţinute în cadrul acestui curs, acestea vă vor permite să
lucraţi şi în RSS, XHTML, Scalable Vector Graphics, MusicXML...

Pe lângă faptul că perfecţionarea şi avansarea în continuare în lumea IT vă vor fi


uşurate semnificativ datorită asimilării competențelor practice din cadrul acestui curs, veţi fi
pregătiţi să vă începeţi imediat cariera de programator. Cunoscând XML şi unul dintre cele
mai populare limbaje de program - PHP, veţi avea toate cele necesare pentru a vă distinge
față de concurenţă şi pentru a vă găsi un loc de muncă foarte bine plătit.

Scopul şi descrierea cursului XML/PHP Programming

În calitate de beneficiar al acestui curs veţi avea posibilitatea de a cunoaşte bazele


XML. Cursul se va ocupa de editarea XML-ului prin diferite tehnologii pentru manipulare,
folosind limbajul de ​programare PHP​. Pe parcursul cursului veţi cunoaşte serviciile web şi
controlul lor. Pe lângă asta, veţi fi pregătiţi să creați singuri servicii web de securitate. Veţi
învăţa ce sunt elementele constructive XML şi cum se manipulează prin limbajul de
programare PHP.
Pentru ca tuturor cursanţilor să li se asigure o parcurgere cât mai eficientă, precum şi
participarea la lecţii, cursul este împărţit în două module prin intermediul cărora veţi
cunoaşte pas cu pas competențele necesare. În primul modul, accentul cursului va fi pus pe
introducerea în XML şi prezentarea celor mai noi noţiuni. Următoarele lecţii vor fi dedicate
criptării PHP, respectiv claselor XML, parsării XML-urilor şi accesului la elemente şi atribute.

După aceasta veţi afla că limbajul folosit pentru manipularea datelor din documentele
XML este XPath, iar cu această ocazie veţi învăţa şi cum se activează interogările Xpath. În
lecţia care urmează veţi cunoaşte spațiile de nume XML şi veţi afla în ce situaţii se folosesc.

Ultimele două lecţii din primul modul se vor ocupa de noţiunea de DOM (Document
Object Model) şi de modalitatea de abordare a documentelor XML şi XHTML, respectiv
rezolvarea unui „puzzle” care vă va permite manipularea cu uşurinţă a recomandărilor XPath
prin DOM.

În a doua parte a cursului XML/PHP Programming, accentul va fi pus pe cunoaşterea


detaliată a serviciilor web. În cadrul acestor lecţii veţi cunoaşte conceptul de SOAP (Simple
Object Access Protocol) şi vă veţi ocupa de crearea lor, precum şi cu crearea serviciului web
RPC. În ultima lecţie va fi prezentat conceptul de REST (Representational State Transfer) şi
familiarizarea cu logica completă referitoare la utilizarea acestei noţiuni la crearea unui
serviciu web.

După finalizarea cursului, cunoştinţele obţinute vă vor oferi ocazia de a crea în mod
profesional aplicaţii web complexe, sigure şi funcţionale, precum şi servicii bazate pe XML.
Abilităţile practice asimilate vă vor permite să vă construiţi o carieră de succes în IT şi să
deveniţi un expert calificat în domeniul programării web.

Planul şi programa cursului

1. Introducere şi bazele XML-ului

·​ ​Ce este XML (Extended Markup Language) şi când se foloseşte?

·​ ​Familiarizarea cu noţiunea de criptografie în programare şi criptarea PHP (md5,


sha, base64, rsa)

·​ ​Clasa SimpleXML - Parsarea XML-urilor, accesul la elemente şi atribute

·​ ​Ce este XPath şi cum se creează interogările XML?

·​ ​Spațiile de nume XML şi scrierea XML-urilor în fişiere

·​ ​Reprezentarea DOM-ului (Document Object Model) în XML

·​ ​Manipularea DOMXpath şi SAX XML


2. Servicii web

● ​Introducere în servicii web şi familiarizarea cu modalităţile lor de aplicare


● ​Familiarizarea cu noţiunea de SOAP (Simple Object Access Protocol)

● ​Crearea serviciilor web SOAP şi RPC

● Ce este REST şi cum se foloseşte la crearea unui serviciu web?

​Introducere in XML (eXtensible Markup Language)

In cadrul acestui curs/laborator sunt prezentate conceptele de baza ale limbajului XML.

1. Introducere
2. Scurt Istoric
3. Ce este XML?
4. Structura documentelor XML
4.1. Sintaxa unui document XML
4.1.1. Elementele
4.1.2. Atribute
4.1.3. Comentarii
4.1.4. Referinte la entitati
4.1.5. Instructiuni de prelucrare
4.1.6. Sectiuni CDATA
4.1.7. Declaratia tipului de document
4.2. Documente bine formate (Well-Formed Documents)
5. Bibliografie

1. Introducere

Prin date structurate intelegem: foi de calcul, liste de contacte, parametri de


configuratie, tranzactii financiare sau desene tehnice. XML este reprezentat de un set de
reguli (conventii) pentru a crea formate text care permit structurarea datelor. XML nu este un
limbaj de programare si nu trebuie sa fii programator pentru a-l invata si folosi. Cu XML, unui
calculator ii este usor sa genereze si sa citeasca datele, cat si sa se asigure ca structura
datelor este corecta. XML evita problemele obisnuite ale limbajelor de programare, fiind
totodata: extensibil, independent de platforma si suporta internationalizarea si localizarea.
Poate fi spus ca XML este complet compatibil cu​ ​Unicode​.

2. Scurt Istoric

XML (e​X​tensible ​M​arkup ​L​anguage), descendent al SGML (Standard Generalized


Markup Language) este un meta-limbaj utilizat in activitatea de marcare structurala a
documentelor, a cărei specificatie a fost dezvoltata incepand cu 1996 in cadrul Consortiului
World Wide Web (W3C), de un grup de cercetare condus de Jon Bosak de la Sun
Microsystems, la care au aderat ulterior o serie de grupuri de experti din comunitatile
academice (Text Encoding Initiative, NCSA, James Clark) si industriale (SUN, IBM,
Netscape, Oracle, Adobe etc.). Prima versiune de XML a fost standardizata in februarie
1998, ulterior acest standard a mai fost revizuit de doua ori: octombrie 2000 si februarie
2004.

Scopurile proiectate pentru XML sunt:

● XML trebuie sa fie simplu de utilizat pe Internet.


● XML trebuie sa suporte o mare verietate de aplicatii.
● XML trebuie sa fie compatibil cu SGML.
● Trebuie sa fie usor de scris programe ce vor procesa documente XML.
● Numarul facilitatiilor optionale din XML sunt reduse la minimum, ideal, la zero.
● Documentele XML trebuie sa fie citibile de catre utilizatori si clare intr-un mod
rezonabile.
● Designul XML ar trebui sa fie pregatit rapid.
● Designul XML trebuie sa fie formal si concis.
● Documentele XML trebuie sa fie usor de creat.
● Caracterul din marcajele XML sa fie de o importanta minima.

3. Ce este XML?

Documentele XML sunt realizate din unitati de stocare numite entitati, ce contin date
parsate sau neparsate. Datele parsate sunt realizate din caractere, unele dintre ele formand
date caracter iar altele ca marcaje. Marcajele codifica o descriere a schemei de stocare a
documentului si structura logica. XML furnizeaza un mecanism pentru a impune constringeri
asupra schemei de stocare si a structurii logice.

XML a fost elaborat pentru:

● separarea ​sintaxei​ de ​semantica​ pentru a furniza un cadru comun de


structurare a informatiei
● construirea de limbaje de mark-up​ pentru aplicatii din orice domeniu
● structurarea informatiei​ in viitor
● asigurarea independentiei​ de platforma si suport pentru ​internationalizare

Un document XML este un ​arbore ordonat etichetat​:

● date caracter​ - noduri frunza ce contin datele


● noduri ​elemente​ etichetate cu
o​ ​un nume (adesea numit si tipul elementului) si
o​ ​multime de atribute, fiecare din ele avand un nume si o valoare

Acestea pot contine unu sau mai multi copii.


​4. Structura documentelor XML

Un document XML este format din ​marcaje (tag-uri)​ si date caracter.

Cuvantul ​marcaj (markup) a fost folosit initial pentru a descrie anumite adnotari, note
marginale in cadrul unui text cu intentia de a indica tehnoredactorului cum trebuie listat un
anumit pasaj. Generalizand, putem defini marcajul drept orice actiune de a interpreta explicit
o portiune de interpreta explicit o portiune de text.

Un ​marcaj (tag) este un sir de caractere delimitat de caracterele "<" si ">". ​Datele
caracter r​ eprezinta continutul marcajelor.

În XML, marcajele nu sunt folosite pentru afisarea datelor continute, ci au alte scopuri printre
care:

● asigura o sintaxa simpla si standardizata pe care analizoarele XML o pot


folosi pentru a utiliza informatia stocata
● asigura o metoda de a descrie structura ierarhica a continutului prin
impartirea informatiei (datele caracter) in parti numite ​elemente care mai
departe sunt descrise prin ​atribute​. Structura ierarhica a intregului document
este pusa in evidenta prin utilizarea marcajelor.

Un fisier XML cuprinde urmatoarele sectiuni:

1. Prolog
2. Definitia tipului de document (optionala)
3. Elementul radacina

Examplul 1. ​Fisierul ​mail.xml

<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE MAIL SYSTEM "MAIL.DTD">
<MAIL id="10" date="09-12-2020">
<FROM>mircea.neamtu@ulbsibiu.ro</FROM>
<TO>cineva@ulbsibiu.ro</TO>
<SUBJECT>Hello</SUBJECT>
<BODY>
Hello Cineva
</BODY>
</MAIL>
Prologul:

<?xml version="1.0" encoding="UTF-8"?>

Este o instructiune de procesare. Ea informeaza ca urmeaza descrierea unui


fisier XML ce respecta versiunea de specificatie 1.0 iar setul de caractere utilizat este
encodat ​UTF-8

Definitia tipului de document

<!DOCTYPE MAIL SYSTEM "MAIL.DTD">

Precizeaza ca fisierul ​MAIL.DTD contine declaratia tipului de document (DTD-ul),


document ce are ca radacina tag-ul ​MAIL​. Acesta este un set de reguli ce definesc
structura unui fisier XML.

Elementul radacina

<MAIL id="10" date="09-12-2020">


<FROM>mircea.neamtu@ulbsibiu.ro</FROM>
<TO>cineva@ulbsibiu.ro</TO>
<SUBJECT>Hello</SUBJECT>
<BODY>
Hello cineva
</BODY>
</MAIL>

Acesta este elementul radacina al documentului XML.


4.1. Sintaxa unui document XML

Un document XML poate contine urmatoarele tipuri de marcaje:

● Elemente
● Atribute
● Comentarii
● Entitati
● Sectiuni CDATA
● Instructiuni de procesare
● Declaratia tipului de document

4.1.1. Elementele

Elementele sunt blocurile de baza ale unui document XML. Pot fi folosite atat pentru
a retine informatii, cat si pentru definirea structurii. Un element incepe cu un tag de start si
se termina cu corespunzatorul tag de sfarsit:

<nume_tag>1 ........ </nume_tag>2

1-tagul de start

2-tagul de sfarsit

Un element poate fi vid, caz in care nu contine nimic. Sintaxa pentru un element vid
este urmatoarea:

<nume_tag/>

Atentie

● Tag-urile sunt ​case sesitive​, adica: se face distinctia intre litere mari si litere mici.
● Spre exemplu, urmatoarele exemple de taguri sunt distincte (adica, diferite):

<Student>Popescu</STUDENT>

<StudenT>Popescu</student>

Numele unui tag este o sucesiune de caractere alfa-numerice ce ​incepe obligatoriu


cu o litera.​ Astfel <7nume> este eronat.

Elementele sunt utilizate nu numai pentru a retine informatii, ele se utilizeaza si


pentru a defini structura documentului:
Examplul 2. ​biblioteca.xml

<?xml version="1.0"?>
<BIBLIOTECA>
<CARTE>
<TITLU>XML Bible</TITLU>
<AUTOR>Elliotte Rusty Harold</AUTOR>
<EDITURA>IDG Books Worldwide</EDITURA>
<AN_APARITIE>2002</AN_APARITIE>
</CARTE>
</BIBLIOTECA>

In acest exemplu, observam ca elementele:

<TITLU>, <AUTOR>, <EDITURA>, <AN_APARITIE>

contin informatii, in timp ce elementele:

<BIBLIOTECA>, <CARTE>

sunt folosite doar pentru a defini structura datelor. Prin folosirea acestor elemente,
datele sunt mai bine organizate, facilitand eventualele operatii de cautare, afisare sau
sortare a datelor.

4.1.2. Atribute

Atributele au rolul de a descrie elementele. Putem face o analogie intre atribute –


care descriu elemente si adjective – care descriu substantive.

Aici trebuie amintit faptul ca tributele din XML sunt aceleasi cu atributele din HTML.
Spre exemplu, un atribut al elementului <table> ar fi align="center". Atributele sunt localizate
in tag-ul de start al unui element, imediat dupa numele elementului, (acum este evident de
ce nu pot apare spatii albe in numele unui element), sunt urmate de semnul ‘=’, care este
urmat de valoare atributului intre ghilimele. Daca valoarea unui atribut nu este intre ghilimele
va fi semnalata eroare de catre analizorul XML, la fel ca si in cazul in care pentru un atribut
nu ar apare si valoarea acestuia.

Astfel, sintaxa generala este urmatoarea:

<nume_tag ​numeAtribut1​="​valoare1"​ ... ​numeAtributN​="​valoareN​"> . . .

</nume_tag>

Pentru un element pot exista oricate atribute, atat timp cat sunt declarate corect.
Exemplu:

<?xml version="1.0"?>

<BIBLIOTECA>
<CARTE ​cota="12345"​>
<TITLU>XML Bible</TITLU>
<AUTOR>Elliotte Rusty Harold</AUTOR>
<EDITURA> IDG Books Worldwide</EDITURA>
<AN_APARITIE>2002</AN_APARITIE>
</CARTE>
</BIBLIOTECA>

4.1.3. Comentarii

Comentariile sunt secevente de caractere ce pot aparea oriunde in document in afara


altor marcaje ce sunt utilizate pentru a descrie anumite detalii legate de continutul si
structura documentului programatorului. Ele nu fac parte din datele caracter ale
documentului; un procesor XML poate, dar nu este nevoie, sa dea un acces aplicatiilor la
comentarii.

Un comentariu incepe cu secventa <!-- si se incheie cu -->, astfel:

<!-- comentariu -->

Comentariile pot fi oricat de lungi, adica theoretic nu exista limite in ceea ce priveste
lungimea lor. De asemenea, un cometariu nu poate sa contina secventa de caractere --.

Exemplu:

<?xml version="1.0"?>
<!-- Documentul retine cartile dintr-o biblioteca -->
<BIBLIOTECA>
<CARTE cota="12345">
<!-- titlul cartii -->
<TITLU>XML Bible</TITLU>
<!-- Autorul Cartii -->
<AUTOR>Elliotte Rusty Harold</AUTOR>
<!-- Editura in care a aparut cartea -->
<EDITURA> IDG Books Worldwide</EDITURA>
<!-- Anul de aparitie a cartii -->
<AN_APARITIE>2002</AN_APARITIE>
</CARTE>
</BIBLIOTECA>
4.1.4. Referinte la entitati

Referintele la entitati sunt de fapt pointeri catre entitati. În XML, entitatile sunt unitati
de text, unde o unitate poate fi orice, de la un singur caracter la un intreg document sau
chiar o referinta la un alt document.

Sintaxa referintelor la entitati este:

&​nume_entitate;​

‘&’, urmat de numele entitatii, urmat de ‘;’

Una dintre cele mai frecvente utilizari ale referintelor la entitati este atunci cand se
doreste folosirea unor caractere care ar duce la aparitia unor confuzii pentru analizorul XML
si deci care nu ar trebui sa apara in forma lor normala in text. În acest caz exista cinci entitati
predefinite in XML:

Table 1. Entitati definite in XML

Entitate Referinta la entitate

< &lt;

> &gt;

& &amp;

' &apos;

" &quote;

În momentul in care analizorul XML intalneste referinta la o entitate in document, el o


va substitui cu datele pe care aceasta le refera si va returna documentul cu inlocuirile facute.

Exemplu:

<TITLE>Tom &amp; Jerry</TITLE>

dupa analizarea textului de catre analizorul XML, va rezulta:

Tom & Jerry

O alta utilizare frecventa a referintelor la entitati este in cazul in care avem in


documentul XML fragmente de text care se repeta. Pentru a nu scrie aceste parti de text de
mai multe ori vom defini o entitate care va avea ca valoare acea parte de text si de fiecare
data cand fragmentul respectiv apare in document vom folosi referinta la entitate.
Prin folosirea referintelor la entitati se vor obtine documente mai scurte si se va
scurta timpul de redactare.

4.1.5. Instructiuni de prelucrare

Instructiunile de prelucrare sunt un tip special de marcaj care contin informatii despre
anumite aplicatii ce urmeaza a fi executate. Sintaxa generala a unei instructiuni de
procesare ar fi urmatoarea:

<?aplicatie instructiune="valoare" ?>

Se incepe cu <?, urmat de numele aplicatiei si de specificarea unor elemente ce tin


de acea aplicatie si se incheie cu ?>. Numele aplicatiei trebuie sa fie diferit de xml sau XML,
sau alte moduri de scriere a acestui cuvant, deoarece cuvintele de acest tip sunt rezervate,
urmand a fi standardizate intr-o versiune ulterioara.

4.1.6. Sectiuni CDATA

Sectiunile CDATA sunt utilizate pentru a include blocuri de text continand caractere
care altfel ar fi recunoscute ca marcaje. Sectiunile CDATA incep cu sirul <![CDATA[ si se
termina cu sirul ]]>.

Sectiunile CDATA sunt folosite in general atunci cand dorim ca datele incluse in
interiorul lor sa nu fie interpretate de catre analizor, ci sa fie considerate date caracter. Astfel
de situatii se intalnesc cand dorim sa includem caractere ca ‘<’, ‘>’, ‘&’ etc. care ar putea
crea confuzii analizorului XML si folosirea lor ar putea duce chiar la generarea de erori sau
cand dorim sa includem marcaje care sa fie considerate drept date caracter si sa fie expuse
utilizatorului ca atare. Spre exemplificare, consideram un fragment de document XML care
contine informatii despre cum se poate crea un tabel in HTML:

<?xml version="1.0" encoding="UTF-8"?>

<exemplu>

Un exemplu de creare a unui tabel in HTML:

<![CDATA[
<table align=”center”>
<tr>
<td>Coloana 1</td>
<td>Coloana 2</td>
</tr>
</table>
]]​>;
</exemplu>
Folosind sectiunea CDATA, analizorul va ignora continutul acesteia si datele vor fi
expuse utilizatorului exact in forma in care sunt, si datele nu vor fi interpretate drept marcaje,
ci drept date caracter.

O restrictie de sintaxa este faptul ca in interiorul sectiunilor CDATA nu poate sa


apara sirul ']]'. Înca un lucru de retinut este ca sectiunile CDATA nu pot fi incluse unele in
altele.

4.1.7. Declaratia tipului de document

Declaratia tipului de document e ​ ste un marcaj special ce poate fi inclus in


documentele XML cu rolul de a specifica existenta si locatia ​definitiei tipului de document
(DTD –Document Type Definition). Trebuie sa retinem ca declaratia tipului de document si
definitia tipului de document sunt notiuni diferite.

DTD-ul este un set de reguli care definesc structura unui document XML, spre
deosebire de declaratia tipului de document care are rolul de a “spune” analizorului ce DTD
trebuie sa foloseasca pentru verificare si validare.

Sintaxa declaratiei tipului de document difera in functie de tipul DTD-ului: intern sau
extern. Considerand ca avem un document XML numit doc.xml, modul de asociere dintre
structura sa si setul de reguli specificate in reguli.dtd este inserand in documentul XML,
imediat dupa declaratia XML, urmatoarea declaratie a tipului de document:

<!DOCTYPE root SYSTEM "reguli.dtd">

unde ‘root’ este elementul radacina al documentului XML, iar ‘reguli.dtd’ este numele
DTD-ului asociat documentului.

În cazul in care DTD-ul este intern, declaratia tipului de document va avea


urmatoarea forma:

<!DOCTYPE element_radacina [
<!-- Setul de reguli-->
]>

4.2. Documente bine formate (Well-Formed Documents)

Un document XML este un document bine format daca satisface urmatoarele conditii
sintactice:

● au exact un singur element radacina (root element)


● fiecare element are un tag de inceput si unul de sfarsit
● tag-urile sunt inchise corect, adica nu sunt de forma:


<autor><nume>Elliotte Rusty Harold</autor></nume>


Primul tag deschis trebuie sa fie ultimul care este inchis. Tag-urile trebuie inchise
exact in ordinea inversa a deschiderii lor, altfel va fi semnalata eroare.

● numele atributelor sunt unice in cadrul unui element

Cu alte cuvinte un document XML este bine format daca respecta regulile sintactice
descrise de standardul XML.

Este momentul sa ne intrebam: ​de ce trebuie sa stim XML?

În lume exista o multime de formate de stocare a datelor. Aproape fiecare aplicatie


are propriul format de stocare a datelor. Problemele apar atunci când dorim sa schimbam
date între aceste aplicatii. Pentru acest deziderat trebuie sa realizam programe de conversie
care sa transmita datele de la aplicatie la aplicatie, ceea ce înseamna: timp, resurse si rata
de erori mai mare. Mai mult, sunt cazuri în care datele nu sunt portabile de pe o platforma pe
alta. De aceea, s-a pus problema gasirii unui format comun de stocare a datelor care sa
poata fi recunoscut de cat mai multe limbaje de programare si care sa fie portabil de pe o
platforma pe alta. Astfel, a aparut ideea descrierii datelor cu marcaje. De exemplu, un cont
se descrie astfel:

<CONT>
<NR_CONT>110002222</NR_CONT> <TITULAR>POP ION</TITULAR>
<SOLD>100.000.000</SOLD>
</CONT>

Problema era ca programele care prelucrau aceste date deoarece trebuiau sa stie
sa le citeasca si, deci, sa cunoasca dinainte structura marcajelor. Ideea geniala îi apartine lui
Charles Goldfarb de la IBM, si anume introducerea notiunii tip de document, care descrie
structura pe care trebuia sa o aiba un anumit document XML pentru a fi valid. Programele
care prelucreaza aceste documente stiu dinainte structura lor si le pot analiza si accesa fara
probleme. Deci, raspunsul la întrebarea: "De ce XML?" este: "XML, pentru ca reprezinta un
format standard "international de stocare a datelor", sprijinit de cele mai mari corporatii din
domeniul tehnologiei informatiei, care permite schimbul de date între orice programe de pe
orice platforme."

Adoptarea unui nou limbaj este mult mai simpla atunci când cunoastem alte limbaje
anterioare acestuia, cu care suntem familiarizati. Toti utilizatorii de HTML au posibi;litatea de
a aborda mai usor limbajul XML datorita asemanarilor de forma dintre cele doua. Însa,
asemanarile se opresc aici. Este gresit sa credem ca XML este un urmas al HTML.

Daca HTML-ul este utilizat pentru afisarea datelor, XML-ul este utilizat la descrierea
datelor. In acest context se constata ca XML este mult mai flexibil decât HTML, din simplul
motiv ca utilizatorii isi pot defini noile marcaje pentru o reprezentare cât mai naturala a
datelor din documente.

XML utilizeaza notiunea tip de document cu care se poate valida sau invalida un
document, în timp ce la HTML aceasta notiune "lipseste cu desavârsire". Cu toate acestea,
HTML si XML vor continua sa existe si sa conlucreze, în sensul ca datele vor fi descrise si
stocate utilizând XML si vor fi afisate utilizând HTML.

Cum se utilizeaza XML?

Pentru a întelege cum se utilizeaza XML trebuie inteleasa structura XML.

Una dintre cele mai importante calitati ale XML este posibilitatea de a structura
documentele. Orice document XML include o structura ​logica s​ i o structura ​fizica.​

​ ​Structura ​logica ​a documentelor XML

Structura ​logica ​se aseamana cu un sablon care ne arata ce elemente trebuie sa


includa documentul si în ce ordine. ​Prologul ​este primul element structural într-un document
XML, optional. ​Prologul ​consta din doua componente de baza, de asemenea optionale:
declaratia XML​ si ​declaratia tipului de document.​

Declaratia XML identifica versiunea specificatiei XML cu care documentul va fi în


conformitate (versiunea analizorului care va parcurge documentul XML).

De exemplu, declaratia arata astfel:

<?xml version="1.0"?>

O declaratie XML poate contine de asemenea, specificarea setului de caractere


utilizat în documente.

<?xml version="1.0" encoding="UTF-8" ?>

În acest caz se utilizeaza setul de caractere UTF-8 (este cel mai raspandit dintre
sistemele de calcul fiind definit de tipul de codificare al caracterelor ​- Ex: ​diacriticele românești
sunt codificate în UTF-8 pe 2 sau 3 octeți​). Declaratia tipului de document este alcatuita din
meta-codul care indica regulile gramaticale ale DTD (Document Type Definition) pentru o
anumita clasa de documente. Toate documentele din aceasta clasa, pentru a fi valide,
trebuie sa respecte regulile impuse în definirea tipului de document. Tipul de document
poate, de asemenea, sa fie precizat într-un fisier extern care contine toate partile DTD.
Declaratia tipului de document trebuie sa apara dupa declaratia XML si înaintea elementului
document.

De exemplu:

<?xml version="1.0"?>

<!DOCTYPE Cont SYSTEM "cont.dtd">

Liniile de cod "spun procesorului XML" ca documentul este din clasa Cont si se con-
formeaza regulilor stabilite în fisierul Cont.dtd. Elementul document contine toate datele
dintr-un document XML. Este similar cu drive-ul C: de pe PC. Acest element poate cuprinde
oricâte sub-elemente imbricate.
De exemplu:

<CONT> <NR_CONT>1100022 22</NR_CONT>

<TITULAR>PAP ION</TITULAR>

<SOLD>100.000.000</SOLD> </CONT>

Imbricarea este procesul de includere a unui obiect în interiorul altuia. De exemplu,


un document XML poate contine ca elemente imbricate alte documente. Relatia de imbricare
este de tip parinte/copil.

Structura se poate reprezenta astfel:

<DOCUMENT>
<PARENT>
<CHILD1></CHILD1>
<CHILD2></CHILD2>
</PARENT>
</DOCUMENT>

​Structura ​fizica ​a documentelor XML

Aceasta este compusa din continutul documentului. Unitatile de stocare din


documentul XML se numesc ​entitati s​ i pot fi parte a documentului sau externe acestuia.
Fiecare entitate este identificata unic de un nume si poate fi compusa din cel putin un
caracter ajungând pâna la un fisier extern documentului. Entitatile sunt declarate în prolog si
sunt referite în elementul document. Dupa declarare, o entitate poate fi utilizata oriunde în
document. Prin de- clararea unei entitati se indica procesorului XML, care poate fi stocat în
interiorul acesteia. La referirea unei entitati, procesorul XML regaseste continutul entitatii,
asa cum a fost declarat, si sa îl substituie în document.

Entitatea analizabila, câteodata numita si entitate text, contine date de tip text si
devine parte a documentului XML dupa procesarea acestuia. Entitatea neanalizabila este un
container (fisier) al carui continut poate sau nu sa fie text. Daca este text, atunci acesta nu
este analizabil XML. O entitatea analizabila este scrisa astfel încât sa poata fi citita de
procesorul XML si sa i se extraga continutul. Toate referintele entitatii vor fi înlocuite cu
continutul acesteia. De exemplu, entitatea pentru soldul contului poate fi:

<!ENTITY SC "Soldul Contului">

Referinta entitatii actioneaza ca un marcaj care se va înlocui cu continutul ei. Inse-


rarea unei referinte se face astfel: &nume_entitate;.

De exemplu, referirea entitatii SC arata astfel:

<VSOLD> &SC; 110002222 </VSOLD>


Entitatile parametru au aceleasi reguli ca si entitatile analizabile. La referire, simbolul
&​ se înlocuieste cu simbolul %​.

De multe ori, o entitate neanalizabila este numita si entitate binara, deoarece


continutul sau este de obicei un fisier binar care nu este interpretat direct de procesorul
XML. De asemenea, o entitate neanalizabila poate contine text. De exemplu, declararea
unei entitati neanalizabile poate fi:

<!ENTITY ImagineaMea SYSTEM "Ima- gine.gif" NDATA GIF>.

Declararea entitatii se citeste: Entitatea ImagineaMea este un fisier binar în notatia


GIF. Notatia GIF indica procesorului XML care utilitar sa foloseasca pentru afisarea imaginii.
În cazul nostru, notatia este:

<!NOTATION GIF SYSTEM "\Utils\ Gifview.exe">

În XML, anumite caractere sunt utilizate pentru marcajele din document. De exemplu,
parantezele unghiulare (​<>​) si slash-ul (​/​) sunt interpretate ca marcaje si nu ca date de tip
caracter. Acestea sunt caracterele rezervate. Daca se doreste utilizarea lor ca si date de tip
caracter trebuie puse în secventa escape.

Spre exemplu, pentru a insera textul <CONT> în document se scrie codul: &lt;CONT&lg;

Lista cu entitatile predefinite contine: &lt; - < (opening angle bracket); &lg; - > (closing
angle bracket); &amp; - & (ampersand); &apos; - ` (apostrophe); &quot; - " (double quotation
mark).

O entitate este interna daca nu exista unitate de stocare fizica distincta de corpul
entitatii. De exemplu:

<!ENTITY SC "Soldul Contului">

O entitate este externa daca unitatea de stocare fizica este distincta fata de corpul
acesteia. Identificatorul unei entitati externe poate fi SYSTEM sau PUBLIC. Identificatorul
SYSTEM furnizeaza un pointer catre locatia continutului entitatii, cum ar fi un URI (Uniform
Resource Identifier). De exemplu:

<!ENTITY MyImg SYSTEM "http:\\ www.nume.com\img\img.gif" NDATA GIF>

Identificatorul PUBLIC, în plus fata de identificatorul SYSTEM, cauta fisierul pe statia locala
si numai daca nu îl gaseste îl cauta si la locatia publica aflata în retea. De exemplu:

<!ENTITY MyImg PUBLIC "-\\Informatii\\Imagini\\standard\\EN"

"http:\\www.nume.com\img\imagine.gif" NDATA GIF>

Cea mai buna modalitate de a întelege DTD (Document Type Definition) este
printr-un exemplu. Mai jos se regaseste continutul fisierului Cont.xml.

<?xml version="1.0"?>
<!DOCTYPE CONT [
<!ELEMENT CONT (NR_CONT, TITULAR, SOLD)>
<!ELEMENT NR_CONT (#PCDATA)>
<!ELEMENT TITULAR (#PCDATA)>
<!ELEMENT SOLD (#PCDATA)>
]>
<CONT>
<NR_CONT>110002222</NR_CONT>
<TITULAR>POP ION</TITULAR>
<SOLD>100.000.000</SOLD>
</CONT>

Se observa ca documentul are doua parti, prima pentru definirea regulilor


gramaticale ale DTD, iar a doua pentru implementarea unui element care respecta aceste
reguli. Exista doua dezavantaje majore în utilizarea DTD: regulile nu sunt scrise în XML si,
de asemenea, nu permite declara- rea tuturor tipurilor de date (întregi, date calendaristice
etc.). De aceea, corporatia Microsoft a propus consortiului W3C introducerea schemelor.
Astfel, DTD-ul de mai înainte se transforma în schema:

<Schema ID="CONT">
<Element name = "NR_CONT" type = "string"/>
<Element name = "TITULAR" type = "string"/>
<Element name = "SOLD" type = "string"/>
</Schema>

Unde se poate folosi XML?

Spre exemplu pentru a putea vizualiza datele cu un browser de tip Internet Explorer
5.0, într-un format elegant, se utilizeaza limbajul HTML. În exemplul urmator sunt afisate
datele despre contul stocat în documentul Cont.xml prezentat anterior. În continuare, este
prezentat fisierului Cont.htm, care contine codul care realizeaza efectiv afisarea datelor în
browser.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">


<HTML>
<HEAD>
<COMMENT> Functia care trateaza mesajul raspunzator de încarcarea documentului
Cont.xml este loadDoc().
</COMMENT>
<SCRIPT LANGUAGE = "JavaScript" FOR = window EVENT = onload> loadDoc()
</SCRIPT>
<COMMENT>
În scripul Java de mai jos se declara si se aloca un obiect ActiveX de tip
microsoft.xmldom. Cu ajutorul obiectului se încarca documentul Cont.xml. Daca s-a reusit
deschiderea cu succes se lanseaza functia start() care parcurge arborele care stocheaza
elementul document.

CONT

|-- NR_CONT = 110002222


|-- TITULAR = POP ION
|-- SOLD = 100.000.000
</COMMENT>
<SCRIPT LANGUAGE = "JavaScript">
var xmlDoc = new ActiveXObject ("micro - soft.xmldom");
xmlDoc.load("Cont.xml");
function loadDoc() {
if (xmlDoc.readyState == "4") start();
else window.setTimeout("loadDoc()", 4000);
}
function start() {
/*se pastreaza radacina arborelui*/
var rootElem = xmlDoc.documentElement;
/*se extrage informatia din primul nod copil al radacinii - numarul contului*/
nr_contdata.innerText = rootElem.childNo - des.item(0).text;
/*se extrage informatia din al doilea nod copil al radacinii - titularul*/
titulardata.innerText = rootElem.childNo - des.item(1).text;
/*se extrage informatia din al treilea nod copil al radacinii - soldul*/
solddata.innerText = des.item(2).text;
rootElem.childNo -
}
</SCRIPT> <TITLE>Afisare cont</TITLE>
<H1>Afisare cont</H1>
</HEAD> <BODY>
<DIV ID = "nr_cont" STYLE = "font weight:bold; font-size:16">
<COMMENT>Se afiseaza numarul contului </COMMENT>
Numarul contului: <SPAN ID = "nr_contdata" STYLE = "font-
weight:normal"> </SPAN> </DIV>
<BR> <DIV ID = "titular" STYLE = "font weight:bold; font-size:16">
<COMMENT>Se afiseaza titularul contului </COMMENT>
<COMMENT>Se afiseaza soldul contului </COMMENT>
Soldul contului:
<SPAN ID = "solddata" STYLE = "font-weight:normal"></SPAN>
</DIV>
<BR> </BODY>
</HTML>

Informatii de conectare:

https://meet.google.com/aac-tftt-bkr
Saptamana:
07-10.12.2020

ATENTIE​:

Scopul şi descrierea cursului XML/PHP Programming


Dupa cum am discutat pe meet, deoarece acest curs impune cunostinte de
programare pe Web folosind stocarea informatiilor altfel decat folosind servere de baze de
date folosite ca suport de un limbaj de programare am impartit colectivul de STIA I, (cursul
Metode si Tehnologii Distribuite) in 2 colective si anume:
1. cei care au cunostinte despre programarea pe Web folosind servere de baze de date
distribuite folosind ca suport un limbaj de programare si,
2. cei care nu au facut un astfel de curs si nu au cunostinte in programarea pe Web folosind
servere de baze de date.

Avand in vedere faptul ca acest curs da posibilitatea de a cunoaşte o alta tehnica de


stocare a informatiilor si anume XML ​folosind un limbaj gazda cum ar fi limbajul de
programare PHP, informatiile care urmeaza sunt pentru studentii din categoria a 2-a, adica a
celor care nu au facut un curs de programare pe Web folosind servere de baze de date sau
limbajul de programare PHP..

Pentru  a  discuta  despre  acest  curs,  o  sa  facem  o  mica  recapitulare  a  cunostintelor  pe 
care le-am invatat impreuna la cursul de “Baze de date” si anume: 
● Servere de date (MySQL, MariaDB, ...), 
● Servere de Web (Apache), 
● Aprofundarea limbajului P ​ hP ​(acronim, P ​ e
​ rsonal ​Ho
​ me ​Pa
​ ge - ​H​ypertext ​P​reprocessor​) 
 
mysql -p -u root -h localhost 
use librarie2 

 
conectare.php 
<?php 
$conn=mysqli_connect("localhost", "root", ""); 
mysqli_select_db($conn, "librarie2");   
?> 
 
page_top.php 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2"> 
<title>Librăria mea</title> 
</head> 
<style type="text/css"> 
body, p, td 

font-family: Verdana, Arial, sans-serif; 
font-size: 12px; 

h1 

font-family: "Times New Roman", Times, serif; 
font-size: 18px; 
font-weight: bold; 
color: #336699; 
font-style: italic; 

titlu 

font-family: Verdana, Arial, sans-serif; 
font-size: 14px; 
font-weight: bold; 
color: #0066CC; 

</style>, 
<body bgcolor="#ffffff"> 
<img src="usa.gif"> 
<table> 
<tr> 
 
meniu.php 
<td valign="top" width="125"> 
<div style="width:120px; background-color: #f9f1e7; padding:4px; border: solid #632415 1px"> 
<b>Alege domeniul</b> 
<hr size="1"> 
<?php 
$sql = " SELECT * FROM domenii ORDER BY domeniu ASC "; 
$sursa = mysqli_query($conn, $sql); 
while($row=mysqli_fetch_array($sursa)) 

print '<a href="domeniu.php?id_domeniu='.$row['id_domeniu'].'">'.$row['domeniu'].'</a><br>' 


?> 
</div> 
<div style="width:120px; background-color: #f9f1e7; padding:4px; border: solid #632415 1px"> 
<form action="cautare.php" method="GET">   
<b>Cautare</b><br> 
<input type="text" name="cuvant" size="12"><br> 3 
<input type="submit" value="Cauta"> 
</form> 
</div> 
<br> 
<div style="width:120px; background-color:#F9F1E7; padding:4px; border: solid #632415 1px"> 
<b>Cos</b><br> 
<?php 
$nrCarti=0; 
$totalValoare=0; 
if(isset($_SESSION['titlu'])) 

for($i=0; $i < count($_SESSION['titlu']); $i++) 

$nrCarti = $nrCarti + $_SESSION['nr_buc'][$i]; 

$totalValoare=$totalValoare+$_SESSION['nr_buc'][$i]*$_SESSION['pret'][$i]; 


?> 
Aveti <b><?=$nrCarti?></b> carti in cos, in valoare totala de <b><?=$totalValoare?></b> lei. 
<a href="cos.php">Click aici pentru a vedea continutul cosului</a> 
</div> 
</td> 
 
 
index.php 
 
<?php 
session_start(); 
include ("conectare.php"); 
include ("page_top.php"); 
include ("meniu.php"); 
?> 
<td valign="top"> 
<h1>Prima pagina</h1> 
  
<b>Cele mai noi carti</b> 
<table cellpaddind="5"> 
<tr> 
<?php 
/*in urmatoarea interogare selectăm informaţii despre cele mai noi trei carti şi le afişăm pe 
fiecare intr-o celulă de tabel*/ 
$sql="SELECT id_carte, titlu, autor, pret FROM carti, autori WHERE carti.id_autor = 
autori.id_autor ORDER BY datai DESC LIMIT 0,3"; 
$sursa=mysqli_query($conn, $sql); 
  
while($row=mysqli_fetch_array($sursa)) 

/* deschidem celula tabelului HTML */ 
  print '<td align = "center" style="width: 150px;">' ; 
/*punem şi imaginea copertei dacă există, dacă nu, 
afişăm un layer DIV în care scriem “Fără imagine”*/ 
$adrimag="coperte/".$row['id_carte'].".jpg"; 
/*adresa imagine va fi "c:/coperte/111.jpg" pentru cartea cu id_carte=111, 
"c:/coperte/112.jpg" pentru cartea cu id_carte=112, ... 
functia file_exists returneaza TRUE daca fisierul specificat exista */ 
  if(file_exists($adrimag)) 
  { 
$adrimag="coperte/".$row['id_carte'].".jpg"; 
print '<img src="'.$adrimag.'" width="75" height="100"><br>'; 
  } 
  else 
  { 
  /*dacă nu există fişierul specificat afisăm layerul DIV in care scriem "Fară imagine"*/ 
  print '<div style="width:75px; height:100px; border: 1px black solid; 
  background-color:#cccccc";>Fara imagine</div>'; 
  } 
  /*afisam campurile titlu, autor, pret*/ 
 
print '<b><a href="carte.php?id_carte='.$row['id_carte'].'">'.$row['titlu'].'</a></b><br>  
de <i>'.$row['autor'].'</i><br>  
pret: '.$row['pret'].' lei 
</td>'; 
/*inchidem celula <td> deschisa in while*/ 

/*inchidem tabelul, tragem o linie si rescriem codul pentru cele mai populare cărţi 
modificând doar interogarea SQL */ 
?> 
</tr> 
</table> 
<hr> 
<b>Cele mai populare carti</b> 
<table cellpadding="5"> 
<tr> 
<?php 
/*Cele mai populare cărţi sunt şi cele mai vândute, consultând tabelul cu interogarea */ 
$sqlVanzari = "SELECT id_carte, sum(nr_buc) AS bucatiVandute FROM vanzari GROUP BY   
id_carte ORDER BY bucatiVandute DESC LIMIT 0,3"; 
$resursaVanzari=mysqli_query($conn, $sqlVanzari); 
/* Valorile din acest query sunt trei id_carte din tabelul vânzări care corespund celor mai  
vândute trei cărţi şi numărul total de bucăţi vândute din fiecare. Vom folosi aceste id-uri 
pentru a interoga, cu fiecare din ele, baza de date şi a afla titlul, autorul şi preţul fiecăreia 
dintre ele: */ 
while ($rowVanzari=mysqli_fetch_array($resursaVanzari)) 

$sqlCarte="SELECT id_carte,titlu, autor, pret FROM carti, autori WHERE  
carti.id_autor=autori.id_autor AND id_carte=".$rowVanzari['id_carte']; 
$resursaCarte=mysqli_query($conn, $sqlCarte); 
/* Acum avem toate datele care ne interesează: id_carte (din interogarea $sqlVanzari), 
titlul, numele autorului şi numărul de bucăţi vândute. Să le afişăm: */ 
while ($rowCarte = mysqli_fetch_array($resursaCarte)) 

?> 
<td align = "center" style="width: 150px;"> 
<?php 
  $adrimag="coperte/".$rowCarte['id_carte'].".jpg"; 
  if(file_exists($adrimag)) 
{   
$adrimag="coperte/".$rowCarte['id_carte'].".jpg"; 
print '<img src="'.$adrimag.'" width="75" height="100"><br>'; 
  } 
else 

/*dacă nu există fis specificat afişăm layerul DIV in care scrie "fară imagine"*/ 
  print '<div style="width:75px; height:100px; border: 1px black solid;  
background-color:#cccccc">fara imagine</div>'; 
  } 
print '<b><a href="carte.php?id_carte='.$rowVanzari['id_carte'].'"> 
  '.$rowCarte['titlu'].'</a></b><br> 
  de <i>'.$rowCarte['autor'].'</i><br> 
  pret: '.$rowCarte['pret'].' lei </td>'; 


?> 
</tr> 
</table> 
</td> 
</tr> 
</table> 
<?php 
include("page_bottom.php"); 
?> 

page_bottom.php 

</tr> </table> 
<p align="center"> 
<a href="http://stiinte.ulbsibiu.ro">&copy; U.L.B.S. FACULTATEA de STIINTE</a> 
<a href="index.php">&copy; Home</a> 
</p> 
</body></html> 
14-17 Dec 2020 
https://meet.google.com/khq-jkjs-qqs  
 
adauga_comentariu.php 
 
<?php 
if ($_POST['nume_utilizator'] == "" || 
$_POST['adresa_email'] == "" || 
$_POST['comentariu'] == "") 

print "Trebuie sa completati toate campurile"; 
exit; 

/* Dacă execuţia scriptului a ajuns până aici (adică a trecut cu succes de condiţia de 
mai sus) înseamnă că toate câmpurile au fost completate. 
Aşadar, se conectează la baza de date, prelucrează informaţiile transmise din 
formular şi le introduce în baza de date :*/ 
include("conectare.php"); 
/*folosim din motive de securitate functia strip_tags pentru a elimina tagurile HTML si 
PHP din toate stringurile trimise de utilizator. E bine sa folosim aceasta functie pentru a 
"curata" inputul utilizatorilor de orice cod potential rauvoitor */ 

$nume = strip_tags($_POST['nume_utilizator']); 
$email = strip_tags($_POST['adresa_email']); 
$coment = strip_tags($_POST['comentariu']); 
$sql="INSERT INTO comentarii 
(id_carte, nume_utilizator, adresa_email, comentariu) 
VALUES(".$_POST['id_carte'].",'".$nume."','".$email."','".$coment."')"; 
mysqli_query($conn, $sql); 
/* redirectionam utilizatorul catre pagina cartii la care a adaugat un comentariu */ 
$inapoi="carte.php?id_carte=".$_POST['id_carte']; 
$id_carte=$_POST['id_carte']; 
header("location: $inapoi"); 
?> 
 
carte.php 
 
<?php 
session_start(); 
include("conectare.php"); 
include("page_top.php"); 
include("meniu.php"); 
 
$id_carte=$_GET['id_carte']; 
$sql="SELECT titlu, autor, descriere, pret FROM carti, autori 
WHERE id_carte=".$id_carte." AND carti.id_autor=autori.id_autor"; 
$resursa = mysqli_query($,, conn, $sql); 
/* deoarece interogarea returneaza un singur rand, nu vom folosi while pentru a itera prin 
toate elementele array_ului ci le vom accesa direct */ 
$row = mysqli_fetch_array($resursa); 
?> 
<td valign="top"> 
<table> 
<tr> 
<td valign="top"> 
<?php 
$adrimag="coperte/".$id_carte.".jpg"; 
if (file_exists($adrimag)) 
{  
$adrimag="coperte/".$id_carte.".jpg"; 
print '<img src="'.$adrimag.'" width="75" height="100"><br>'; 
}else{ 
/*daca nu exista fis specificat afisam layerul DIV in care scrie "fara imagine"*/ 
print '<div style="width:75px; height:100px; border: 1px black solid; 
background-color: #cccccc">fara imagine</div>'; 

?> 
</td> 
<td valign="top"> 
<h1><?=$row['titlu']?></h1> 
de: <b><?=$row['autor']?></b> 
<p> <?=$row['descriere']?></p> 
<p>pret: <?=$row['pret']?> lei </p> 
</td> 
</tr> 
</table> 
<form action="cos.php?actiune=adauga" method="POST"> 
<input type="hidden" name="id_carte" value="<?=$id_carte?>"> 
<input type="hidden" name="titlu" value="<?=$row['titlu']?>"> 
<input type="hidden" name="autor" value="<?=$row['autor']?>"> 
<input type="hidden" name="pret" value="<?=$row['pret']?>"> 
<input type="submit" value="Cumpara acum!"> 
</form> 
<p><b>Opiniile cititorilor</b></p> 
<?php 
$sqlComent="SELECT * FROM comentarii WHERE id_carte =" . $id_carte; 
$sursaComent = mysqli_query($conn, $sqlComent); 
while ($row = mysqli_fetch_array($sursaComent)) 

print ' <div style = "width:400px; border:1px solid #ffffff; 
back-ground-color:#F9F1E7; padding:5px"> 
<a href="mailto : ' .$row['adresa_email'] . ' "> ' 
.$row['nume_utilizator'] . '</a><br>' 
.$row['comentariu'] . '</div> '; 

?> 
<br> 
 
<div style="width:400px; border:1px solid #632415; 
back-ground-color:#F9F1E7; adding:5px"> 
<b>Adauga opinia ta</b> 
<hr size="1"> 
<form action="adauga_comentariu.php" method="POST"> 
nume:  <input type="text" name="nume_utilizator"> 
email:  <input type="text" name="adresa_email"><br><br> 
Comentariu: <br> 
<textarea name="comentariu" cols="45"></textarea> 
<br><br> 
<input type="hidden" name="id_carte" value="<?=$id_carte?>"> 
<center><input type ="submit" value="Adauga"></center> 
</form> 
</div> 
</td> 
<?php 
include("page_bottom.php"); 
?> 
 
cautare.php 
 
<?php 
session_start(); 
include("conectare.php"); 
include("page_top.php"); 
include("meniu.php"); 
$cuvant = $_GET['cuvant']; 
?> 
<td valign="top"> 
<h1>Rezultatele căutării</h1> 
<p>Textul căutat: <b><?=$cuvant?></b></p> 
<b>Autori</b>  
<blockquote> 
<?php 
$sql = "SELECT id_autor, autor FROM autori WHERE autor LIKE '%".$cuvant."%'"; 
$resursa = mysqli_query($conn, $sql); 
if(mysqli_num_rows($resursa) ==0)   

print "<i>Nici un rezultat printre autori</i>"; 

while($row = mysqli_fetch_array($resursa))  

$nume_autor = str_replace ($cuvant,"<b>$cuvant</b>", $row['autor']); 
print '<a href="autor.php?id_autor='.$row['id_autor'].'">'.$nume_autor.'</a><br>'; 

?> 
</blockquote> 
 
<b>Titluri</b>  
<blockquote> 
<?php   
$sql = "SELECT id_carte, titlu FROM carti WHERE titlu LIKE '%".$cuvant."%' "; 
$resursa = mysqli_query($conn, $sql);   
if(mysqli_num_rows($resursa) == 0) 

print "<i>Nici un rezultat</i>"; 

while($row = mysqli_fetch_array($resursa))  

$titlu = str_replace ($cuvant,"<b>$cuvant</b>",$row['titlu']); 
print '<a href="carte.php?id_carte'.$row['id_carte'].'">'.$titlu.'</a><br>'; 

?> 
</blockquote> 
<b>Descrieri</b> 
<blockquote> 
<?php 
$sql = "SELECT id_carte,titlu, descriere FROM carti WHERE descriere LIKE 
'%".$cuvant."%'"; 
$resursa = mysqli_query($conn, $sql); 
if(mysqli_num_rows($resursa) == 0)  

print "<i>Nici un rezultat</i>"; 

while($row = mysqli_fetch_array($resursa))  

$descriere = str_replace ($cuvant,"<b>$cuvant</b>", $row['descriere']); 
print '<a href="carte.php?id_carte='.$row['id_carte'].'">'.$row['titlu']. 
'</a><br>'.$descriere.'<br><br>'; 

?> 
</blockquote> 
</td> 
<?php 
include("page_bottom.php"); 
?> 
 
cos.php 
 
<?php 
session_start(); 
include("conectare.php"); 
include("page_top.php"); 
include("meniu.php"); 
$actiune = $_GET['actiune']; 
/* Dacă este setată variabila $_GET[‘actiune’] şi valoarea acesteia este "adaugă", se 
execută următorul cod: */ 
if(isset($_GET['actiune']) && $_GET['actiune'] == "adauga") 

$_SESSION['id_carte'][] = $_POST['id_carte']; 
$_SESSION['nr_buc'][] = 1; 
$_SESSION['pret'][] = $_POST['pret']; 
$_SESSION['titlu'][] = $_POST['titlu']; 
$_SESSION['autor'][] = $_POST['autor']; 

/* Dacă este setată variabila $_GET[‘actiune’] şi valoarea acesteia este „Modifica", se   
execută următorul cod: */ 
if(isset ($_GET['actiune']) && $_GET['actiune'] == "modifica") 

for($i=0; $i<count ($_SESSION['id_carte']); $i++) 

$_SESSION['nr_buc'][$i] = $_POST['noulNrBuc'][$i]; 


?> 
<td valign="top"> 
<h2>Cosul de cumparaturi</h2> 
<form action="cos.php?actiune=modifica" method="POST"> 
<table border="1" cellspacing="0" cellpading="4"> 
<tr bgcolor="#F9F1E7"> 
<td align="center"><b>Nr_buc</b></td> 
<td align="center"><b>Carte </b></td> 
<td align="center"><b>Pret </b></td> 
<td align="center"><b>Total </b></td> 
</tr> 
<?php 
$totalGeneral=0; 
for($i=0; $i<count($_SESSION['id_carte']); $i++) 

if($_SESSION['nr_buc'][$i] !=0) 

/*doar daca numarul de bucati nu este 0, afiseaza randul*/ 
print '<tr> 
<td><input type="text" name="noulNrBuc['.$i.']" size="1" 
value="'.$_SESSION['nr_buc'][$i].'"></td> 
<td><b>'.$_SESSION['titlu'][$i].'</b> de: 
'.$_SESSION['autor'][$i].'</td> 
<td align="right">'.$_SESSION['pret'][$i].' lei</td> 
<td align="right">'.($_SESSION['nr_buc'][$i]*$_SESSION['pret'][$i]).' lei </td> 
</tr>'; 
$totalGeneral= $totalGeneral + ($_SESSION['nr_buc'][$i]*$_SESSION['pret'][$i]); 


//de aici in jos trebuie pus in cos.php 
//afisam totalul general 
print '<tr> 
<td align="right" colspan="3"><b>Total in cos</b></td> 
<td align="right"><b>'.$totalGeneral.'</b> lei</td> 
</tr>'; 
?> 
</table> 
<input type="submit" value="Modifica"><br><br> 
Introduceti <b>0</b> pentru cartile pe care doriti sa le scoateti din cos! 
<h2>Continuati</h2> 
<table> 
<tr> 
<td width="200" align="center"><img src="cos.gif"> 
<a href="index.php"> Continua cumparaturile</a></td> 
<td width="200" align="center"><img src="casa.gif"> 
<a href="casa.php">Mergi la casa</a></td> 
</tr> 
</table> 
</td> 
<?php 
include("page_bottom.php"); 
?> 
 
prelucrare.php 
 
<?php 
/*Verificăm dacă numele este completat iar dacă nu e, oprim execuţia scriptului*/ 
if($_POST['nume'] == "") 

print "Trebuie să completaţi numele!<a href="cos.php">înapoi</a>"; 

/*Verificăm dacă adresa e completata iar dacă nu e, oprim execuţia scriptului*/ 
if($_POST['adresa'] == "") 

print "Trebuie să completaţi adresa!<a href="cos.php">înapoi</a>"; 

 
/* Reiniţializăm sesiunea deoarece dorim să verificăm numărul de cărţi comandate */ 
session_start(); 
/*numărul de cărţi comandate îl aflăm folosind array.sum.array_sum($array} returnează suma 
valorilor dintr-un array dacă acestea sunt numerice. Astfel, dacă $a = array[‘1’,’1’,’2’], 
array_sum($a)=4. A nu se confunda array_sum cu count: count($a) = 3 elemente in timp ce 
array_sum($a)=4 calculează suma elementelor.*/ 
 
$nrCarti = array_sum($_SESSION['nr_buc']); 
 
 
 
if($nrCarti = 0) 

print 'Trebuie să cumpăraţi cel puţin o carte! 
<a href="cos.php">înapoi</a>'; 
exit; 

/* în acest moment toate datele sunt verificate, putem să ne conectăm la baza de date pentru a 
le introduce: */ 
 
include('conectare.php'); 
 
/* Introducem întâi datele în tabelul tranzacţii. Deoarece câmpul data din tabel este de tip 
TIMESTAMP, îl putem omite (se va seta singur, cu data curentă) */ 
$sqlTranzactie = "insert into tranzactii (nume_cumparator, adresa_cumparator) 
values('".$_POST['nume']."', '".$_POST['adresa']."')"; 
$resursaTranzactie = mysqli_query($conn, $sqlTranzactie); 
/* Obţinem id_ul acestei înregistrări folosind mysql_insert_id: */ 
$id_tranzactie = mysqli_insert_id(); 
/*  iar  acum  luăm  fiecare  carte  din sesiune şi o introducem în tabelul vânzări. Introducem în tabel 
doar  cărţile  al  căror  număr  de  bucăţi  este  mai  mare  ca  0  (regăsită  în  condiţia  if,  din  cadrul 
structurii for): */ 
for($i=0; $i<count($_SESSION['id_carte']); $i++) 

if($_SESSION['nr_buc'][$i] > 0) 

/* Creăm interogarea */ 
$sqlVanzare = "INSERT INTO vanzari VALUES('".$id_tranzactie."','". 
$_SESSION['id_carte'][$i]."','". 
$_SESSION['nr_buc'][$i]."')"; 
/* şi o rulăm */ 
mysqli_query($conn, $sqlVanzare); 


/* Urmează sa trimitem un email de notificare folosind funcţia m ​ ail​. 
functia m ​ ail f​ oloseşte în principal trei argumente: mail: 
- adresa destinatarului, 
- subiectul mesajului, 
- textul mesajului, dar mai poate prelua unul pentru headere adiţionale; 
*/ 
$emailDestinatar = "unemail@yahoo.com", 
/* schimbaţi adresa cu cea la care doriţi să primiţi mesajele */ 
$subiect = "O nouă comandă!"; 
/* Pentru a compune mesajul ne vom folosi de operatorul ”.=” de concatenare a stringurilor. */ 
$mesaj = "O nouă comandă de la <b>".$_P0ST['nume']."</b><br>"; 
$mesaj .= "Adresa:".$_P0ST['adresa']."<br>"; 
$mesaj .= "Cărţile comandate: <br><br>"; 
$mesaj .= "<table border='1' cellspacing='0' cellpadding='4'>"; 
$totalGeneral =0; 
for ($i=0;$i < count($_SESSION['id_carte']) ; $i++) 

if($_SESSION[‘nr_buc’][$i] > 0)  

$mesaj .= "<tr><td>".$_SESSI0N['titlu'][$i]." ".$_SESSION['autor'] [$i]. 
"</td><td>".$_SESSION['nr_buc'][$i]. "buc</td></tr>"; 
$totalGeneral = $totalGeneral + ($_SESSION['nr_buc'][$i] * $_ SESSION['pret'][$i]); 


$mesaj .= "</table>"; 
$mesaj .= "Total:<b>".$totalGeneral."</b>"; 
/*  putem  pune  diacritice  în  cadrul  unui  string  însă  pentru  ca  browserul  să  le  afişeze  corect  va 
trebui să specificăm în <head> setul de caractere folosit, la fel ca într-un document HTML. 
Punem  headere  adiţionale  pentru  a  trimite  mesajul  în  format  HTML  şi encodingul potrivit pentru 
caractere’ romaneşti: */ 
$headers = "MIME-Version: 1.0\r\nContent-type: text/html; charset=iso-8859-2\r\n"; 
/* conditiile fiind indeplinite putem trimite emailul: */ 
mail($emailDestinatar, $subiect, $mesaj, $headers); 
/* Curăţăm sesiunea deoarece nu mai avem nevoie de datele din ea.*/ 
session_unset() ; 
/* eliminăm toate variabilele asociate acestei sesiuni */ 
session_destroy(); 
/* ştergem sesiunea si în final afişăm utilizatorului pagina cu mesajul de mulţumire: */ 
include("page_top.php"); 
include("meniu.php"); 
?> 
<td valign="top"> 
<h1><Multumim!</h1> 
Va multumim ca aţi cumpărat de la noi! Veţi primi comanda solicitata in cel mai scurt timp. 
</td> 
<?php 
include("page_bottom.php"); 
?> 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ATENTIE​: 
 
Pentru  a  se lucra mai usor in serverul de baze de date, pentru a crea structura tabelelor si 
pentru a le popula cu informatii, aduc aminte urmatoarele: 
 
● se lanseaza in executie XAMPP (MySQL+Apache) 
● dupa care se deschide c ​ ommand prompt​. 
 
informatii din: 
command prompt 
 
C:\Users\admin-WNDC>cd\ 
C:\>cd xampp\mysql\bin 
C:\xampp\mysql\bin>mysql -p -u root -h localhost 
Enter password: 
Welcome to the MariaDB monitor. Commands end with ; or \g. 
Your MariaDB connection id is 8 
Server version: 10.4.14-MariaDB mariadb.org binary distribution 
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 
 
MariaDB [(none)]> ​use librarie2 
Database changed 
MariaDB [librarie2]> show tables;   
+------------------------------+ 
| Tables_in_librarie2 | 
+------------------------------+ 
| admin | 
| autori | 
| carti | 
| comentarii | 
| domenii | 
| tranzactii | 
| vanzari | 
+------------------------------+ 
7 rows in set (0.003 sec) 
 
MariaDB [librarie2]> show columns from admin; 
+----------------------------------------------+---------------------------+-------+-------+------------+---------+ 
| Field | Type | Null | Key | Default | Extra | 
+----------------------------------------------+---------------------------+-------+-------+------------+---------+ 
| admin_nume | text | NO | | | | 
| admin_parola | text | NO | | | | 
| ultimul_comentariu_moderat | int(10) unsigned | NO | |0 | | 
+----------------------------------------------+---------------------------+-------+-------+------------+---------+ 
3 rows in set (0.025 sec) 
 
 
 
MariaDB [librarie2]> show columns from autori; 
+-------------+----------------------------------+-------+-------+------------+-------------------------+ 
| Field | Type | Null | Key | Default | Extra | 
+-------------+----------------------------------+-------+-------+------------+-------------------------+ 
| id_autor | smallint(5) unsigned | NO | PRI | NULL | auto_increment | 
| autor | text | YES | | NULL | | 
+-------------+----------------------------------+-------+-------+------------+-------------------------+ 
2 rows in set (0.022 sec) 
 
MariaDB [librarie2]> show columns from carti; 
+-------------------+--------------------------------------+--------+-------+------------+-------------------------+ 
| Field | Type | Null | Key | Default | Extra | 
+-------------------+--------------------------------------+--------+-------+------------+-------------------------+ 
| id_autor | smallint(6) | NO | |0 | | 
| id_carte | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| titlu | text | YES | | NULL | | 
| descriere | text | YES | | NULL | | 
| pret | mediumint(8) unsigned | YES | | NULL | | 
| datai | date | YES | | NULL | | 
| id_domeniu | text | YES | | NULL | | 
+-------------------+--------------------------------------+--------+-------+------------+-------------------------+ 
7 rows in set (0.018 sec) 
MariaDB [librarie2]> show columns from domenii; 
+-------------------+---------------------------------+--------+------+------------+--------------------------+ 
| Field | Type | Null | Key | Default | Extra | 
+-------------------+---------------------------------+--------+------+------------+--------------------------+ 
| id_domeniu | smallint(5) unsigned | NO | PRI | NULL | auto_increment | 
| domeniu | text | YES | | NULL | | 
+-------------------+---------------------------------+--------+------+------------+--------------------------+ 
2 rows in set (0.022 sec) 
MariaDB [librarie2]> show columns from comentarii; 
+-------------------------+--------------------------------------+--------+-------+------------+-------------------------+ 
| Field | Type | Null | Key | Default | Extra | 
+-------------------------+--------------------------------------+--------+-------+------------+-------------------------+ 
| id_comentariu | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| id_carte | int(10) unsigned | YES | |0 | | 
| nume_utilizator | text | YES | | NULL | | 
| adresa_email | text | YES | | NULL | | 
| comentariu | text | YES | | NULL | | 
+-------------------------+--------------------------------------+--------+-------+------------+-------------------------+ 
5 rows in set (0.029 sec) 
MariaDB [librarie2]> show columns from tranzactii; 
+-------------------------+-----------------------------------+------+-----+------------------+--------------------------------------------------+ 
| Field | Type |Null| Key| Default | Extra | 
+-----------------------------+-------------------------------+------+-----+------------------+--------------------------------------------------+ 
| id_tranz | int(10) unsigned | NO |PRI | NULL | auto_increment | 
| data_tranz | timestamp | NO | | 0000-00-00 | on update urrent_timestamp()| 
| nume_cump | text | NO | | | | 
| adr_cump | text | NO | | | | 
| comanda_onorata | tinyint(3) unsigned | NO | |0 | | 
+-----------------------------+-------------------------------+------+-----+--------------------+------------------------------------------------+ 
5 rows in set (0.025 sec) 
MariaDB [librarie2]> show columns from vanzari; 
+------------+---------------------------+--------+------+------------+--------+ 
| Field | Type | Nul l | Key| Default |Extra | 
+------------+---------------------------+--------+------+------------+--------+ 
| id_tranz | int(10) unsigned | NO | |0 | | 
| id_carte | int(10) unsigned | NO | |0 | | 
| nr_buc | tinyint(4) | NO | |0 | | 
| datav | date | YES | | NULL | | 
+------------+---------------------------+--------+------+------------+--------+ 
4 rows in set (0.031 sec) 
 
MariaDB [librarie2]> select * from domenii; 
+-------------------+--------------+ 
| id_domeniu | domeniu | 
+-------------------+--------------+ 
| 1 | Poezii | 
| 2 | Proza | 
| 3 | Teatru | 
| 5 | Sci-Fi | 
+-------------------+--------------+ 
4 rows in set (0.039 sec) 
 
MariaDB [librarie2]> select * from autori; 
+-------------+----------------------------------+ 
| id_autor | autor | 
+-------------+----------------------------------+ 
| 1 | Eminescu | 
| 2 | Sadoveanu | 
| 3 | William Shakespeare | 
| 4 | Wels | 
| 6 | Mircea Cartarescu | 
+-------------+----------------------------------+ 
5 rows in set (0.000 sec) 
 
 
MariaDB [librarie2]> select * from carti; 
+----------+-----------+---------------------------+-----------------------------------------------------------+----------+-------------------+---+ 
|id_autor|id_carte| titlu | descriere | pret | datai |​id_domeniu​| 
+----------+-----------+---------------------------+-----------------------------------------------------------+----------+-------------------+---+ 
| 3 | 112 | Romeo si julieta | ​cea mai frumoasa poveste de dragoste a tuturor timpurilor ​| 7500 |2004-11-17 | 3 | 
| 1 | 113 | Poezii vol II | Volum de poezii | 35000 | 2004-11-17 | 1 | 
| 1 | 114 | Poezii vol III | | 52400 | 2004-11-17 | 1 | 
| 2 | 115 | Scrieri alese | |120000| 2004-11-17 | 2 | 
| 4 | 111 |Visual FoxPro 6.0| | 25000 | 2004-11-16 | 1| 
| 3 | 116 | Hamlet | | 250 | 2018-01-16 | 3 | 
+----------+-----------+---------------------------+-----------------------------------------------------------+-----------+-------------------+--+ 
6 rows in set (0.000 sec) 
 
 
 
 
Pentru ca aplicatia sa functioneze trebuie sa creem:  

- baza de date ​librarie2 s


​ i  
- cele 7 tabele (​admin, autori, carti, comentarii, domenii, tranzactii, vanzari​), conform 
structurilor de mai sus, descrise pentru fiecare. 
 
Se  vor  popula  cu  informatii  cele  3  tabele:  ​domenii​,  ​autori  ​si  ​carti ​(cu date aproximativ cu 
cele  prezentate  mai  sus).  Daca  aceste  conditii  au  fost  indeplinite  se  poate  lansa  in  browser 
aplicatia noastra, tastand: ​HTTP://localhost/index.php  
 
aplicatia, dupa lansarea in browser, ​ar trebui​ sa arate astfel: 
(​ar trebui​, adica: pot fi diferente minime de aranjare in pagina, de la un browser la altul) 

 
 
 
Daca folosim formularul de culegere date din div-ul urmator (in programul meniu.php): 

<div style="width:120px; background-color: #f9f1e7; padding:4px; border: solid #632415 1px"> 


<form action="cautare.php" method="​GET​">   
<b>Cautare</b><br> 
<input type="text" name="​cuvant​" size="12"><br>  
<input type="submit" value="Cauta"> 
</form> 
</div> 

vreau sa retineti faptul ca, folosind in formularul de culegere date ​method​=”​GET​”, culeasa prin:   

<input type="text" name="​cuvant​" size="12"><br> 

pe bara de stare a browserului va aparea secventa “uli”, adica: 


http://localhost/cautare.php?cuvant=uli     

asa cum se poate vedea in imaginea de mai jos: 

 
prin urmare​, daca avem de completat intr-un formular date importante (ex: user, parola, ...), este 
bine ca in linia: 
<form action="cautare.php" method="​GET​">   

sa folosim ca si method=“POST”, adica: 

<form action="cautare.php" method="​POST​">   


altfel, toti cei care viziteaza si folosesc aplicatia pot afla “userul” si “parola”. 
 
 
domeniu.php 
 
<?php 
session_start(); 
include ("conectare.php"); 
include ("page_top.php"); 
include ("meniu.php"); 
 
$id_domeniu=$_GET['id_domeniu']; 
$sqlNumeDomeniu="SELECT domeniu FROM domenii WHERE id_domeniu =".$id_domeniu; 
$sursaNumeDomeniu = mysqli_query($conn, $sqlNumeDomeniu); 

/*  mysql_query  execută  interogarea  dar  nu  afişează  rezultatul  ci  returnează  o  valoare:  TRUE  dacă 
interogarea a fost efectuată cu succes sau FALSE. dacă aceasta a eşuat.  
Pentru  a  afişa  valori  din  cadrul  resursei  returnate  putem  folosi  mysql_result.  Parametrii  funcţiei 
mysql_result  sunt:  interogarea  ($resursaNumeDomeniu),  rândul  (0,  primul  rând  al  tabelului 
(numerotarea începe de la 0), 1 rândul al doilea al tabelului, etc...) şi numele câmpului ("domeniu");*/ 
$row=mysqli_fetch_array($sursaNumeDomeniu); 
$numeDomeniu = $row['domeniu']; 
?> 
<td valign="top"> 
<h3>Domeniu: <?=$numeDomeniu?></h3> 
<b>Carti din domeniul:<u><i><?=$numeDomeniu?></i></u></b> 
<table cellpadding="5"> 
 
<?php 
$sql="SELECT id_carte, titlu, descriere, pret, autor FROM carti, autori, domenii 
WHERE carti.id_domeniu=domenii.id_domeniu AND 
carti.id_autor=autori.id_autor AND 
domenii.id_domeniu = ".$id_domeniu; 
$sursa = mysqli_query($conn, $sql); 

/*mysql_result  este  greoi  de  folosit  deoarece  suntem  nevoiţi  să  accesăm  fiecare  coloană  a 
fiecărui  rând  în  parte.  Dar,  putem  accesa  resursa  ca  un  array  numeric  cu  ajutorul  functiei 
mysql_fetch_array,  functie  cu  care  putem  accesa  valorile  din  tabelul  returnat  în  interogare 
dintr-un array*/ 
while($row = mysqli_fetch_array($sursa)) 

?> 
<tr> 
<td align = "center" style="width: 150px;"> 
<?php 
$adrimag="coperte/".$row['id_carte'].".jpg"; 
if (file_exists($adrimag)) 

$adrimag="coperte/".$row['id_carte'].".jpg"; 
print '<img src="'.$adrimag.'" width="75" height="100"><br>'; 
}else { 
/*daca nu exista fis specificat afisam layerul DIV in care scrie "fara imagine"*/ 
print '<div style="width:75px; border: 1px black solid; 
background-color:#cccccc">fara imagine</div>'; 

?> 
</td> 
<td> 
<b><a href="carte.php?id_carte=<?=$row['id_carte']?>"><?=$row['titlu']?></a></b><br> 
de: <?=$row['autor']?><br> 
pret: <?=$row['pret']?> lei 
</td> 
</tr> 
<?php 
} // sfirsitul buclei while (cu 25 linii mai sus) 
?> 
</table> 
</td> 
<?php 
include ("page_bottom.php"); 
?>
Explicatii ​despre funtia: s
​ ession_start()​; 
 
Aceasta funtie, este indicat a se aplica exact asa cum se poate vedea in toate 
programele, adica in prima linie: 

<?php 
session_start(); 
….. 
?>   
 
Pentru  ca  informatiile  de sesiune sa poata fi stocate (indiferent de versiunea XAMPP ului 
pe  care  o  descarcam  de  pe  Web,  trebuie  ca  fisierul  ​php.ini  care  este  stocat  in  folderul 
C;/XAMPP/PHP/  sa  arate  ca  in  secventa  de  mai  jos,  secventa  continuta  in  ​php.ini​.  Aceasta 
secventa  o  putem  gasi  deschizand  cu  Notepad  fisierul  ​php.ini​,  iar  din  bara  de  stare  cautam  cu 
find s​ ecventa: ​session.save_path.  
In versiunile superioare aceasta linie este deja completata astfel:. 
session.save_path=​“C ​ :\xampp\tmp” 
Daca  aveti  alte  versiuni  si aceasta linie nu arata asa, atunci trebuie sa o schimbati asa cum arata 
secventa  de  mai  jos.  Daca  nu  doriti  ca  fisierele  de  sesiune  sa  fie  stocate  in  folderul 
“​C:\xampp\tmp” p ​ uteti sa schimbati locatia, adica:  
session.save_path="C:\temp"  
cu conditia ce pe “​C:\​“ sa creati folderul “​temp​“ daca nu exista.   
 
php.ini 
 
…. 
; where MODE is the octal representation of the mode. Note that this 
; does not overwrite the process's umask. 
; http://php.net/session.save-path 
session.save_path="C:\xampp\tmp" 
; Whether to use strict session mode. 
; Strict session mode does not accept an uninitialized session ID, and 
; regenerates the session ID if the browser sends an uninitialized session ID. 
; Strict mode protects applications from session fixation via a session adoption 
; vulnerability. It is disabled by default for maximum compatibility, but 
; enabling it is encouraged. 
; https://wiki.php.net/rfc/strict_sessions 
session.use_strict_mode=0 
…. 
 
 
in  folderul  ​tmp  ​respectiv  ​temp​,  se  vor  stoca  fisierele  care  contin  in  ele  informatiile  culese  prin 
functia s ​ ession_start();   
Numele fisierelor care contin informatii de tip sesiune le este dat de catre sistem si arata aprox 
astfel: 
sess_9dbvsmfgh421b….l63 
- prima parte: “​sess_​“ este informatie comuna caracteristica acestor fisiere de tip sesiune, 
- a doua parte, ex: “​9dbvsmfgh421b….l63​” este o secventa random din 32 de caractere.   
 
Aceste fisiere se creaza de obicei cand se intra in partea de administrare a aplicatiei.  
Ca  si  protectie  a  aplicatiei​,  fata  de  cei  care  ar  putea  sa  intre  prin  frauda  in  acel  server 
(acolo  unde  este  gazduita  aplicatia  si  bineinteles  si  serverul  de  baze  de  date),  sistemul,  din 
calculatorul  caruia  este  gazduit  serverul  de  baze  de  date,  este  programat  in  asa  fel  incat sterge 
fisierele  de  tip sesiune inactive cel tarziu dupa 3 ore. O alta idee ar fi si faptul ca, aplicatiile foarte 
solicitate  in  anumite  momente,  sa  poata  fi eliberate din sistem. Motivele pentru acei care erau in 
astfel  de  aplicatii  si  nu  aveau  miscare  pe  acele  fisiere  pina  la  3  ore  pot  fi  multiple  asa  ca  se 
recurge  la  aceasta  practica  de  a-i  elibera  din  executia  programului,  acesta  (utilizatorul) ne avind 
altceva  de  facut  decat  sa  mai  intre  inca  o  data  in  acea  aplicatie.  Aceasta  i  se  poate  intampla 
chiar  si  userului  cu  drepturi  depline  “​root​”  care  lucreaza  pe  o astfel de aplicatie, sa zicem pina la 
o ora tarzie in noapte, orindu-se din lucru si lasand din neglijenta aplicatia deschisa.  
 
Temele de semestru (Sem I, M2)
Proiecte:
1. Cristian Sande (PhP +XML+BD);
2. Vlad Gheorghiu (PhP + BD);
3. Oana Voda (PhP +BD);
4. Larisa Balaj (PhP + BD);
5. Mihaela Dragomir (PhP +XML+BD);
6. Elena Ionescu (PhP + XML + BD); ​elenacristina.burteaionescu@ulbsibiu.ro 
7. Flori Marian (PhP + XML +BD);
8. Cosmin Negrescu (PhP + BD);
9. Felix Husac (PhP + XML+BD);
10. Mihai Marinescu (PhP + XML+BD);
11. Laurentiu Sendrea (PhP + XML+BD);
12. Petru Iancu (PhP + XML+BD);
Link copiat: Google classroom 17.12.2020
https://docs.google.com/document/d/1V2sHWYuPY1nWp-LmVSK6V41iVAFs9pn_viurrCyN
mX4/edit?usp=sharing
linkul meet-ului de azi:
https://meet.google.com/mat-uzgu-ngy

Exemple de fraze SQL

Enunt: Se da o societate comerciala (DASS) cu profil de activitate repararea de


aparatura informatica (servere, computere personale, imptrimante, dispozitive
mobile, etc). Societatea are in componenta persoane specializate pe domenii.
Pentru fiecare reparatie se intocmeste o fisa pe care se inscriu date despre reparatia
efectuata.​.

​I. Structura tabelelor

Pentru a administra activitatea companiei, proiectam urmatoarea baza de date:

Angajati Reparatii Clienti


id_angajat - autonumber nr_reparatie - autonumber id_client - autonumber
angajat - text data_reparatie - date client - text
adresa - text obiect - text adresa - text
telefon - text an_fabricatie - number telefon - text
data_angajare - date diagnostic - text e_mail - text
specializare - text tarif - number website - text
salariu - number id_angajat - number observatii - text
id_client - number

II. ​Operatii creare, modificare tabele si adaugare de inregistrari

1. Sa se realizeze o fraza SQL pentru crearea tabelei Angajati (mai putin ultimul
camp dintre cele enumerate mai sus)

CREATE TABLE Angajati (id_angajat int(3) auto_increment PRIMARY KEY NOT


NULL, angajat TEXT(50), adresa TEXT(100), telefon TEXT(20), data_ang TEXT,
specializare TEXT(20));

2. Sa se adauge tabelei Angajati ultimul camp (salariu)

​ALTER TABLE Angajati ADD salariu int(4);

Cazul in care modific campul​ data_ang c​ u campul ​data_angajare d


​ e tip​ date.

ALTER TABLE Angajati CHANGE data_ang data_angajare date;


3. Sa se insereze in tabela un angajat nou cu datele:

nume - Popescu Marius


adresa - Str. Revolutiei nr.1
telefon - 0722.77.28.55
data_angajare - 24/01/2001
salariu - 1500
specializare - electronica

INSERT INTO Angajati (angajat, adresa, telefon, data_angajare, salariu,


specializare) VALUES ("Popescu Marius" , "Str. Revolutiei nr.1", "0722.77.28.55",
"2001/01/24", 1500, "electronica");

III. Interogari (selectii) simple

4. Sa se afiseze numele, prenumele si telefoanele angajatilor cu salarii mai mari sau


egale cu 1000, ordonand alfabetic lista rezultata. In lista nu vor aparea angajatii care
nu au telefon.

​SELECTangajat, telefon FROM Angajati WHERE salariu>=1000 AND telefon IS


NOT NULL ORDER BY angajat ASC;

5. Sa se selecteze toate datele despre persoanele angajate intre martie 2002 si mai
2005 iar angajatii au una dintre specializarile “informatica” sau “electronica”.

​SELECT * FROM Angajati WHERE data_angajare BETWEEN "2002/03/01" AND


"2005/05/01" AND specializare IN ("informatica", "electronica") ORDER BY salariu
DESC, data_angajare ASC;

sau

​SELECT * FROM Angajati WHERE (data_angajare >= ’2002/03/01’ AND


data_angajare <= ’2005/04/30’) AND specializare IN (’informatica ’, ’electronica ’)
ORDER BY salar DESC, data_angajare ASC;

6. Sa se afiseze toate reparatiile efectuate in ultimele 10 zile.

SELECT * FROM Reparatii WHERE data_reparatie > curdate()-10;

incercati functiile urmatoare:

SELECT angajat, curdate(), data_angajare,

(curdate()-data_angajare),(curdate()-data_angajare)/365 FROM
angajati;
a se verifica urmatoarele selecturi:

SELECT angajat, (curdate()-data_angajare)/1000 AS vechime FROM Angajati;

+-----------------------+-------------+
| angajat | vechime |
+-----------------------+-------------+
| Popescu Marius | 190.8970 |
| Arom Marcel | 170.4950 |
| Bucurenciu Ilie | 150.8050 |
| Draghici Vasile | 170.0000 |
+-----------------------+-------------+

SELECT angajat, (curdate()-data_angajare)/10000 AS vechime FROM Angajati;

+-----------------------+-------------+
| angajat | vechime |
+-----------------------+-------------+
| Popescu Marius | 19.0897 |
| Arom Marcel | 17.0495 |
| Bucurenciu Ilie | 15.0805 |
| Draghici Vasile | 17.0000 |
+-----------------------+-------------+

SELECT angajat, round((curdate()-data_angajare)/10000) AS vechime FROM


Angajati;

+-----------------------+---------------+
| angajat | vechime |
+-----------------------+---------------+
| Popescu Marius | 19 |
| Arom Marcel | 17 |
| Bucurenciu Ilie | 15 |
| Draghici Vasile | 17 |
+-----------------------+---------------+

7. Sa se selecteze numele si prenumele angajatilor, sa se calculeze vechimea in


munca pentru fiecare angajat (in ani). Intr-un alt camp, calculat si denumit
spor_vechime, sa se afiseze 0 daca vechimea este sub 2 ani si 1 daca vechimea
este peste 2 ani.

​SELECT nume, prenume, (curate()-data_angajare)/365 AS vechime,


IF(vechime<2,0,1) AS spor_vechime FROM Angajati;
​SELECT angajat, IF(round((curdate()-data_angajare)/10000)<=15,"<=15 ani",">15
ani") AS vechime FROM Angajati;

+
​ ------------------------+-----------+
| angajat |vechime |
+------------------------+-----------+
| Popescu Marius | >15 ani |
| Arom Marcel | >15 ani |
| Bucurenciu Ilie |<=15 ani |
| Draghici Vasile | >15 ani |
+------------------------+------------+

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