Documente Academic
Documente Profesional
Documente Cultură
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.
Obiective specifice
● Implementarea aplicaţiilor de interschimb de date şi cunoştinţe.
2. Servicii web
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…
Î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.
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.
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
C:\Users\admin-WNDC>cd\
C:\>cd xampp\mysql\bin
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
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";
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");
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).
C:\>cd xampp\mysql\bin
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [info2]>
09-10 Dec 2020 16:00 - 20:00
Laborator
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 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...
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.
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.
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
2. Scurt Istoric
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.
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:
1. Prolog
2. Definitia tipului de document (optionala)
3. Elementul radacina
Elementul radacina
● 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:
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>
<?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>
<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
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.
</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 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.
&nume_entitate;
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:
< <
> >
& &
' '
" "e;
Exemplu:
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:
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:
<exemplu>
<![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.
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:
unde ‘root’ este elementul radacina al documentului XML, iar ‘reguli.dtd’ este numele
DTD-ului asociat documentului.
<!DOCTYPE element_radacina [
<!-- Setul de reguli-->
]>
Un document XML este un document bine format daca satisface urmatoarele conditii
sintactice:
Cu alte cuvinte un document XML este bine format daca respecta regulile sintactice
descrise de standardul XML.
<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.
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.
<?xml version="1.0"?>
Î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"?>
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:
<TITULAR>PAP ION</TITULAR>
<SOLD>100.000.000</SOLD> </CONT>
<DOCUMENT>
<PARENT>
<CHILD1></CHILD1>
<CHILD2></CHILD2>
</PARENT>
</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:
Î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: <CONT≶
Lista cu entitatile predefinite contine: < - < (opening angle bracket); ≶ - > (closing
angle bracket); & - & (ampersand); ' - ` (apostrophe); " - " (double quotation
mark).
O entitate este interna daca nu exista unitate de stocare fizica distincta de corpul
entitatii. De exemplu:
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:
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:
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>
<Schema ID="CONT">
<Element name = "NR_CONT" type = "string"/>
<Element name = "TITULAR" type = "string"/>
<Element name = "SOLD" type = "string"/>
</Schema>
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.
CONT
Informatii de conectare:
https://meet.google.com/aac-tftt-bkr
Saptamana:
07-10.12.2020
ATENTIE:
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 - Hypertext Preprocessor)
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">© U.L.B.S. FACULTATEA de STIINTE</a>
<a href="index.php">© 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:
Daca folosim formularul de culegere date din div-ul urmator (in programul meniu.php):
vreau sa retineti faptul ca, folosind in formularul de culegere date method=”GET”, culeasa prin:
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">
/* 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
1. Sa se realizeze o fraza SQL pentru crearea tabelei Angajati (mai putin ultimul
camp dintre cele enumerate mai sus)
5. Sa se selecteze toate datele despre persoanele angajate intre martie 2002 si mai
2005 iar angajatii au una dintre specializarile “informatica” sau “electronica”.
sau
(curdate()-data_angajare),(curdate()-data_angajare)/365 FROM
angajati;
a se verifica urmatoarele selecturi:
+-----------------------+-------------+
| angajat | vechime |
+-----------------------+-------------+
| Popescu Marius | 190.8970 |
| Arom Marcel | 170.4950 |
| Bucurenciu Ilie | 150.8050 |
| Draghici Vasile | 170.0000 |
+-----------------------+-------------+
+-----------------------+-------------+
| angajat | vechime |
+-----------------------+-------------+
| Popescu Marius | 19.0897 |
| Arom Marcel | 17.0495 |
| Bucurenciu Ilie | 15.0805 |
| Draghici Vasile | 17.0000 |
+-----------------------+-------------+
+-----------------------+---------------+
| angajat | vechime |
+-----------------------+---------------+
| Popescu Marius | 19 |
| Arom Marcel | 17 |
| Bucurenciu Ilie | 15 |
| Draghici Vasile | 17 |
+-----------------------+---------------+
+
------------------------+-----------+
| angajat |vechime |
+------------------------+-----------+
| Popescu Marius | >15 ani |
| Arom Marcel | >15 ani |
| Bucurenciu Ilie |<=15 ani |
| Draghici Vasile | >15 ani |
+------------------------+------------+