Baze de Date - Gestionarea Cartilor Intr-o Biblioteca

84
Universitatea "Dunărea de jos" Galaţi Facultatea de Ştiinta Calculatoarelor Departamentul de Formare Continuă şi TransferTehnlogic Specializarea: Informatică Aplicată şi Programare Seria A XX-A (Tulcea) Baze de date Gestionarea cărţilor într-o bibliotecă

description

Baze de Date - Gestionarea Cartilor Intr-o Biblioteca

Transcript of Baze de Date - Gestionarea Cartilor Intr-o Biblioteca

Universitatea "Dunărea de jos" GalaţiFacultatea de Ştiinta CalculatoarelorDepartamentul de Formare Continuă şi TransferTehnlogicSpecializarea: Informatică Aplicată şi ProgramareSeria A XX-A (Tulcea)

Baze de dateGestionarea cărţilor într-o

bibliotecă

Coordonator ştiinţific,Şef de lucrări Drd. Ing. Dan

Munteanu

Absolvent,

Galaţi 2012

CUPRINS

1 INTRODUCERE......................................................................................................................................3

1.1 MOTIVAŢIA ALEGERII TEMEI............................................................................................................31.2 CE ESTE BIBLIOTECONOMIA.............................................................................................................3

2 ANALIZA PROBLEMEI........................................................................................................................8

2.1 SISTEME COMERCIALE DISPONIBILE PE INTERNET...........................................................................82.1.1 Google Book Search...................................................................................................................82.1.2 WizBooks© Program specializat pentru gestiunea cărţilor şi clienţilor unei biblioteci............92.1.3 Program, software evidenţa bibliotecă - OBRE SOFT............................................................10

2.2 SISTEME GRATUITE........................................................................................................................112.2.1 OpenBiblio................................................................................................................................112.2.2 Biblioportal (realizat cu fonduri UE, recomandat a fi folosit de intituţii)...............................12

3 SPECIFICAREA CERINŢELOR........................................................................................................14

4 PROIECTAREA SISTEMULUI...........................................................................................................16

4.1 DIAGRAMA BAZEI DE DATE............................................................................................................16

5 IMPLEMENTARE.................................................................................................................................18

5.1 ALEGERE TEHNOLOGII...................................................................................................................185.1.1 Scurtă prezentare HTML..........................................................................................................185.1.2 Scurta prezentare PHP.............................................................................................................215.1.3 Scurta prezentare SQL (Structured Query Language).............................................................24

5.2 IMPLEMENTARE..............................................................................................................................285.3 DESCRIERE FUNCŢIONALITĂŢI ŞI TESTARE.....................................................................................32

5.3.1 Adăugare resursă, autor, cititor, domeniu nou........................................................................325.3.1 Modificare/ştergere resursă, autor, cititor, domeniu...............................................................335.3.1 Căutare.....................................................................................................................................345.3.2 Împrumutare.............................................................................................................................355.3.3 Returnare..................................................................................................................................365.3.4 Vizualizare................................................................................................................................375.3.5 Raport cu cărţile afişate după domenii....................................................................................375.3.6 Raport cu cărţile împrumutate între o perioadă dată..............................................................38

6 INSTALARE...........................................................................................................................................39

6.1 INSTALARE PE UN SERVER WEB.....................................................................................................406.2 INSTALARE LOCALĂ.......................................................................................................................46

7 BIBLIOGRAFIE.....................................................................................................................................48

8 ANEXA 1 LISTE PROGRAME SURSĂ................................................................................................50

2

1 Introducere

Trebuie menţionat faptul că lucrarea de faţă îşi propune înainte de toate să identifice cele mai importante aspecte şi probleme ale biblioteconomiei precum şi descrierea implementării unui sistem informatic(digital) de gestiune a unei biblioteci.

1.1 Motivaţia alegerii temei

Plecând de la dictonul elen: “O bibliotecă este un loc de sănătate pentru spirit.” şi a faptului că sunt profesor de istorie am considerat întodeauna că elevul învaţă fără să-şi dea seama prin citirea unei cărţi.

Biblioteca şcolară constituie un bun câştigat în viaţa şcolii româneşti, astfel încât nimeni nu poate concepe absenţa ei din vreo instituţie de învăţământ. Poate că unii s-ar întreba de ce este neapărat nevoie ca în şcoală să existe o bibliotecă, de vreme ce elevii se pot duce să-şi cumpere cărţile şi din librării ori să şi le achiziţioneze din bibliotecile publice. Într-o bibliotecă şcolară ar trebui să se găsească acele cărţi, fie de beletristică, fie de specialitate, care să reprezinte programa şcolară, dar şi cărţile care să ajute la formarea spirituală a elevilor, iar elevul are nevoie de o atentă îndrumare asupra lecturii sale, pe care nu o poate găsi altundeva decât în cadrul şcolii. 

Cartea are calitatea de neînlocuit de a fi cel mai stimulator instrument de informare pentru gândirea omenească. Cinematografia, radioul, televiziunea, internetul, deşi implică o participare emotivă crescută, sunt forme mult mai pasive – mintal – decât cartea. Cartea presupune o reconstrucţie, un efort, o activitate intelectuală. Cartea dezvoltă intelectul, nu-l sleieşte. Cartea dezvoltă răspunderea personală. Fiecare carte este o luptă, un proiect la sfârşitul căruia se poate spune : am înţeles-o (sau: nu am înţeles-o). Cartea dă acele mari satisfacţii  pe care le dă munca, realizarea palpabilă, acţiunea dusă până la sfârşit. Numărul de cărţi tipărite, difuzate, numărul de cititori ai bibliotecilor continuă să fie indicii primordiali de măsurare a culturii unui popor. Biblioteca este instituţia de cultură prin excelenţă.

Bibliotecile, ca deţinătoare ale tezaurului de cunoştinţe şi ca centre de difuzare ale acestora, sunt verigi ale culturii în orice timp şi societate, continuând să fie şi în epoca contemporană izvoare de cultură. Este cunoscut faptul că de la apariţia televiziunii şi a calculatoarelor, numărul cărţilor în lume nu a scăzut, ci, dimpotrivă, a crescut de aproape patru ori. Aşadar,  în viitor cartea va fi în continuare principalul mijloc de învăţare, de educaţie, de creaţie şi de cercetare.  

1.2 Ce este biblioteconomia

Definitie: Biblioteconomia se preocupă de organizarea, catalogarea, clasificarea şi funcţionarea bibliotecilor, inclusiv orientarea de carte, propaganda de carte, completarea şi organizarea fondului bibliotecilor, conservarea cărţilor.

Cuvântul bibliotecă îşi are originea în limba greacă veche: biblon = carte; théké = dulap, loc de păstrare a cărţilor. Deci bibliotecă înseamnă loc de păstrare a cărţii. Spre sfârşitul Evului Mediu, în concepţia umanistă biblioteca reprezenta triada: loc, dulap, cărţi; ea era un muzeu de carte, un depozit de valori spirituale. Biblioteconomia se preocupă de

3

organizarea, catalogarea, clasificarea şi funcţionarea bibliotecilor, inclusiv orientarea de carte, propaganda de carte, completarea şi organizarea fondului bibliotecilor, conservarea cărţilor.

Definitie: Biblioteca şcolară este o colecţie organizată de documente (cărţi, reviste, ziare, mijloace audio-vizuale etc.) cu caracter enciclopedic şi adecvate nivelului şi profilului şcolii; prin activitatea desfăşurată, biblioteca participă la realizarea scopurilor învăţământului.

Sarcinile bibliotecii şcolare sunt:

1.      să participe la pregătirea elevilor pentru procesul instructiv-educativ şi la formarea culturii generale a acestora;

2.      să dezvolte gustul tuturor elevilor pentru lectura cărţilor cu mare valoare instructivă şi educativă;

3.      să contribuie la formarea şi dezvoltarea la elevi a deprinderilor şi tehnicilor de muncă intelectuală, pregătindu-i pentru un studiu individual eficient;

4.      să dezvolte sentimentul responsabilităţii la elevi, deprinzându-i să mânuiască cu grijă un bun colectiv pe care îl folosesc;

5.      să ajute personalul didactic al şcolii în ridicarea calităţii procesului de învăţământ, asigurând publicaţii de referinţă şi de informare curentă.

 Sarcinile bibliotecarului şcolar:

-          organizează activitatea bibliotecii şi asigură funcţionarea acesteia potrivit normelor legale şi în cadrul orarului stabilit de conducerea unităţii şcolare;

-          răspunde de păstrarea şi securitatea fondurilor de publicaţii;

-          organizează colecţiile bibliotecii potrivit normelor biblioteconomice indicate de M.E.C.T.;

-          se îngrijeşte de completarea judicioasă a colecţiilor de publicaţii, ţinând cont de necesităţile cărora trebuie să le răspundă biblioteca şcolară;

-          ţin la zi documentele de evidenţă a fondurilor de publicaţii şi a activităţilor de bibliotecă şi asigură permanent instrumentele de informare necesare orientării rapide în colecţiile bibliotecii;

-          elaborează planul de muncă şi darea de seamă anuală a bibliotecii şi completează dările de seamă statistice;

-          răspunde operativ şi eficient nevoilor de lectură şi documentare ale cititorilor;

-          desfăşoară, atât singuri, cât şi în colaborare cu cadrele didactice, muncă de propagandă a cărţii, punând la dispoziţia elevilor şi a personalului didactic liste de noutăţi intrate în bibliotecă, bibliografii şi organizând vitrine, expoziţii şi prezentări de cărţi, seri literare etc.;

-          întreprind, în colaborare cu întregul personal didactic, acţiuni de iniţiere a elevilor în tehnicile biblioteconomice, bibliografice şi de studiu;

-          ajută pe elevi, individual, ori de câte ori este nevoie, în folosirea cataloagelor şi a bibliotecii, în consultarea dicţionarelor, enciclopediilor şi, în general, a lucrărilor de

4

referinţă, precum şi în alcătuirea bibliografiilor şi alegerea publicaţiilor necesare pentru lucrări scrise, activităţi în cercuri şcolare, examene;

-          îndrumă lectura elevilor, în colaborare cu toate cadrele didactice, potrivit cerinţelor procesului de instrucţie şi educaţie şi ţinând seama de particularităţile de vârstă, de pregătirea şi de interesele individuale ale acestora;

-          folosesc împrumutul interbibliotecar pentru a procura cititorilor lucrările pe care biblioteca şcolii nu le posedă;

-          îşi perfecţionează pregătirea profesională prin participarea obligatorie la toate instructajele şi cursurile organizate de forurile tutelare, precum şi prin schimburi de experienţă şi studiu individual;

-          folosesc, în toate lucrările legate de tehnica de bibliotecă şi de muncă cu cititorii, ultimele dispoziţii în vigoare, fiind obligaţi să ia cunoştinţă de ele şi să le aplice.

Una dintre secţiunile cele mai importante ale unei biblioteci este serviciul catalogări. Aici se identifică cărţile incomplete, anonime, aici se preţuiesc cărţile rare sau vechi; tot aici se alcătuiesc listele pentru preocuparea de cărţi valoroase şi inexistente în fondul bibliotecii respective. Există două sisteme de catalogare: în registru şi pe fişe mobile. Catalogul trebuie să individualizeze fiecare carte printr-o descriere proprie. Este ceea ce se numeşte fişa de carte (planşa 5). Dacă se alcătuieşte pe fişe mobile, acestea se scriu în aşa fel încât să răspundă cât mai bine cerinţelor cititorului şi bibliografului. Fişa de carte care cuprinde datele bibliografice se alcătuieşte după anumite reguli de catalogare şi sunt înscrise pe fişe de carton de dimensiuni standard internaţional, orânduite după anumite reguli în sertare speciale numite fişiere.

Fişa de carte trebuie să cuprindă: a) autorul (în vedetă sau rubrică), întâi numele şi apoi prenumele. Când o carte are mai mult de trei autori se consideră anonimă şi în acest caz se pun două-trei cuvinte din titlul cărţii, care să servească la clasare; b) titlul lucrării, subtitlul, dacă există, reproducându-se exact după foaia de titlu şi nu după copertă; c) ediţia, volumul, localitatea, editura, anul de tipărire, numărul de pagini, volumele în întregime ale publicaţiei, formatul tipografic, planşe, hărţi, figuri în afara textului, dacă sunt; d) instituţia sau organizaţia sub egida căreia a apărut lucrarea, colecţia din care face parte, cu numărul de ordine pe care-l deţine; e) cota volumului - care arată locul cărţii respective în depozit - se înscrie în stânga fişei, sus, însoţită şi de indicele de clasificare după sistemul zecimal.

După modul de aşezare a fişelor în catalog, există cataloage alfabetice sau nominale, cataloage pe subiecte sau metodice, cataloage sistematice sau analitice, pe ramuri de cunoştinţe după conţinutul lor. Alte tipuri de cataloage ar fi: catalogul general sistematic, catalogul general alfabetic, ambele destinate publicului cititor, cataloage colective, cataloage tematice, cataloage speciale.

În prezent la biblioteci există şi sistemul de catalogare automatizată (Cataloage on-line). Într-o bibliotecă trebuie să existe un minim de cataloage; catalog alfabetic, pe autori şi titluri, catalog pe materii şi catalog topografic (alcătuit după un plan prestabilit, cuprinzând descrierea cărţilor în ordinea locului pe care-l ocupă în rafturi).

Cel mai complet catalog al unei biblioteci este catalogul alfabetic de serviciu care este oglinda cărţilor existente într-o bibliotecă.

5

Necesitatea găsirii şi regăsirii rapide a informaţiilor a determinat importante schimburi în problematica catalogului de bibliotecă. Formele tradiţionale de cataloage pe fişe de carton sunt cele mai frecvent înlocuite în marile biblioteci, cu cataloagele pe microformate sau minicalculator. În general, în aceste biblioteci coexistă cataloagele tradiţionale - mai accesibile publicului - cu cataloagele automatizate total sau parţial. Se discută, chiar la scară internaţională, realizarea unui catalog computerizat care să înglobeze cataloagele vechi, oferind un rapid acces la informaţii.

Bibliotecile şi-au diversificat colecţiile, având la ora actuală, alături de fondurile de carte şi periodice, o serie de alţi purtători de informaţii de natură audio-vizuală: diafilme, diapozitive, discuri şi benzi magnetice (bibliotecile din Capitală şi câteva din ţară posedă un număr important de discuri). Mai mult chiar, în ultimii ani, bibliotecile au început să introducă în fondurile lor şi informaţii bazate pe electronică.

Au fost automatizate în special operaţiile bazate pe catalogare şi împrumut, bibliotecile universitare constituind principalele centre de experimentare a noilor tehnologii.

Încercările de catalogare automată au debutat în anul 1952 la Biblioteca Publică din Los Angeles (cataloagele obţinute prezentând unele neajunsuri), iar cea dintâi bibliografie naţională curentă a fost întocmită cu ajutorul calculatorului în 1966. După aceea, timp de câteva decenii, calculatorul s-a introdus treptat, bibliotecarii dobândind o anume experienţă în mânuirea lui. În deceniile şapte şi opt numărul bibliotecilor care au preluat calculatorul a crescut simţitor, la ora actuală aproximativ toate ţările din lume îl folosesc. (România îl foloseşte din 1976, la Institutul de Petrol şi Gaze din Ploieşti, iar Biblioteca Naţională din Bucureşti, din anul 1979). Prin folosirea  calculatorului, se obţin automat: evidenţa fondurilor, prelucrarea automată a solicitărilor, întocmirea situaţiilor de care are nevoie biblioteca respectivă, urmărirea circulaţiei cărţii, situaţia achiziţiilor, a multiplicărilor, a casărilor, tipăriri de bibliografii etc.

Funcţia de conservare a colecţiilor de publicaţii au avut-o bibliotecile din cele mai vechi timpuri. Din punct de vedere teoretic, această activitate presupune o serie întreagă de metodologii, tehnici de programe administrative menite să asigure păstrarea tuturor fondurilor sale, precum şi a localului şi a mobilierului. Aceste sarcini revin bibliotecarului-conservator care trebuie să anihileze factorii şi cauzele care duc la deteriorarea cărţilor. Deteriorările şi îmbătrânirea colecţiilor de publicaţii se pot grupa în trei categorii, în funcţie de cauzele care le pot determina:

1. Deteriorări mecanice - datorate unei depozitări necorespunzătoare, neglijenţei personalului de bibliotecă, precum şi cititorilor care mânuiesc neglijent cărţile etc.

2. Procese fizico-chimice de deteriorare cauzate de influenţa luminii solare, a temperaturii (prea ridicate sau prea scăzute), a umidităţii, a impurităţilor din atmosferă (praf mai ales).

Materialul suport (hârtie, pergament, piele etc.), va ,,îmbătrân. In urma acţiunii acestor agenţi fizico-chimici, soldându-se cu decolorări, dezagregări, pulverizare.

3. Deteriorări datorate factorilor biologici - mucegaiuri, insecte, animale. De cele mai multe ori aceşti factori acţionează concomitent, rezultatul fiind dezastruos pentru cărţi.

6

Trebuie să se creeze un microclimat special de temperatură, luminozitate, umiditate, care să asigure păstrarea publicaţiilor din colecţiile bibliotecilor.Bibliotecarul - contemporan cu revoluţia informaţională, nu mai poate fi doar un erudit şi un custode, ci el trebuie să fie un element activ în difuzare, a informaţiei şi ,,implantarea ei în rândurile diferitelor categorii de cititori: cercetători, tehnicieni, cadre didactice, studenţi etc.

Cele 1200 de discipline ştiinţifice existente la ora actuală după datele UNESCO şi care, la rândul lor, se amplifică şi se diversifică, nu mai pot fi ,,stăpânite” prin mijloace clasice, respectiv puse la îndemâna cititorilor. În prezent calculatorul a devenit o necesitate în practicarea meseriei de bibliotecar. Într-o serie de probleme, cum ar fi prelucrarea textelor în arabă, greacă, ebraică, latină etc., prelucrarea deosebit de utilă în secţiile de manuscrise ale bibliotecilor, calculatorul aduce reale servicii. Astăzi se apelează frecvent la calculator, nu numai pentru domeniul matematicii, ci şi pentru chestiuni de istorie, geografie, economie, lingvistică, arheologie, demografie, biblioteconomie etc.

Societatea actuală necesită mai mult ca oricând instrumente de informare şi documentare care să difuzeze cunoştinţele cât mai rapid şi cât mai accesibil. De aici necesitatea introducerii în bibliotecă a sistemelor moderne de înmagazinare, prelucrare şi regăsire a informaţiilor. Având în vedere multitudinea şi complexitatea categoriilor de informaţii, a apărut necesitatea creării unor evidenţe centralizate privind fondurile documentare şi apoi asigurându-se transferul informaţional. Spre exemplu, înregistrarea textului pe videodisc va atinge către sfârşitul secolului valori impresionante. Astfel, întregul fond de carte al cunoscutei ,,Library of Congress din Washington va putea fi transpus, pagină cu pagină, pe aproximativ 100 de videodiscuri, ceea ce ar rezolva problemele spaţiului de depozitare, a conservării dubletelor, deoarece uzura discurilor cu lectură laser este neglijabilă. Teletextul şi videotextul sunt alte două procedee informatice care se folosesc la ora actuală mai ales pentru periodice şi pentru documentele fundamentale în informarea ştinţifică de specialitate. Telecopia poate prezenta cercetătorilor nu numai conţinutul semantic al unui document, ci chiar imaginea exactă a documentului respectiv, prin convertirea acestei imagini în date numerice. Această nouă tehnică nu exclude prezenţa în colecţiile bibliotecile a discurilor şi benzilor magnetice, a cărţilor, revistelor şi a manuscriselor.

În prezent statele care deţin cea mai avansată tehnică informatică au şi cea mai mare producţie de carte şi de publicaţii periodice: Anglia, Japonia, au peste 80.000 de exemplare pe an. Cu cele 7.000 de titluri pe an (în 1987) România se situa, raportat la numărul de locuitori, la nivelul ţărilor cu civilizaţie industrială avansată.

Biblioteca, mai mult decât oricare altă instituţie a unei societăţi, traversează timpurile. ,,Biblioteca, această cetate a ideii, mereu prădată şi niciodată cucerită, este în spatele piramidelor şi al Coloseum-ului, sub cercurile lui Arhimede, dincolo de revoluţia lui Copernic şi în simplitatea formulelor lui Newton, în semnalele primului satelit şi în mândria şi frica primilor paşi pe lună, rezultat şi măsură. Nu o bibliotecă anume, ci toate la un loc, pentru că ele reprezintă împreună omenirea gândului înfrigurat şi scormonitor, fiind totodată oglinzile unei lumi aşezată deplin în liniştea comunităţii şi a duratei. Bibliotecile au făcut sensibilă în societate legea fundamentală a conservării materiei. Odată cu ele nimic nu se poate pierde, lumea adună şi cerne mereu, construindu-se destinul.

Bibliotecile au fost şi continuă să fie în epoca contemporană, izvoare de cultură. De la apariţia televiziunii şi a calculatorului numărul cărţilor în lume nu a scăzut, ci,

7

dimpotrivă, a crescut de aproape patru ori. Aşadar, în viitor cartea va fi principalul mijloc de învăţare, de educaţie, de creaţie, de cercetare.

Accesul universal la publicaţii, sistemul internaţional de informare bazat pe sistemele naţionale de informare, unde sunt incluse şi bibliotecile, schimburile interbibliotecare, sunt doar câteva dintre problemele actuale ale bibliologiei, care se pun la diverse consfătuiri internaţionale, desfăşurate în continuare sub egida UNESCO.

2 Analiza problemeiDupa cum am specificat anterior calculatorul a devenit o necesitate în practicarea

meseriei de bibliotecar. Vom avea nevoie asadar de un sistem de gestionare a resurselor dintr-o biblioteca. Vom incepe prin a analiza cateva sisteme disponibile deja pe Internet şi care evident au succes putând astfel analiza care sunt cele mai întâlnite cerinţe şi funcţionalităţi disponibile la un astfel de sistem.

2.1 Sisteme comerciale disponibile pe internet

Bibliotecile se pot împărţi în două categorii din punct de vedere al accesibilităţii. Biblioteci publice disponibile on-line şi biblioteci private

2.1.1 Google Book Search

Adresa: books.google.com

Aici se poate găsi cea mai impresionantă colecţie de cărţi din toate domeniile (literatură, ficţiune, filozofie, economie, ştiinţe politice, matematică, fizică etc.) în toate limbile pământului. Accesul este în principal liber însă la majoritatea căţilor sunt afişate doar anumite pagini din carte astfel ca pentru a obţine toată cartea serviciul direcţionează user-ul către o librărie fizică sau una on-line(ex: Amazon books).

Google Books (cunoscut anterior ca Google Book Search şi Google Print) este un serviciu de la Google, care caută în textul integral al cărţilor pe care Google le scanează, se converteşte la text utilizând recunoaşterea optică a caracterelor, şi le stocheaza digital în baza sa de date. Serviciul a fost cunoscut anterior ca Google Print, atunci când a fost introdus la Targul de Carte de la Frankfurt, în octombrie 2004. Până la trei rezultate din indexul Google Books sunt afişate deasupra rezultatelor de căutare în serviciul Google Web Search (google.com) când sunt relevante pentru căutarea de cuvinte cheie ale unui utilizator. Un utilizator poate căuta, de asemenea, doar cărţi dedicate(domenii). Făcând clic pe un rezultat de la Google Books, se deschide o interfaţă în care utilizatorul poate vizualiza pagini din carte, precum şi anunţuri legate de conţinut şi link-uri către site-ul editurii şi librării. Printr-o varietate de limitări de acces şi măsurile de securitate, unele bazate pe utilizator de urmărire, Google limitează numărul de pagini vizualizate şi încercările de a printa pagina precum şi copierea textului din material cu drept de autor. Spre exemplu în loc să se afişeze un document din care se poate face copy/paste se va afişa o imagine (nu permite copiere) sau se vor afişa numai anumite pagini semnificative pentru carte(doar cuprins şi începutul capitolelor).

Baza de date Google Books continuă să crească. Google Books permite descărcarea în format PDF a lucrarilor publice şi a materialelor fara copyright. Potrivit unui membru al echipei de Asistenţă Google Books, "Din moment, dacă o carte este în

8

domeniul public pot fi adesea o întrebare delicată juridic, ne alunecă pe partea de precauţie şi de afişare cel mult un fragment de câteva rânduri până când vom avea stabilit că acea carte a intrat în domeniul public ".[2] Utilizatorii din afara Statelor Unite poate accesa toate acestea, un număr mare de cărţi scanate domeniului public de către Google folosind copii stocate pe Internet Archive. Multe dintre cărţi sunt scanate folosind aparatul Elphel 323 la o rată de 1.000 de pagini pe oră. Iniţiativa este de lăudat pentru potenţialul său de a oferi un acces fără precedent la ceea ce poate deveni cel mai mare corpus on-line a cunoaşterii umane şi promovarea democratizării de cunoştinţe, dar aceasta a fost criticată de asemenea, pentru încălcarea potenţială a drepturilor de autor.Prin martie 2007, Google a avut digitalizate un milion de cărţi la un cost estimat de 5 milioane dolari. Pe 28 octombrie 2008., Google a declarat că a avut şapte milioane de cărţi căutate prin Google Books, inclusiv cele scanate de către partenerii lor(circa 20.000 edituri/publisheri). Din cele 7 milioane de cărţi, 1 milion sunt în "previzualizare deplină" bazat pe acorduri cu editori. Cele mai multe lucrări scanate nu mai sunt în presa scrisă sau disponibile pe piaţă. Pe 9 octombrie 2009, Google a anunţat că numărul de cărţi scanate este de peste zece milioane.

2.1.2 WizBooks© Program specializat pentru gestiunea cărţilor şi clienţilor unei biblioteci.

Adresa: http://www.wiz-soft.ro/wizbooks.htm Preţ/licenţă MONOPOST 1000 leiPreţ/licenţă RETEA 1900 lei Licenţă update/an 250 lei

1. Gestiunea cărţilor din inventarul bibliotecii, permite, stocarea în baza de date a următorului set minimal de date referitor la articolele din gestiune: număr de inventar, titlu, autor, editura, locul apariţiei, anul apariţiei, domeniul lucrării (în sistem se va creea un catalog de domenii), limba în care este scrisă cartea, preţul de achiziţie, domeniul, numărul procesului de recepţie cu care a intrat în gestiune, data intrării în gestiune, proveninenţă.Deasemenea acest modul oferă posibilitatea introducerii de menţiuni cu ocazia inventarieriilor periodice sau neperiodice şi generarea de situaţii privind aceste acţiuni.

2. Gestiunea Clienţilor, permite stocarea în baza de date a următorului set minimal de date referitor la clienţi: nume, prenume, data naşterii, adresa, telefon, email, act de identitate (tip, serie şi număr ), CNP, data înscrierii, menţiuni despre comportament, nivelul de studii, locul de muncă, funcţia.Clienţii din baza de date pot fi identificaţi după diverse criterii (CNP, nume, prenume, data naşterii).Conform prevederilor legale pentru fiecare cititor aplicaţia permite emiterea unui contract valabil de 5 ani şi deasemenea permite aplicarea de vize anuale. La expirarea contractului datele clientului se vor arhiva şi vor putea fi regăsite ulterior.

3. Modul împrumut - restituire, permite împrumutul unei cărţi unui client cu contract de cititor valabil, precizând data împrumutului, data când trebuie să facă restituirea, data restutuirii efective, optional o notă pentru starea cărţii dupa împrumut.

9

În perioada cât timp cartea este împrumutată ea trece în starea blocată şi nu va mai fi disponibilă spre a fi împrumutată altui client.

Tot aici se pot genera şi listele cu situatiile cartilor împrumutate, cărţile cu termen de restituire depăşit şi pentru acestea pot genera şi lista înştiinţări pentru restituirea cărţilor.

4. Modul consultareAcest modul serveşte la interogarea bazei de date dupa diverse criterii.Se permit căutări ale articolelor din bibliotecă după, număr de inventar, titlu, autor, editură, locul apariţiei, anul apariţiei, domeniul lucrării, limba în care este scrisă cartea, domeniu.

5. Modul listare şi statistică, serveşte la întocmirea automată a situaţiilor statistice cerute pentru a fi raportate sau pentru uz intern.

6. Modul operaţii de întreţinerea bazei de date, realizează reindexarea datelor, testarea consistenţei bazei de date, arhivarea datelor vechi, salvarea periodică a bazei de date, restaurarea bazei de date din ultima salvare şi alte operaţii necesare întreţinerii bazei de date

7. Modul de securizare şi alocare drepturi de acces utilizatori, acordă acces utilizatorilor la resursele aplicatie pe bază de parole de acces în functie de drepturile acordate.

2.1.3 Program, software evidenţa bibliotecă - OBRE SOFT

http://www.obresoft.ro/Programul realizează evidenţa informatizată a intrărilor şi ieşirilor de carte dintr-o bibliotecă

-programul foloseşte cititor cod bare-pe fiecare carte se lipesc etichete cod bare având imprimate numele cărţii, numărul de inventar, autorul-cărţile se introduc în baza de date având posibilitate de sortare/căutare după autor/editură/domeniu-la împrumutul unei cărţi se citeşte automat eticheta pentru a afla date despre carte; se citeşte de asemenea şi codul clientului de pe carnetul de acces în bibliotecă-la restituirea cărţii se citeşte codul de client după care se citeşte eticheta fiecărei cărţi returnate-programul editează o fişă a cărţii, o fişă a clientul, registrul cu cărţi împrumutate/resturnate, lista cu cărţi nereturnate, adrese de înştiinţare către clienţii care nuau returnat cărţile-programul are posibilitatea de a bloca un client la împrumut pentru un anumit număr de zile-programul are posibilitatea de a rezerva o carte pentru un anumit client-emitere automatizată de somaţii pentru depăşirea termenului de restituire prin sms sau email-pentru cei care nu doresc să folosească facilitatea de etichete cod bare şi automatizare transmitere somaţii preţul este de 100 euro-100 ETICHETE GRATUIT.

10

-firma noastră poate pune la dispoziţie etichete editate cu datele din baza de date a programului-10 euro --> 1.000 etichete

2.2 Sisteme gratuite

La sisteme gratuite va fi încadrat şi sistemul implementat de mine deoarece intenţionez să-l fac disponibil pe unul din forumurile de profil. Ex:PROGRAM GRATUIT BIBLIOTECĂ ŞCOLARĂ: http://forum.portal.edu.ro/index.php?showtopic=50404

2.2.1 OpenBiblio

http://openbiblioromania.xhost.ro/home/index.php

OpenBiblio permite realizarea managementului activităţii unei biblioteci prezentând multiple avantaje, printre care:

- este gratuit; - interfaţa în limba română; - programul rulează rapid pe orice sistem de operare pe care sunt instalate php,

mysql, apache. - sistemul este securizat în sensul că nu oricine are acces la informaţii decât pe bază

de parolă; - folosind sistemul OPAC putem permite vizualizarea de către elevi a informaţiilor

anumitor bibliografii precum statutul lor(împrumutat, returnat, rezervat, deteriorat, etc);

- dacă OpenBiblio este instalat pe serverul şcolii şi acesta are acces în exterior atunci programul prezintă două mari beneficii:elevii pot vizualiza de acasă lista materialelor împrumutate, respectiv data returnării lor iar bibliotecarii pot introduce date în biblioteca virtuală chiar de acasă;

- administratorul poate crea conturi suplimentare pentru mai mulţi bibliotecari crescând astfel productivitatea şi randamentul unei astfel de biblioteci on-line;

- administratorul/administratorii (bibliotecarul/bibliotecarii) pot crea conturi pentru fiecare membru(abonat) al bibliotecii;

- administratorul are acces la arhiva împrumuturilor/returnărilor unui membru; - programul are şi o evidenţă financiară, calculează amenzi de penalizare, etc; - se pot crea diverse tipuri de colecţii: cărţi, cd, dvd, etc; - se pot crea cu uşurinţă bibliografii-pentru maximă eficienţă OpenBiblio utilizează

limbajul MARC prin intermediul căruia se pot introduce sute de bibliografii folosind programul MarcEdit(dacă sunteţi interesaţi voi reveni cu amănunte);

- se poate face importul datelor folosind un program de calcul tabelar(Calc);- se pot face rezervări ale materialelor împrumutate; - OpenBiblio foloseşte sistemul codului de bare, permiţând folosirea scanerelor

pentru citirea codului de bare; - generare rapoarte complexe, scrisori de somare, etichete cu coduri de bare; - căutarea membrilor şi bibliografiei după mai multe criterii,etc - editor de teme vizuale; - alte opţiuni.

11

2.2.2 Biblioportal (realizat cu fonduri UE, recomandat a fi folosit de intituţii)

Adresa: http://www.biblioportal.ro

Pe 21 Octombrie 2009 a fost lansat Sistemul Biblioteconomic Integrat Web - BiblioPortal

BiblioPortal este un Sistem Biblioteconomic Integrat Web, dezvoltat pe structura aplicaţiei Ibla Soft (rezultat al proiectului IOSSPL) şi cuprinde aplicaţiile biblioteconomice de bază specifice (Catalogare, Gestiune, Împrumut, Rapoarte Standard, Consultare Catalog, Rezervări etc.), şi oferă servicii on-line bibliotecilor abonate şi clienţilor acestora, acoperind întreaga gama de activităţi şi fluxuri de informaţii şi date ale unei biblioteci profesioniste.

BiblioPortal oferă servicii de hosting al bibliotecilor abonate, permiţând integrarea în portal a cataloagelor bibliotecilor clienţi în cadrul catalogului comun partajat şi a site-urilor acestora, făcând posibilă operarea şi utilizarea portalului de către personalul bibliotecilor pe baza accesului preferenţial şi securizat, în funcţie de conturile şi profilele create în modulul de administrare. Portalul permite operaţiuni biblioteconomice complexe prin portlet-uri specifice, în categoriile următoare: catalog partajat, operaţiuni de catalogare, căutare complexă, operaţiuni de gestiune bibliotecară, sistem de rapoarte standard, rezervări on-line, împrumuturi, administrare securizată şi acces preferenţial (sistem complex de conturi, grupuri şi profile de utilizatori), modul internaţionalizare (în prezent pregătindu-se localizarea pentru 7 limbi de circulaţie Europeană).

Portalul poate fi customizat pentru a îndeplini funcţiile specifice ale unor biblioteci specializate. BiblioPortal este utilizat într-o serie de proiecte naţionale şi internaţionale, implementările existente acoperind câteva categorii de biblioteci: Biblioteci Publice (Orăşeneşti, Comunale, Săteşti), Biblioteci Juridice (Curţi de Apel, Tribunale, Judecătorii), Biblioteci ale Institutelor de Cercetare, Biblioteci Educaţionale (Şcoli, Licee, Universităţi).

Portalul facilitează colaborarea inter-biblioteci, crearea unei comunităţi de profil integrând şi cititorii şi comunicarea prin forum şi wiki propriu.

BiblioPortal este un Sistem Biblioteconomic Integrat Web care integrează o serie de aplicaţii biblioteconomice şi oferă servicii on-line bibliotecilor abonate şi clienţilor acestora, acoperind întreaga gamă de activităţi şi fluxuri de informaţii şi date ale unei biblioteci profesioniste. BiblioPortal oferă servicii de hosting al bibliotecilor abonate, permiţând integrarea în portal a cataloagelor bibliotecilor clienţi în cadrul catalogului comun partajat şi a site-urilor acestora, făcând posibilă operarea şi utilizarea portalului de către personalul bibliotecilor pe baza accesului preferenţial şi securizat, în funcţie de conturile şi profilele create în modulul de administrare. Portalul permite operaţiuni biblioteconomice complexe prin portlet-uri specifice, în categoriile următoare: catalog partajat, operaţiuni de catalogare, căutare complexă, operaţiuni de gestiune bibliotecară, sistem de rapoarte standard, rezervări on-line, împrumuturi, administrare securizată şi acces preferenţial (sistem complex de conturi, grupuri şi profile de utilizatori), modul internaţionalizare. Portalul poate fi customizat pentru a îndeplini funcţiile specifice ale unor biblioteci specializate. BiblioPortal-ul este utilizat în proiecte naţionale şi internaţionale,

12

implementările existente acoperind câteva categorii de biblioteci: Biblioteci Publice (Orăşeneşti, Comunale, Săteşti), Biblioteci Juridice (Curţi de Apel, Tribunale, Judecătorii), Biblioteci ale Institutelor de Cercetare, Biblioteci Educaţionale (Şcoli, Licee, Universităţi). Portalul facilitează colaborarea inter-biblioteci, crearea unei comunităţi de profil, comunicarea prin forum şi wiki propriu.BiblioPortal - Ofertă servicii: Catalog Bibliografic Partajat (On-line) Servicii de Catalogare (On-line) Servicii de Căutare Complexă în Catalog (On-line) Servicii de Gestiune şi Împrumut (On-line) Servicii de Forum şi Wiki (On-line) Servicii de Informare şi Ştiri (On-line) Servicii de Găzduire Site-uri Biblioteci (On-line) Servicii de Management al Conturilor de Utilizatori (On-line) Servicii de Hosting - Număr nelimitat de Biblioteci (On-line) Servicii de Adaptare, Implementare şi Training (Local - La cerere) Servicii de Conversie şi Import Date (Local - La cerere) Servicii de Asistenţă - Consultanţă (Telefonic şi On-line)Structura nivele servicii: Servicii globale o Servicii de Hosting - Număr nelimitat de Biblioteci (On-line) o Servicii de Găzduire Site-uri Biblioteci (On-line) o Servicii de Adaptare, Implementare şi Training (Local - La cerere) o Servicii de Conversie şi Import Date (Local - La cerere) o Servicii de Asistenţă - Consultanţă (Telefonic şi On-line) Nivel utilizator neautentificat o Servicii de Căutare Simplă în Catalog (On-line) o Servicii de Vizualizare Forum şi Wiki (On-line) o Servicii de Vizualizare Info şi Ştiri (On-line) Nivel utilizator autentificat - Bibliotecar o Catalog Bibliografic Partajat (On-line) o Servicii de Catalogare (On-line) o Servicii de Căutare Complexă în Catalog (On-line) o Servicii de Gestiune şi Împrumut (On-line) o Servicii de Forum şi Wiki (On-line) o Servicii de Update (On-line) Nivel utilizator autentificat - Cititor o Servicii de Căutare Complexă în Catalog (On-line) o Servicii de Consultare Împrumuturi Curente Proprii (On-line) o Servicii de Consultare Istoric Împrumut Propriu (On-line) o Servicii de Rezervare şi monitorizare rezervări proprii(On-line) o Servicii de Forum şi Wiki (On-line) o Servicii de Update (On-line) Nivel utilizator autentificat - Administrator o Servicii de Management al Conturilor de Utilizatori (On-line) o Servicii de Administrare Portal (Site-uri Biblioteci, Forum, Wiki, Info) (On-line) o Servicii de Monitorizare şi Updatare Portal (On-line)

13

3 Specificarea cerinţelor

După cum am observat din expunerea anterioară a câtorva sisteme disponibile, am observat deja cele mai importante operaţii pe care mi le propun spre implementare. Iată o listă succintă:

1. Uşurinţa în utilizare. Sistemul să nu fie greoi de înţeles şi să modeleze cât mai apropiat situaţiile reale. Interfaţa grafică să fie intuitivă organizată pe meniuri, submeniuri şi tab-uri.

2. Fără bug-uri(defecte). Este foarte important să oferim mai întâi stabilitate şi corectitudine sistemului decât să-l creştem foarte mult şi să descoperim multe erori abia după aceea când sistemul a ajuns în exploatare.

3. Afişare informaţii de status asupra numărului curent resurse împrumutate precum şi resursele cărora le-a expirat împrumutul. Aceste informaţii vor fi prezente pe fiecare pagină web a programului.

4. Adăugare, modificare, ştergere resursă. O resursă poate fi de mai multe feluri(ex: carte, diafilm, obiect fizic de studiu, etc). Pentru a anticipa însă doar într-o mică măsură viitoare informaţii ce vor descrie o resursă vom ataşa fiecărei resurse un câmp(informaţie) suplimentar (coloana ‘observaţii’).

5. Adăugare, modificare, ştergere cititor.

6. Adăugare, modificare, ştergere domeniu. Un domeniu identifică un grup generic din care fac parte resurse ce au caracteristici comune (ex: domeniul ‘informatică’ va conţine numai cărţi de informatică).

7. Adăugare, modificare, ştergere autor. Nu este obligatoriu ca toate resursele să aibă autor. Pot exista şi scrieri anonime sau resurse de studiu fără un autor bine definit.

8. Căutare folosind doar o parte din informaţia căutată. Evident se vor afişa toate înregistrările care conţin şirul de caractere introdus. Căutare după numele unei resurse(ex: e de ajuns să introducem doar o parte din numele titlului unei cărţi). Pentru căutarea unui cititor se specifică o parte din nume. Pentru căutarea unui autor se specifică o parte din nume. Pentru căutarea unui domeniu se specifică o parte din numele domeniului.

9. Vizualizare a informaţiei stocate în baza de date. Se vor afişa toate resursele, autorii, cititorii, domeniile. Aceasta este o funcţionalitate de ajutor în faza de testare mai mult întrucât dacă baza de date conţine zeci de mii de înregistrări e posibilă blocarea browserului în momentul când vizualizăm un număr aşa mare de informaţie.

10. Împrumut. Se poate împrumuta o resursă. La împrumutare se vor specifica pe lângă identificatorul cititorului, resursei, numărul de exemplare şi data de sfârşit pănă la care resursa trebuie returnată. Data de început se consideră data curentă la care s-a făcut împrumutul.

14

11. Returnare. În momentul în care o carte este returnată ea trebuie ştearsă din tabela ce reţine resursele împrumutate. Returnarea este permisă numai dacă se returnează exact numărul de exemplare împrumutate.

12. Raport cu cărţile figurează în continuare ca împrumutate pe o perioadă dată. Se va afişa într-o secţiune împrumuturile neexpirate şi într-altă secţiune împrumuturile expirate.

Spre exemplu un bibliotecar doreşte să afle ce resurse, cărui cititor şi când le-a împrumutat pentru a-şi face o idee asupra căror resurse trebuiesc returnate urgent.

13. Raportul de afişare cărţi după domenii va permite selectarea unui nume de domeniu şi afişarea tuturor resurselor din acest domeniu.

Sistemul va fi instalat pe calculatorul local fie pe un site web. În cazul web efectuarea accesului pe baza de user şi parola ar bloca eventualele accesări ilegale.Sistemul este gândit să fie single user. Adică la un moment dat este indicat să fie maxim un utilizator care îl foloseşte, aceasta întrucât baza de date din spate nu e de tip tranzacţional. O bază de date ce permite tranzacţii garantează integritatea datelor. Ex: tranzacţie:<begin transaction>

<citeste inregistrarea X care îmi spune că există o înregistrare Y> (1)<citeste Y> (2)

<end transaction (commit)>Daca nu ar fi o trazacţie este posibil ca după (1) o altă operaţie efectuată de alt user să ştergă Y şi atunci presupunerea logică ca “am un Y” executată la pasul (2) nu ar mai fi validă.Totodată putem grupa mai multe succesiuni de comenzi SQL într-o tranzacţie. Dacă de exemplu se ia curentul electric în mijlocul tranzacţiei, fişierul de log al tranzacţiei care păstrează vechile valori ce au fost modificate nu va fi golit (fiindcă tranzactia nu s-a sfârşit) iar când curentul va reveni observând că a fost întreruptă va pune înapoi vechile valori(rollback).Practic tranzacţia ori se execută toată ori deloc(nu există jumătăţi de măsură) astfel ducând la o mai bună integritate a datelor stocate.

4 Proiectarea sistemului

4.1 Diagrama bazei de date

Aceasta e baza de date are 6 tabele:

15

Tabela autori se observă că are 8 înregistrări(autori) şi 3 coloane(idAutor, nume şi observaţii).

Se considera idAutor ca identificând unic un autor. Nota:I: De nu poate fi folosit numele ca şi cheie primară (identificator unic care identifică o înregistrare)?R: Pentru că pot exista cazuri când pe doi autori îi cheamă la fel, aşadar se mai adaugă o coloana idAutor care se autoincrementeaza (tipul de date BIGINT cu caracteristicile NOT NULL şi AUTO_INCREMENT) la fiecare inserare şi deci va fi unică pentru fiecare autor.

Totodată şi în celelalte tabele vom avea această coloana idTIP care identifică unic o înregistrare de un anume tip(autor, domeniu, cititor, resursă).Nota: De fapt când ne vom referenţia din tabela X o înregistrare din tabela Y vom utiliza cheia primară a tabelei Y (adică idTIP). Astfel se spune că cheia primară a lui Y este cheie externă pentru X. Ex: Mai jos tabela de împrumuturi ţine doar identificatorii cititorului şi al resursei.Atenţie: Motorul de baza MyISAM al bazei de date MySQL nu permite integritatea referenţială pentru chei externe aşadar spre exemplu cand ştergem înregistrarea ce conţine cheia primară (idTip) va trebui să verificăm manual prin comenzi SQL dacă nu cumva e referenţiată din alte tabele (ex: nu putem şterge un autor dacă el este referenţiat de resurse care încă nu au fost şterse).

Tabela cititori:

Tabela domenii:

Tabela resurse:

16

Dupa cum se observă tabela resurse conţine 4 cărţi însă nici una nu specifică şi cine a scris-o. I: De ce?R: Evident am putea specifica numele autorului într-o altă coloană însă dacă sunt mai mulţi autori cu acelaşi nume nu am şti cine cu adevarat a scris-o. Am putea să folosim valorile idAutor din tabela autori însă de ce cartea(resursa) a fost scrisa de mai mulţi autori ne-ar trebui mai multe coloane iar acest lucru nu l-am putea cunoaşte de la început(când s-a creat tabela).Soluţia e să mai creeăm o tabela autoriResursă care să mapeze identificatorii de cărţi la identificatorii de autori.

Tabela autoriResursă:

are 4 înregistrări şi ne spune de exemplu că resursa cu id-ul 3 a fos scrisă de autorul 4. Evident mai putem introduce o înregistrare de genul (3 , 5) care ne-ar spune că resursa cu id-ul 3 a fost scrisă în comun şi de autorul cu id-ul 5.

Din căte se observă acum lucrul cu numere(identificatori) ocupă totodată şi mai puţin spaţiu pe hard disc decât dacă am lucra cu nume de autori sau titluri de resurse pe lângă faptul că poate identifica unic un autor sau resursa în caz că există doi cu acelaşi nume/titlu.

Tabela împrumuturi:

Sunt doua împrumuturi curente. Primul împrumut a fost efectuat de către cititorul cu id-ul 2 (adică de Ionescu Camelia) asupra resursei 1 (adică cartea Poezii) într-un 1 exemplar, începând la data de 2010-02(februarie)-09 şi trebuie să returneze cartea până la 2010-03-10.

Poţi vedea toate aceste informaţii ne putem loga la http://pmadb2.xhost.ro/ cu user ‘mgradinaru_xho01' şi parola 's1wOX5'.

17

5 Implementare

5.1 Alegere tehnologiiAm ales ca limbaj de programare PHP si MySQL ca program de management al

bazelor de date care respectă standardul SQL(Structured Query Language).Desemenea pentru paginile web care reprezintă interfaţa grafică am folosit limbajul HTML (Hyper Text Markup Language) şi CSS(Cascading Style Sheets) pentru adăugarea de proprietăţi vizuale suplimentare elementelor HTML(a se vedea fişierul style.css din codul sursă).

5.1.1 Scurtă prezentare HTML

HTML, vine de la HyperText Markup Language, este limbajul predominant de markup(marcare) pentru paginile web. Acesta oferă un mijloc de a crea documente structurate prin desemnarea semanticii structurale pentru text cum ar fi titluri, paragrafe, liste, etc precum şi pentru link-uri, citate, precum şi alte elemente. Acesta permite imagini şi obiecte care urmează să fie încorporate şi pot fi folosite pentru a crea formulare interactive. Este scris în formă de elemente HTML compuse din "tag-uri" înconjurate de paranteze unghi în cadrul conţinutului paginii web. Iată mai jos o scurta listă cu cele mai folosite coduri HTML.

Principalele elemente în HTML sumt <html>, <head>, <title> şi <body>. Iată şi un exemplu simplu de contruire a unei pagini HTML.

Un document HTML întotdeauna va începe şi va termina cu un tag <html> şi respectiv </html>. Aceasta este structura standard a unui HTML.Elementul <head> este cel care urmează fiind situat între html şi body. "Head" nu are nici o functie vizibilă însă poate oferi browser-ului informaţii foarte utile. Se pot insera aici printre altele coduri Javascript sau CSS.Tag-ul title se pune înăuntrul celui de head. Între cele două tag-uri title (<title> si </title>) va putea fi vizualizat ca şi numele browser-ului, de obicei în partea din stânga sus.Elementul body este cel care defineşte începerea conţinutului paginii propriu-zise (titluri, paragrafuri, fotografii, muzică şi orice altceva).<html> <head> <title>Sistem de gestionare carti.</title> <link type="text/css" rel="stylesheet" href="style.css"> </head> <body> <p>Salut!</p> </body></html>

Tag-ul paragraph:<p>Acesta este un simplu paragraf in HTML</p><p align="left">Acesta este un paragraf aliniat la stanga</p>

Pe langa atributul align putem folosi pentru a alinia elementele HTML următoarele valori: left, right center si justify.

Tagurile header(cap) <h1>Acesta este tag-ul HTML pentru cel mai mare titlu</h1>

18

Alte tipuri de titluri in HTML: h2, h3, h4, h5, h6. Unde h1 este cel mai mare şi h6 cel mai mic.

Tag-ul linebreak(întrerupere de linie)<br /> este un salt în linie în HTML - spaţiul între br şi slash(/) face diferenţa între cod valid XHTML şi un cod dezordonat.

Tag-ul linie orizontală<hr /> se foloseşte pentru a desena o linie orizontală în HTML - spaţiul între hr şi slesh face diferenţa între cod valid XHTML şi un cod dezordonat.

ListeO lista simplă în HTML este de forma:<ol> <li>Primul element HTML din lista </li> <li>Al doilea element HTML din lista</li> <li>Al treilea element HTML din lista</li></ol>

Lista de mai sus este o listă ordonată. Alte tipuri de liste în HTML sunt liste neordonate şi lista de definiţii.

Link-uri html

<a href="împrumutare.php">Împrumutare</a><a href="http://www.google.ro/" title="Google" target="_blank" >Pagina Google</a><a href="#top">Mergi la început</a> (<a name="top"></a>)<a href="mailto:[email protected]" >Nelămuriri aici</a><a href="http://www.google.com/" title="Google” target="_blank" ><img src="http://www.google.ro/intl/en_com/images/logo_plain.png" alt="Imagine Google" /></a>

Au fost exemplificate mai sus un link normal în HTML, un link folosit pentru a lega doua secţiuni în aceeaşi pagină, un link email şi un link imagine.

Tag-ul imagine (<img>)

<img border="0" alt="Home page" src="book1.gif" width="125" height="100">

Este recomandată alinierea cu ajutorul CSS. La fel şi stabilirea dimensiunilor imaginii. Ceea ce ar transforma codul HTML de mai sus în:

<img src="img//html_image.jpg" alt="Html Image" style="width:100px; height:50px; margin:auto;" />

Formulare (tag-ul <form>), câmpuri text, cămpuri radio(una din mai multe opţiuni) şi câmpuri combobox(desfăşurator)

Am adăugat mai jos codul HTML folosit pentru a crea un simplu formular. Acesta este doar formularul HTML folosit de user pentru a introduce informaţia dorită. Nu uita că pentru procesarea acestor informaţii, odată ce se face click pe butonul submit al formularului HTML. Informaţia va fi procesată de către un fisier.php şi eventual urcată în baza de date sau trimisă pe email.

<form action="inserare.php?tip=resursa" method="get">

19

<p><input type="text" name="titlu" maxlength="100" size="50"/></p> <p><input type="text" name="autor" maxlength="200" size="25"/></p> <p><input type="text" name="anAparitie" maxlength="10" size="3"/></p> <p><input type="text" name="editura" maxlength="50" size="25"/></p> <p><input type="text" name="nrExemplare" maxlength="3" size="3"/></p> <p><input type="text" name="idDomeniu" maxlength="7" size="3"/></p> <p><textarea cols="38" rows="3" name="observatii"></textarea></p><br> <input type="hidden" name="tip" value="resursa"/>

<input type="submit" value="Adauga"/></form>

Iată mai jos un tag care generează butonul combobox afişat pentru selectarea domeniului. Am inclus şi codul php pentru a observa felul în care putem întrepătrunde cod HTML cu cod PHP.

<form action="raport2.php" method="get"> <p>Nume domeniu: <select name="nume"> <?php

$sql = "select * from domenii";$rezultat = mysql_query($sql);$nrDomenii = mysql_num_rows($rezultat);for ($i=0; $i <$nrDomenii; $i++) {

$row = mysql_fetch_array($rezultat);echo '<option value="'.$row['idDomeniu'].'">'.$row['nume'].'</option>';

}?></select>

</p> </br> <input type="submit" value="Afiseaza"/></form>

Tabele

Structura de bază a unui tabel în HTML este următoarea..

<table> <tr> <th>Column 1</th> <th>Column 2</th> </tr> <tr> <td>Row 1 Cell 1</td> <td>Row 1 Cell 2</td> </tr> <tr> <td>Row 2 Cell 1</td> <td>Row 2 Cell 2</td> </tr></table>

Text îngroşat (Bold)

<b>text îngrosat în html</b><strong>text îngroşat în html</strong>

20

5.1.2 Scurta prezentare PHP

PHP este prescurtarea de la Hypertext PreProcessor.Spre deosebire de paginile HTML care puteau fi verificate şi pe calculatorul local paginile PHP nu pot fi verificate decât dacă sunt găzduite pe un server web care are instalat PHP.

Cand accesăm o pagină HTML serverul care o găzduieşte trimite pagina HTML către browser spre afişare. În cazul unei pagini PHP serverul citeşte codul PHP, îl interpretează şi generează dinamic pagina HTML care este trimisă browserului spre afişare. Acesta este motivul pentru care utilizatorii folosesc PHP pentru construirea unor pagini cu conţinut dinamic.

Fişierele PHP au extensia php. Puteţi scrie astfel de fişiere cu Notepad sau cel mai indicat cu un editor specializat, de exemplu Zend Studio care va indica şi numărul liniilor, lucru util la depanarea scripturilor. Verificaţi că nu aveţi extensiile ascunse (My Computer -> Tools -> Folder Options -> View -> debifaţi Hide extensions for known file types). Pentru a putea crea fişiere php daţi clic dreapta New -> Text Document, apoi îl redenumiţi nume.php.

Când PHP-ul parcurge un fişier de fapt "citeşte" textul până când întâlneşte una din etichetele speciale care-i spun să înceapă să interpreteze textul ca pe cod PHP. Se execută codul până când este întâlnită eticheta de închidere. Apoi se "citeşte" din nou textul mai departe. Acesta este motivul pentru care se poate adăuga cod PHP în interiorul HTML-ului.

Important:

închiderea unui rând se face obligatoriu cu caracterul ; numele funcţiilor nu sunt Case Sensitive (nu se face diferenţa între utilizarea

literelor mari sau mici) numele variabilelor sunt Case Sensitive (se face diferenţa între utilizarea literelor

mari sau mici) ghilimelele se folosesc pereche "..." sau '...', folosirea lor "...' sau '..." constituie o

eroare

Codul PHP este delimitat de unul din următoarele seturi de etichete de deschidere şi închidere:<?php ?> etichete recomandate

Exemplu: cel mai simplu script PHP este:

<?php echo "Acesta este un script PHP";?>

Daca veţi verifica funcţionarea acestui script pe un server veţi vedea că este afişat textul delimitat de ghilimele.

Funcţia echo este folosită pentru afişarea informaţiilor delimitate de ghilimele. Nu uitaţi să închideţi rândul cu ;. Similar funcţiei echo este funcţia print.

21

În situaţia în care scriptul nu este scris corect PHP-ul va afişa eroarea indicându-va şi locul unde aceasta apare. Erorile sunt afişate doar dacă serverul este setat corespunzator (în php.ini este setat display_errors=On si error_reporting=E_ALL).

Exemplu: în interiorul scriptului puteţi insera şi etichete HTML

<?php echo "Acesta este un script <b>PHP</b><br>care conţine şi etichete HTML";?>

Exemplu: fisierul PHP poate conţine între etichetele <html> şi </html> blocuri PHP delimitate de <?php ?>

<html><head><title>Exemplu0_3</title></head><body>Bloc HTML<br><?php echo "Bloc PHP";?></body></html>

In PHP sunt trei metode prin care se poate adăuga un comentariu, evident neafişat în browser, cu scopul de a adăuga informaţii necesare programatorului.

Tot ce urmează după caracterele // sau # este considerat comentariu. De exemplu:// Urmeaza un comentariu în PHP# Urmeaza un comentariu în PHP

Utilizare:

echo "test"; // browser-ul va afişa testecho "proba"; # browser-ul va afişa probă

Un comentariu format din mai multe linii este încadrat de /* şi */. De exemplu:

/* Comentariul in PHP scris pe două linii */

Acest tip de comentariu poate fi folosit şi pentru ignorarea unor blocuri PHP. În exemplul următor browserul va afişa doar proba

/* echo "Tutorial";echo "PHP"; */echo "proba";

Structurile de control if, else, for, while sunt asemănătoare cu cele din alte limbaje foarte cunoscute cum ar fi C sau Java.

Variabila este un container de date care poartă un nume şi i se poate atribui o valoare care poate fi modificată de mai multe ori sau salvată într-o bază de date. Variabilele nu au un tip asociat (întreg, şir de caractere, dată) ci pot stoca de-a lungul scriptului în care se află valori de tipuri diferite. Numele dat variabilei începe cu simbolul $ urmat de orice literă mică (a-z) sau mare (A-Z) sau cu caracterul _.Exemplu: atribuim variabilei $program valoarea PHP şi apoi o tipărim:

22

<?php $program="PHP"; //ia ca valoare un şir de caractere. echo "Limbajul".$program; // punctual . este folosit ca operator de concatenare a

// doua string-uri. $program=1; //ia ca valoare numărul întreg 1.?>

Şirurile de caractere se pun între ghilimele sau apostrof(vezi ex anterior). Diferenţa o constituie faptul că în sirurile(string) încadrate de ghilimele putem folosi şi nume de variabile $variabila iar acestea vor fi inlocuite cu valoarea lor reala în string-ul rezultat înainte de efectuarea oricărei operaţii pe acel şir.

Valorile introduce de utilizator în pagina web sunt trimise către server şi accesibile PHP folosind variabila globală $_GET. Astfel pentru a accesa numele cititorului transmis la inserarea unui cititor se va folosi: $_GET[‘nume’]. Din câte se observă $_GET este o variabilă de tip tablou asociativ (permite ca indecşi numere întregi positive şi şiruri de character) iar index-ul şir ‘nume’ trebuie să fie acelaşi cu valoarea atributului name din tag-ul html <input> de tip text corespunzător.

5.1.3 Scurta prezentare SQL (Structured Query Language)

Bazele de date sunt modalităţi de a stoca datele, pot fi formate dintr-un fişier sau mai multe fişiere. Acestea sunt gestionate de sisteme de gestiune a bazelor de date (SGBD). Fiecare bază de date este formată din mai multe tabele. La rândul sau fiecare tabel este format din mai multe coloane identificate printr-un nume unic în tabel. Fiecare coloană poate conţine diferite tipuri de date variind de la : numere întregi, numere reale, şiruri de caractere, şiruri binare şi date completate automat. Datele sunt stocate în tabele aranjate pe mai multe linii. În discuţia despre coloane apare denumirea de cheie primară. Fiecare tabel trebuie să aibă o astfel de coloana care să identifice unic fiecare linie din tabel.

NOTA: În baza mea de date am decis ca numele nu poate identifica unic un cititor (pot exista mai mulţi cu acelaşi nume) sau o resursă (pot exista mai multe cărţi cu acelaşi titlu) şi de aceea cheia primară este o coloana de tip AUTO_INCREMENT ce stochează întregi şi este incrementată la fiecare inserare automată astfel că garantează unicitatea. Totodata dacă se şterge o înregistrare valoare cheii nu este refolosită întrucât unicitatea e garantată şi în timp şi o refolosire ar încălca principiul integrităţii datelor.

Tipuri de date

Aşa cum am spus într-o coloană nu pot exista decât date de un singur tip. Principale tipuri de date disponibile pot fi încadrate în urmatoarele categorii : tipuri de date sir ( CHAR , VARCHAR, TEXT ), tipuri de date numerice ( BIT, DECIMAL, FLOAT, INT ), tipuri de date data/ora ( DATE, DATETIME, TIME ) şi tipuri de date binare ( BINARY, VARBINARY ).

Datele de tip şir pot fi limitate la o anumită lungime maximă, în cazul tipurilor de date CHAR(n) şi VARCHAR(n) unde n este lungimea maximă sau nelimitate în cazul utilizarii tipului TEXT. Este recomandat ca să fie utilizat tipul cel care oferă facilităţile cele mai apropiate de cele dorite, în special din motive de performanţă, programele SGBD

23

ştiind să facă optimizări de stocare şi acces. Ceea ce vreau să spun e ca pentru a reţine un număr de telefon este absurd să se foloseasca un tip de date TEXT pentru că se ştie că lungimea acestuia nu va depăşi niciodată 15 caractere fiind suficient un CHAR(15).

La utilizarea datelor de tip şir, valorile trebuie puse între ghilimele. Fiecare câmp poate să deţină şi o valoare specială NULL, care desemnează un câmp fără informaţie.

Crearea unui tabel

Există două modalităţi de a creea tabele. Prima presupune folosirea unui interfeţe grafice pusă la dispoziţie de majoritatea programelor SGBD sau se poate folosi direct limbajul SQL.

Comanda care face acest lucru este CREATE TABLE. Sintaxa ei poate fi diferită în funcţie de SGBD-ul folosit, însă majoritatea versiunilor folosesc o implementare standard.

Exemplu de utilizare :

CREATE TABLE `autoriResursa` (

`idResursa` bigint(20) NOT NULL,

`idAutor` bigint(20) NOT NULL,

PRIMARY KEY (`idResursa`,`idAutor`)

) COMMENT='O carte poate avea mai mulţi autori deci folosim o tabelă.';

Se poate observa că numele tabelului trebuie specificat imediat după instrucţiune urmat de o listă de parametrii de formă nume_coloana, tip şi NOT NULL/NULL. Sintaxa acestei funcţii este dependenţa de programul SGBD folosit.

            Modificarea unui tabel

            Prin modificarea unui tabel mă refer la operaţii de adăugare sau de ştergere a unor coloane. Astfel de operaţii apar destul de rar şi trebuie să aveţi grijă în faza de design ca să anticipaţi necesităţi viitoare astfel încât să nu fiţi nevoit să apelaţi la aceste funcţii.

            Funcţia pe care o vom folosi se numeşte ALTER TABLE. Exemplu de utilizare:

ALTER TABLE domenii ADD observaţii CHAR(200);

          sau

           ALTER TABLE domenii DROP COLUMN observaţii;

            Această funcţie trebuie utilizată cu mare atenţie pentru că datele nu pot fi recuperate. Vă recomand să realizaţi copii de siguranţă înainte.

24

            Ştergerea tabelelor

            Ştergerea unui tabel este o operaţie destul de rar întâlnită. Se utilizează funcţia DROP TABLE.

Exemplu:         DROP TABLE domenii;

Funcţia trebuie utilizată cu atenţie deoarece datele nu pot fi recuperate.

Inserarea datelor

Dupa funcţia SELECT pe care o vom analiza imediat funcţia INSERT INTO este una dintre cele mai folosite. Aceasta permite inserarea într-un tabel a unei linii complete sau parţiale.

Exemplu de utilizare :

INSERT INTO `cititori` VALUES (NULL, 'Popescu Ionel', '1751478453459', 'Crizantemelor, nr 5, Alba Iulia', '0740610123', '[email protected]', '');

Nota: Am folosită valoarea NULL pentru coloana cheie primară de tip AUTO_INCREMENT întrucât nu putem şti următoarea valoare, ea fiind calculate de baza de date ca Maximul de pe acea coloana + 1 şi introdusă automat.

Folosind aceeaşi sintaxă se pot insera şi rânduri parţiale precizând în lista de coloane doar pe cele dorite. Coloanele omise trebuie să poată fi NULL sau să aibă o valoarea prestabilită, altfel programul SGBD va genera un mesaj de eroare.

Actualizarea datelor

            Pentru actualizarea datelor se foloseste funcţia UPDATE în combinaţie cu o clauză WHERE. Această clauză identifică linia sau liniile care vor fi actualizate. Sintaxa pentru clauza WHERE este următoarea : WHERE expresie [ AND/OR expresie] unde expresia este de forma : nume_coloană, operator, valoare. Utilizarea acestei clauze este esenţială altfel fiind modificate toate datele din tabel.

            Operatorii clauzei WHERE sunt :

Operator                        Descriere=                        Egalitate<>                        Diferit de!=                        Diferit de<                        Mai mic<=                        Mai mic sau egal!<                        Nu mai mic>                        Mai mare>=                        Mai mare sau egal!>                        Nu mai mareBETWEEN                        Între doua valoriIS NULL                        Este o valoare NULL

25

            Pentru a putea utiliza funcţia de actualizare este necesar ca în tabel să existe un câmp cu valoare unică în tot tabelul care să poată fi indicat printr-o clauza WHERE.            Exemplu de utilizare :

UPDATE resurse SET titlu='Poezii', anApariţie=1970, editura='Coresi', nrExemplare=5,

idDomeniu=2, observaţii='observaţii' WHERE idResursa=$id"

            Ştergera datelor           

Pentru a şterge o linie sau mai multe linii dintr-un fişier utilizăm funcţia DELETE FROM împreuna cu o clauză WHERE. ATENŢIE !! omiterea clauzei WHERE poate avea consecinţe dezastruoase, golirea tabelului.            Exemplu de utilizare la returnarea unei resurse:           

DELETE FROM from împrumuturi WHERE idResursa='2' AND idCititor='3' AND nrExemplare='1'

           Operaţiile de actualizare şi de ştergere trebuie tratate cu foarte mare atenţie pentru

că folosite greşit duc la pierderi de date. Din acest punct de vedere vă recomand să faceţi un back-up înaintea unei astfel de operaţii.

           Regăsirea datelor

Am ajuns la cea mai frecventă operaţie executată asupra bazelor de date, operaţia de regăsire a datelor. Funcţia folosită este SELECT nume_coloană FROM tabel. Este una dintre cele mai folosite funcţii. I se poate adăuga la sfârşit o clauză WHEREB astfel încât să regăsească doar informaţiile care îndeplinesc o anumită condiţie.

Exemplu utilizare atunci când se doreşte aflarea tuturor împrumuturilor expirate:

SELECT * ( regăseşte toate coloanele )FROM împrumuturi WHERE sfârşit<curdate()

Aceasta este funcţia utilizată cel mai frecvent.

Cea mai bună modalitate de a învăţa funcţiile este să le aplicăm. Putem folosi pentru aceasta PhpMySQL care oferă un dialog în care putem introduce comanda şi să o executăm.

26

5.2 ImplementarePentru implementare am folosit editorul Notepad pentru scrierea codului

HTML şi PHP precum şi PhpMyAdmin pentru operaţiile cu bază de date (creare/modificare tabele şi testare comenzi SQL).

Am încercat să fac un meniu cât mai intuitiv.

27

Codul de creare al meniului este chemat din index.php care de altfel este prima pagina încărcată implicit de browser atunci când deschidem adresa.<?php include("header.php");include("footer.php");?>

Functia ‘include’ include efectiv alt cod php din alte fişiere. Fişierul header.php conţine aşadar codul HTML care structurează meniul şi codul de conexiune la baza de date. Din acest motiv header.php va fi inclus din fiecare fişier .php pentru ca astfel toate paginile să aibă aspectul primeia(meniu inclus) şi conexiunea cu baza de date să fie deja realizată.header.php:<?php $server = 'db1.xhost.ro'; //adresa serverul de baza de date.// conectarea folosid userul si parola stabilite la crearea contului.@$db = mysql_connect($server, 'mgradinaru_xho01', 's1wOX5'); if (!$db) {

echo 'Eroare: Nu s-a putut conecta la baza de date.';exit;

}mysql_select_db('mgradinaru_xhost_ro01'); // selectarea bazei de date aferente. ?>

<html><head>

<title> Sistem de gestionare carti.</title><link type="text/css" rel="stylesheet" href="style.css">

</head><body><!-- Design-ul este inspirat de catre http://www.microbion.co.uk/index.htm -->

<div id="wrapper"><div id="topbar"> <table width="100%" cellspacing="0" cellpadding="0" border="0"

id="topbartable"><tbody><tr> <td class="lefttext"></td> <td class="righttext"><a

href="index.php">Home</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>

</tr> </tbody></table></div>

<div id="sidebar"><img border="0" alt="Home page" src="book1.gif" width="125"

height="100"><br><br><h4>MENIU </h4>

<ul><li class="li_top"><a href="imprumutare.php">Imprumutare</a></li><li class="li_top"><a href="returnare.php">Returnare</a></li><li class="li_top"><a href="cautare.php">Cautare

resursa/domeniu/cititor.</a></li><li class="li_top"><a href="adaugareResursa.php">Adaugare

resursa/domeniu/cititor</a></li><li class="li_top"><a href="modificare.php">Modificare

resursa/domeniu/cititor</a></li><li class="li_top"><a href="listare.php">Vizualizare</a></li><li class="li_top"><a href="raport1.php">Raport cu cartile figurand

ca imprumutate pe o perioada data.</a></li><li class="li_top"><a href="raport2.php">Raport afisare carti dupa

domenii.</a></li></ul>

</div>

28

<div id="mainpage">

<p>&nbsp;&nbsp;&nbsp;Numar total resurse imprumutate: <?php

$cerere = "select * from imprumuturi";$rezultat = mysql_query($cerere);echo mysql_num_rows($rezultat);

?> <br>&nbsp;&nbsp;&nbsp;Numar carti carora le-a expirat

imprumutul:<?php

$cerere = "select * from imprumuturi where sfarsit<curdate()";

$rezultat = mysql_query($cerere);echo mysql_num_rows($rezultat);

?></p>

<p class="horizline">&nbsp;</p> <tr>

footer.php </div> </div></body></html>

Iată felul în care se implementează raportul de afişare resurse după domenii. Acelaşi script realizează atât afişarea formularului ce permite selectarea domeniului(cod albastru) cât şi codul care afişează rezultate(codul roşu). Diferenţa asupra cărei părţi este executată este facută prin testarea parametrului ‘nume’ (codul violet) care este trimis de formular. Practic dacă nu este prezent nu s-a apăsat ‘Afişează’ în formular deci mai întâi se va afişa forumularul altfel dacă este prezent înseamnă că s-a apăsat ‘Afişează’ şi putem afişa rezultatele raportului.<?phpinclude("header.php");

if (!$_GET['nume']) { //Daca nu exista parametrul 'nume' se afiseaza formularul;?> <form action="raport2.php" method="get">

<p>Nume domeniu: <select name="nume"> <?php

$sql = "select * from domenii";$rezultat = mysql_query($sql);$nrDomenii = mysql_num_rows($rezultat);for ($i=0; $i <$nrDomenii; $i++) {

$row = mysql_fetch_array($rezultat);echo '<option value="'.$row['idDomeniu'].'">'.

$row['nume'].'</option>';}

?></select>

</p> </br> <input type="submit" value="Afiseaza"/></form>

<?phpexit();}

$idDomeniu = $_GET['nume'];

$sql = "select * from resurse where idDomeniu=$idDomeniu";

29

$rezultat = mysql_query($sql);$nrResurse = mysql_num_rows($rezultat);

if ($nrResurse==0) {echo '<p>Nu s-au gasit resurse in acest domeniu.</p>';exit();

} else {echo "<p>S-au gasit $nrResurse rezultat(e).</p>";

}

for ($i=0; $i <$nrResurse; $i++) {$row = mysql_fetch_array($rezultat);

$idResursa = $row['idResursa'];

echo '<p>Identificator resursa: '.$row['idResursa'].'</p>';echo '<p>Titlu: '.$row['titlu'].'</p>';echo '<p>An: '.$row['anAparitie'].'</p>';echo '<p>Editura: '.$row['editura'].'</p>';echo '<p>Numar exemplare: '.$row['nrExemplare'].'</p>';echo '<p>Observatii: '.$row['observatii'].'</p>';

echo '<p class="horizline">&nbsp;</p> <tr>';}

include("footer.php");?>

5.3 Descriere funcţionalităţi şi testare

Funcţionalităţiile principale pot fi accesate din meniul principal aflat în partea stângă. Acesta este prezent în fiecare pagină a site-ului astfel că este mereu la îndemână.

30

În partea superioară sunt afişate câteva informaţii de stare care sunt de interes şi anume: Numărul total de resurse împrumutate şi numărul de resurse cărora le-a expirat împrumutul şi nu au fost returnate.

5.3.1 Adăugare resursă, autor, cititor, domeniu nou

Adăugarea unei resurse presupune mai întâi adăugarea autorilor care au scris-o precum şi a domeniului din care face parte. Totuşi nu este obligatoriu ca toate resursele să aibă autor. Pot exista şi scrieri anonime sau resurse de studiu fără un autor bine definit.Iată mai jos cum se poate adăuga un cititor după ce s-a făcut click pe tab-ul ‘Cititor’:

În caz de succes se va afişa apoi textul: ‘S-a introdus 1 înregistrare.’.

5.3.1 Modificare/ştergere resursă, autor, cititor, domeniu

Modificarea şi ştergerea sunt grupate împreună. Pentru a selecta operaţia dorită şi asupra cărui tip de obiect se va efectua se bifează câte un radio button din cele două grupuri.

Nota: Se va introduce identificatorul obiectului şi nu o parte din numele său. Pentru a afla acest identificator se poate folosi anterior funcţionalitatea de căutare.

31

Dacă este găsit obiectul cu identificatorul dat i se afişează datele în câmpuri text care sunt modificabile. Dupa modificare se face click pe ‘Modifică’.

Dacă nu există nici un obiect cu identificatorul dat atunci se va întoarce mesajul: ‘Identificatorul dat nu a fost găsit.’

Dacă se încearcă ştergerea unui cititor ce are împrumutate cărţi se afişează: “Cititorul nu poate fi şters întrucât figurează ca având împrumutate resurse. Trebuie mai întâi returnate resursele şi apoi poate fi şters.”

Dacă se încearcă ştergerea unui autor care a scris mai multe resurse ce încă nu au fost şterse se va afişa: “Autorul nu poate fi şters. Ştergeţi mai întâi resursele care sunt scrise de acest autor.” 

5.3.1 Căutare

Pentru operaţia de căutare se pot introduce şi numai ‘frânturi’ din titlu, nume, etc.Evident trebuie specificat şi tipul obiectului căutat prin selectarea un buton radio.

32

În cazul în care sunt mai multe obiecte ce conţin acest subşir atunci vor fi afişate toate. Exemplu căutarea după şirul “Poezii” întoarce numărul total de rezultate ‘S-au găsit 2 rezultate’:

5.3.2 Împrumutare

La împrumutarea unei cărţi trebuie specificate titlul resursei sau o parte din el, numele cititorului sau o parte din el, numărul de exemplare şi data de sfârşit.

33

În cazul în care există mai multe resurse cu acelaşi nume atunci se va afişa un dialog suplimentar pentru a alege resursa dorită fiind specificat şi identificatorul (pentru mai multe detalii puteţi folosi funcţionalitatea de căutare).În cazul în care se doreşte împrumutarea de mai multe exemplare decât disponibile un mesaj corespunzător va fi afişat.

În caz de succes se va afişa mesajul ‘Resursa a fost împrumutată.’.

5.3.3 Returnare

Pentru ca o resursă să fie returnată ea trebuie mai întâi să fie împrumutată în caz contrar un mesaj corespunzator va fi afişat.

Se pot introduce şi părţi din nume sau titlu şi un dialog suplimentar va stabili care resursă va fi împrumutată în caz că există două sau mai multe cu acelaşi nume.Daca nu se introduce numărul corect de exemplare împrumutate se va afişa mesajul: “Resursa nu a fost împrumutată anterior sau în numărul de exemplare specificat.”

34

În caz de succes se va afişa mesajul “1 resursă împrumutată”.

5.3.4 Vizualizare

Este o funcţionalitate care afişează toate resursele, autorii, cititorii şi domeniile. Este utilă în faza de testare când nu sunt introduse încă mii de înregistrări.În dreptul fiecărei resurse sunt afişaţi şi autorii

5.3.5 Raport cu cărţile afişate după domenii

Raportul de afişare după domenii afişează împreună toate resursele ce aparţin unui anumit domeniu. Se selectează domeniul şi se dă click pe butonul ‘Afişează’:

35

Înainte de afişare se specifică şi numărul de resurse din acel domeniu:

5.3.6 Raport cu cărţile împrumutate între o perioadă dată

Raportul acesta va afişa grupat toate cărtile împrumutate în intervalul dat.

Dintr-o grupă vor face parte resursele cărora încă nu le-a expirat termenul de returnare şi din cealaltă cele cărora le-a expirat termenul

36

6 Instalare

Programul poate fi instalat: pe un server web la o adresa de genul http://mgradinaru.xhost.ro. pe un calculator local şi accesat la adresa 127.0.0.1.

În ambele cazuri este nevoie de un browser (ex: Firefox sau Internet Explorer) pentru a accesa interfaţa grafică(GUI – Graphical User Interface).

6.1 Instalare pe un server web

Instalarea pe un server web presupune cumpărarea unui domeniu de internet ex: www.bibliotecamea.ro precum şi achitarea unei taxe lunare. Există însă şi alternativa unor site-uri web care oferă conturi gratuit pe serverele lor.

37

Un astfel de site este www.xhost.ro. Iată descris mai jos un cont, accesarea bazei de date precum şi uploadarea(încărcarea) codului sursă.După crearea unui cont nou se trece de etapa de login şi se comandă un pachet gratuit(click Comanda Pachet), la comandare se specifică şi numele domeniului adică: "şir_de_cuvinte_împreunate.xhost.ro".

Făcând click pe cuvântul Gratuit apare o descriere succintă a domeniului gratuit:

Panou administrare

Informatii Generale despre Cont

Pachetul de Gazduire: GRATUIT

Domenii: 0 / 0

Subdomenii: 1 / 1

Domenii Parcate: 0 

Baze de date: 1 / 1

Nr. Utilizatori Baze de Date: 1 / 1

Spatiu Utilizat: 0 B / 400.00 MB

Spatiu Utilizat de SQL: 0 B / 30.00 MB

Spatiu Utilizat de FTP: 0 B / 355.00 MB

Spatiu Utilizat de Email: 0 B / 15.00 MB

Spatiu Liber: 400.00 MB

Banda Consumata: 0 B  / 3.00 GB

Conturi de Email: 1 / 1

Nr. Email-uri Trimise: 0 / 50

Forwarder-i de Email: 0

Raspunsuri Automate: 0

Conturi de FTP: 1 / 1

Informatii Generale despre Server

Hosts Info: Apasa sa Vezi

Email Info: Apasa sa Vezi

Db Info: Apasa sa Vezi

Status Serviciu: Apasa sa Vezi

[ Panou Administrare Incepatori]| Panou Administrare Avansati|

Ftp

ServerFtp

mgradinaru.xhost.ro

Port Ftp 21Nume Utilizator Ftp mgradinaru_xho01Parola Ftp 5Bu4jq841W5Gy

Manager de Fisiere

IE Ftp Client

Baza de date

Server Baza de Date db1.xhost.roPort Db 3306User Baza de Date mgradinaru_xho01Parola Baza de Date s1wOX5Nume Baza de Date mgradinaru_xhost_ro01

Manager Baza de Date

PhpMyAdmin

Email

Server POP3 mail.xhost.roPort POP3 110Utilizator POP3 [email protected] POP3 GpUUtRNo96as

38

Versiune Panou: 1.0

Tema Interfata Panou:

Default

Documentatie Panou: Apasa sa Vezi

Web Mail Squirrel Mail

Se observă cele mai importante detalii:- adresa domeniului: mgradinaru.xhost.ro- userul şi parola pentru contul FTP(File Transfer Protocol) care permite folosirea

unui program ce suportă FTP pentru a transfera, modifica, şterge fişiere(cod sursă) pe cont.Se recomandă a se folosi Managerul de Fişiere oferit (click pe el).

- adresa serverului de baza de date MySql: db1.xhost.ro precum şi userul şi parola. Aceste informaţii sunt folosite în cod în partea de realizare a conexiunii la baza de date (vezi fişierul header.php)

- adresa PhpMyAdmin (click pe icoana din imagine sau http://pmadb2.xhost.ro/) care este un manager grafic ce permite efectuarea de operaţii asupra bazei de date (creare/ modificare tabel, creare(adăugare)/modificare înregistrări în tabele, export de tabele pentru a salva informaţia conţinută, vizualizare tabele, executare de comenzi SQL etc. Se foloseşte pentru logare user-ul mgradinaru_xho01 şi parola s1wOX5 .

Se pot observa în stânga toate tabelele, fiind selectat tabelul împrumuturi este afişată şi structura de coloane şi tipul lor(ex: bigint(20) – număr întreg maxim 20 cifre).

Făcând click pe tab-ul Browse putem vizualiza/modifica şi înregistrările. Totodată odată cu fiecare operaţie executată este afişată şi corespunzătorul comenzii în limbajul SQL. Se observă mai jos că vizualizarea este echivalentă cu executarea comenzii SQL:

39

SELECT * FROM `împrumuturi` LIMIT 0 , 30

O altă operaţie foarte des întâlnită este salvarea(backup) datelor existente astfel încât în cazul unei probleme fie ea eroare umană sau eroare fizică(închiderea contului, coruperea datelor) se poate încărca la loc baza de date. Salvarea se realizează selectând baza de date(click în stânga pe numele mgradinaru_xhost_ro01) şi din tabul Export se bifează “Save as file” face click pe Go.

40

Fisierul oferit spre download reproduce întocmai toate datele din baza de date. Ex:-- phpMyAdmin SQL Dump-- version 2.6.1-- http://www.phpmyadmin.net-- -- Host: db2.xhost.ro-- Generation Time: Mar 15, 2010 at 12:14 AM-- Server version: 5.0.70-- PHP Version: 5.2.11-pl0-gentoo-- -- Database: `mgradinaru_xhost_ro01`--

-- --------------------------------------------------------

-- -- Table structure for table `autori`--

CREATE TABLE `autori` ( `idAutor` bigint(20) NOT NULL auto_increment, `nume` varchar(50) NOT NULL, `observatii` varchar(200) default NULL, PRIMARY KEY (`idAutor`)) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=latin1 AUTO_INCREMENT=15 ;

-- -- Dumping data for table `autori`--

INSERT INTO `autori` VALUES (1, 'Mihai Eminescu', NULL);INSERT INTO `autori` VALUES (2, 'George Cosbuc', NULL);INSERT INTO `autori` VALUES (3, 'Jack London', NULL);INSERT INTO `autori` VALUES (4, 'Vasile Alecsandri', NULL);INSERT INTO `autori` VALUES (5, 'Jules Verne', NULL);INSERT INTO `autori` VALUES (6, 'Mihail Sadoveanu', NULL);INSERT INTO `autori` VALUES (7, 'Andrei Bantas', NULL);INSERT INTO `autori` VALUES (8, 'Grigore Gheba', NULL);INSERT INTO `autori` VALUES (9, 'andrei stefan', '');INSERT INTO `autori` VALUES (10, 'angela gheorghiu', '');INSERT INTO `autori` VALUES (11, 'maria mihalciuc', '');INSERT INTO `autori` VALUES (12, 'ZOE PETRE', '');INSERT INTO `autori` VALUES (13, 'CORNELIU GROAPA', '');INSERT INTO `autori` VALUES (14, 'NIETZSCHE', '');

-- --------------------------------------------------------

-- -- Table structure for table `autoriResursa`--

CREATE TABLE `autoriResursa` ( `idResursa` bigint(20) NOT NULL, `idAutor` bigint(20) NOT NULL, PRIMARY KEY (`idResursa`,`idAutor`)) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='O carte poate avea mai multi autori deci folosim o tabela.';

-- -- Dumping data for table `autoriResursa`--

INSERT INTO `autoriResursa` VALUES (1, 1);INSERT INTO `autoriResursa` VALUES (2, 5);INSERT INTO `autoriResursa` VALUES (3, 4);INSERT INTO `autoriResursa` VALUES (4, 7);

41

-- --------------------------------------------------------

-- -- Table structure for table `cititori`--

CREATE TABLE `cititori` ( `idCititor` bigint(20) NOT NULL auto_increment, `nume` varchar(50) NOT NULL, `CNP` varchar(13) NOT NULL, `adresa` varchar(100) NOT NULL, `tel` varchar(50) NOT NULL, `email` varchar(50) NOT NULL, `observatii` varchar(200) NOT NULL, PRIMARY KEY (`idCititor`)) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

-- -- Dumping data for table `cititori`--

INSERT INTO `cititori` VALUES (1, 'Popescu Ionel', '1751478453459', 'Crizantemelor, nr 5, Alba Iulia', '0740610123', '[email protected]', '');INSERT INTO `cititori` VALUES (2, 'Ionescu Camelia', '1751478983459', 'Izlaz nr 3, Bucuresti', '0763155653', '[email protected]', '');INSERT INTO `cititori` VALUES (3, 'Mihai Alexandru', '1761220180028', 'Bl. T Vladimirescu , bl. 4, ap. 7', '0740611123', '[email protected]', '');INSERT INTO `cititori` VALUES (4, 'nicoara felicia', '2720326364263', 'tulcea', '075533333', '', '');INSERT INTO `cititori` VALUES (5, 'mirela georgescu', '2650410362510', 'macin', '0240577777', '', '');

-- --------------------------------------------------------

-- -- Table structure for table `domenii`--

CREATE TABLE `domenii` ( `idDomeniu` bigint(20) NOT NULL auto_increment, `nume` varchar(50) NOT NULL, PRIMARY KEY (`idDomeniu`)) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;

-- -- Dumping data for table `domenii`--

INSERT INTO `domenii` VALUES (1, 'Beletristica');INSERT INTO `domenii` VALUES (9, 'filozofie');INSERT INTO `domenii` VALUES (3, 'Dictionare');INSERT INTO `domenii` VALUES (11, 'stiinte naturale');INSERT INTO `domenii` VALUES (10, 'religie');INSERT INTO `domenii` VALUES (8, 'tehnic');INSERT INTO `domenii` VALUES (12, 'arte');

-- --------------------------------------------------------

-- -- Table structure for table `imprumuturi`--

CREATE TABLE `imprumuturi` ( `idCititor` bigint(20) NOT NULL, `idResursa` bigint(20) NOT NULL, `nrExemplare` smallint(6) NOT NULL, `inceput` date NOT NULL, `sfarsit` date NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1;

42

-- -- Dumping data for table `imprumuturi`--

INSERT INTO `imprumuturi` VALUES (2, 1, 1, '2010-02-09', '2010-03-10');INSERT INTO `imprumuturi` VALUES (3, 6, 1, '2010-03-30', '2010-03-31');INSERT INTO `imprumuturi` VALUES (4, 5, 1, '2010-03-30', '2010-04-01');INSERT INTO `imprumuturi` VALUES (4, 10, 1, '2010-03-30', '2010-03-31');INSERT INTO `imprumuturi` VALUES (1, 9, 1, '2010-03-30', '2010-04-02');

-- --------------------------------------------------------

-- -- Table structure for table `resurse`--

CREATE TABLE `resurse` ( `idResursa` bigint(20) NOT NULL auto_increment, `titlu` varchar(100) NOT NULL, `anAparitie` varchar(4) default NULL, `editura` varchar(50) default NULL, `nrExemplare` smallint(6) NOT NULL, `idDomeniu` smallint(6) NOT NULL, `observatii` varchar(200) default NULL, PRIMARY KEY (`idResursa`)) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;

-- -- Dumping data for table `resurse`--

INSERT INTO `resurse` VALUES (1, 'Poezii', '1870', 'Coresi', 15, 1, NULL);INSERT INTO `resurse` VALUES (2, 'Hector Servadac', '1877', NULL, 1, 1, NULL);INSERT INTO `resurse` VALUES (3, 'Pasteluri', '1910', 'Timpuri', 3, 1, NULL);INSERT INTO `resurse` VALUES (4, 'Dictionar Englez Roman', '1997', 'Teora', 1, 3, NULL);INSERT INTO `resurse` VALUES (5, 'betoane', '1981', 'tehnica', 3, 8, '');INSERT INTO `resurse` VALUES (6, 'structuri', '2001', 'matrix', 5, 8, '');INSERT INTO `resurse` VALUES (7, 'POVESTIRI RELIGIOASE', '2004', 'ORTODOXA', 10, 10, '');INSERT INTO `resurse` VALUES (8, 'ROMANUL INTERBELIC', '1978', 'ANTET', 1, 1, '');INSERT INTO `resurse` VALUES (9, 'PICTORI CONTEMPORANI', '2005', 'ARTIS', 2, 12, '');INSERT INTO `resurse` VALUES (10, 'ANTICHRISTUL', '2006', 'ALLFA', 1, 9, '');

6.2 Instalare locală

Pentru o instalare locală va trebui să instalăm următoarele programe:- Un server web care să suporte protocolul HTTP(Hyper Text Transfer Protocol).

Pentru aceasta vom folosi serverul Apache. Serverul Apache ţine toate fişierele disponibile pe web dintr-un browser sub directorul <director_instalare>/htdocs.

- Un server de baza de date relaţionale. Serverul de baza de date va şti să gestioneze baze de date relaţionale şi să execute comenzi SQL asupra sa.

- Limbajul PHP care va fi instalat ca modul auxiliar la serverul Apache astfel ca toate paginile cu extensia .php din directorul htdocs vor fi mai întâi interpretate şi outputul (textul afişat folosind spre exemplu funcţia PHP ‘echo’) va fi trimis mai departe către browser.

- Optional PhpMyAdmin pentru lucrul uşor cu baza de date fără a fi necesară introducerea de comenzi SQL.

43

Cel mai simplu mod de a instala şi configura toate aceste programe este să folosim un program care le alătură pe toate. Cel mai cunoscut program de acest fel este cel de la ApacheFriends: http://www.apachefriends.org/en/xampp-windows.html. Instalarea pentru Windows poate fi procurat de la adresa:http://sourceforge.net/projects/xampp/files/XAMPP%20Windows/xampp-win32-1.7.3.exe/download .Dupa instalarea programului se porneşte XAMPP Control Panel şi se pornesc serviciile(click pe ‘Start’) care pornesc serverul Apache(înglobează şi modulul pentru interpretarea limbajului PHP) şi serverul MySQL. Întodeauna când vom dori să rulăm proiectul va trebui mai întâi pornit serverul web şi serverul de baze de date relaţionale.

Pentru a testa că programul a fost instalat corect mergem în locaţia unde a fost instalat, ex: d:/xampp în directorul ‘htdocs’(directorul unde sunt stocate toate fişierele făcute accesibile de serverul Apache altor clienţi(ex:către browsere)) vom crea un nou director ‘mgradinaru’ în care vom crea următorul fişier index.html cu conţinutul:

<html><body><h1>Instalare corecta.</h1></body></html>

Apoi vom merge într-un browser web şi vom tasta următoarea adresă ‘127.0.0.1/mgradinaru’. Va trebui să avem afişată pagina html index.html creată anterior:

44

127.0.0.1 este adresa IP (internet protocol) a calculatorului local. Se putea folosi şi ‘localhost’ în loc de adresa IP.Putem copia acum tot codul sursă(toate fişierele) al proectului nostru în acest director ‘mgradinaru’ şi apoi reîncărcăm pagina ‘127.0.0.1/mgradinaru’ din browser. Mai întâi evident trebuie să ne asigurăm că avem create baza de date locală şi tabelele.Pentru aceasta folosim PhpMyAdmin accesibil la adresa ‘http://127.0.0.1’. PhpMyAdmin era disponibil şi în cazul instalării pe un server web. Presupunem că creem o bază de date cu numele mgradinaru_xhost_ro01 .Iniţial userul ‘root’(superadministratorul serverului de baze de date) are parola vidă ‘’ aşadar în scriputul header.php de conectare la baza de date conexiunea se realizează astfel:

$server = '127.0.0.1';@$db = mysql_connect($server, 'root', ''); //user-ul root, parola vida.if (!$db) { echo 'Eroare: Nu s-a putut conecta la baza de date.'; exit;}mysql_select_db('mgradinaru_xhost_ro01'); //selectarea bazei de date asupra

//careia se lucreaza.

7 Bibliografie

Biblioteconomie si sisteme de gestiune:BERCIU-DRĂGHICESCU, ADINA, Ştiinţele auxiliare ale istoriei, part. I, Curs. Tipografia Universităţii Bucureşti, 1988.

45

Dan Simionescu, Manual de biblioteconomie, Bucuresti, Editura Didactica si Pedagogica, 1979Saluc Horvat, Introducere in biblioteconomie, Editura Grafoart, Bucuresti 1969.http://books.google.ro/http://openbiblioromania.xhost.ro/shared/loginform.phphttp://en.wikipedia.orghttp://ebooks.unibuc.ro/istorie/arhivistica/8capIII.htm

HTML:http://www.tutorialehtml.com/http://www.etutoriale.ro/articles/112/1/Tutorial-complet-HTML/

PHP:http://www.etutoriale.ro/articles/93/1/Tutorial-complet-PHP/http://php.net/http://www.drogoreanu.ro/tutorials/php.phphttp://www.oriceon.comhttp://www.oriceon.com/tutorial_v2.1.rar http://forum.softpedia.com/index.php?showtopic=61508http://webspace.ulbsibiu.ro/radu.kretzulescu/html/PHP1.pdf

SQL:http://www.techit.ro/tutorial_sql.phphttp://garaj.xhost.ro/docs/sql.htmhttp://georgemarin.tripod.com/diploma.htm

UML:http://www.uml.org/Specificatia UML 2.0http://www.techit.ro/tutorial_uml.php

CSS:http://www.marplo.net/curs_css/http://www.tutorialehtml.com/tutoriale-css/introducere-in-css.php

8 ANEXA 1 LISTE PROGRAME SURSĂ

46

Returnare

<? PhpInclude ("header.php");if (!$_GET['idResursa']) {?> <form action="returnare.php" method="get">

<p>Identificator resursa: <input type="text" name="idResursa" maxlength="7" size="3"></p>

<p>Identificator cititor: <input type="text" name="idCititor" maxlength="7" size="3"></p>

<p>Numar exemplare returnare(trebuie returnate toate exemplarele detinute): <input type="text" name="nrExemplare" maxlength="7" size="3"></p>

</br><input type="submit" value="Returneaza"/>

</form><?php

exit();} $idResursa = $_GET['idResursa'];$idCititor = $_GET['idCititor'];$nrExemplareReturnate = $_GET['nrExemplare'];$sfarsit = $_GET ['sfarsit'];$rezultat = mysql_query ("select * from cititori where idCititor=".$idCititor."");$nr = mysql_num_rows ($rezultat);if ($nr==0) {

echo '<p>Cititorul cu identificatorul dat nu a fost gasit.</p>';exit ();

}$rezultat = mysql_query("select * from resurse where idResursa='".$idResursa."'");$nrResurse = mysql_num_rows($rezultat);if ($nrResurse==0) {

echo '<p>Resursa cu identificatorul dat nu a fost gasita.</p>';exit();

}$row = mysql_fetch_array($rezultat);$nrExemplare = $row['nrExemplare'];// Verifica e imprumutata.$rezultat = mysql_query("select * from imprumuturi where idResursa='$idResursa' and idCititor='$idCititor' and nrExemplare='$nrExemplareReturnate'");$nrImprumuturi = mysql_num_rows($rezultat);if ($nrImprumuturi==0) {

echo "<p>Eroare: Resursa nu a fost imprumutata anterior sau in numarul de exemplare specificat.</p>";

exit();}$imprumut = mysql_fetch_array($rezultat);$rezultat = mysql_query("delete from imprumuturi where idResursa='$idResursa' and idCititor='$idCititor' and nrExemplare='$nrExemplareReturnate'");

47

if ($rezultat) echo mysql_affected_rows().' resursa returnata.';

echo '<p>Resursa a fost returnata in '.$imprumut['nrExemplare'].' exemplare.</p>';include("footer.php");?>

Raport<?phpinclude("header.php");if (!$_GET['nume']) {?> <form action="raport2.php" method="get">

<p>Nume domeniu: <select name="nume"> <?php

$sql = "select * from domenii";$rezultat = mysql_query($sql);$nrDomenii = mysql_num_rows($rezultat);for ($i=0; $i <$nrDomenii; $i++) {

$row = mysql_fetch_array($rezultat);echo '<option value="'.$row['idDomeniu'].'">'.

$row['nume'].'</option>';}

?></select>

</p> </br> <input type="submit" value="Afiseaza"/></form>

<?phpexit();} $idDomeniu = $_GET['nume'];

$sql = "select * from resurse where idDomeniu=$idDomeniu";$rezultat = mysql_query($sql);$nrResurse = mysql_num_rows($rezultat);

if ($nrResurse==0) {echo '<p>Nu s-au gasit resurse in acest domeniu.</p>';exit();

} else {echo "<p>S-au gasit $nrResurse rezultat(e).</p>";

}

48

for ($i=0; $i <$nrResurse; $i++) {$row = mysql_fetch_array($rezultat);

$idResursa = $row['idResursa'];

echo '<p>Identificator resursa: '.$row['idResursa'].'</p>';echo '<p>Titlu: '.$row['titlu'].'</p>';echo '<p>An: '.$row['anAparitie'].'</p>';echo '<p>Editura: '.$row['editura'].'</p>';echo '<p>Numar exemplare: '.$row['nrExemplare'].'</p>';echo '<p>Observatii: '.$row['observatii'].'</p>';

echo '<p class="horizline">&nbsp;</p> <tr>';}include("footer.php");?>

Modificare<?phpinclude("header.php");if (!$_GET['operatie'] && $_GET['operatie']!='Salvare') {?>

<form action="modificare.php" method="get"> <p>Identificator: <input type="text" name="id" maxlength="100" size="50"><p>Tip: <input type="radio" name="tip" value="Resursa"

checked>resursa</input><input type="radio" name="tip" value="Cititor">cititor</input><input type="radio" name="tip" value="Autor">autor</input><input type="radio" name="tip" value="Domeniu">domeniu</input></p><p>Operatie: <input type="radio" name="operatie" value="Modificare"

checked>Modificare</input><input type="radio" name="operatie"

value="Stergere">Stergere</input></p> <br> <input type="submit" value="Executa"/>

</form><?phpexit();} $id = $_GET['id'];$tip= $_GET['tip'];$operatie= $_GET['operatie'];if ($operatie!='Salvare') {

if ($tip=="Resursa") {$sql = "select * from resurse where idResursa=".$id."";$deleteSql = "delete from resurse where idResursa=".$id."";

49

}if ($tip=="Cititor") {

$sql = "select * from cititori where idCititor=".$id."";$deleteSql = "delete from cititori where idCititor=".$id."";

}if ($tip=="Autor") {

$sql = "select * from autori where idAutor=".$id."";$deleteSql = "delete from autori where idAutor=".$id."";

}if ($tip=="Domeniu") {

$sql = "select * from domenii where idDomeniu=".$id."";$deleteSql = "delete from domenii where idDomeniu=".$id."";

}$rezultat = mysql_query($sql);$nrInregistrari = mysql_num_rows($rezultat);if ($nrInregistrari==0) {

echo '<p>Identificatorul dat nu a fost gasit.</p>';exit();

}if ($nrInregistrari>1) {

echo '<p>Se poate modifica o singura inregistrare odata. Introdu o alta valoare pt identificator astfel incat sa identifice o singura inregistrare.</p>';

exit();}$row = mysql_fetch_array($rezultat, MYSQL_NUM);$id = $row[0];

}if ($operatie=='Stergere') {

if ($tip=="Domeniu") {$rezultat = mysql_query("select * from resurse where idDomeniu=$id");if (mysql_num_rows($rezultat)!=0) {

echo '<p>Domeniul nu poate fi sters. Stergeti mai intai resursele care sunt din acest domeniu.</p>';

exit();}

}if ($tip=="Cititor") {

$rezultat = mysql_query("select * from imprumuturi where idCititor=$id");if (mysql_num_rows($rezultat)!=0) {

echo '<p>Cititorul nu poate fi sters intrucat figureaza ca avand imprumutate resurse. Trebuie mai intai returnate resursele si apoi poate fi sters.</p>';

exit();}

}if ($tip=="Resursa") {

$rezultat = mysql_query("select * from imprumuturi where idResursa=$id");

if (mysql_num_rows($rezultat)!=0) {echo '<p>Resursa nu poate fi stearsa intrucat figureaza ca

imprumutata. Returnati-o mai intai si apoi stergeti-o.</p>';exit();

50

}}if ($tip=="Autor") {

$rezultat = mysql_query("select * from autoriresursa where idAutor=$id");if (mysql_num_rows($rezultat)!=0) {

echo '<p>Autorul nu poate fi sters. Stergeti mai intai resursele care sunt scrise de acest autor.</p>';

exit();}

}$inregistrariSterse = 0;$rezultat = mysql_query($deleteSql);if ($rezultat)

$inregistrariSterse += mysql_affected_rows();if ($tip=="Resursa") {

$rezultat = mysql_query("delete from autoriresursa where idResursa=$id");}

if ($rezultat) {echo "<p>S-au sters $inregistrariSterse inregistrari.</p>";

} else {echo "<p>Eroare: Nu s-a putut sterge.</p>";

}

}

// Acelasi cod ca la inserare.php.if ($operatie=='Salvare') {

//Observatii modificarea autorilor unei carti presupune stergerea din tabela autoriResursa a celor vechi si introducerea de legaturi noi

//La fel cititorul tb sa existe precum si domeniul.if ($tip=="resursa") {

// $sql = "select * from resurse where idDomeniu=".$id."";// $row = mysql_fetch_array($rezultat);

$titlu = $_GET['titlu'];$autori = explode(',', $_GET['autori']);for ($i=0; $i<count($autori);$i++) {

$idAutor = $autori[$i];$rezultat = mysql_query("select * from autori where idAutor=".

$idAutor."");$nr = mysql_num_rows($rezultat);if ($nr==0) {

echo "<p>Eroare: Autorul cu identificatorul $idAutor nu a fost gasit.</p>";

exit();}

}$anAparitie = $_GET['anAparitie'];$editura = $_GET['editura'];

51

$nrExemplare = $_GET['nrExemplare'];$idDomeniu = $_GET['idDomeniu'];$rezultat = mysql_query("select * from domenii where idDomeniu=".

$idDomeniu."");$nr = mysql_num_rows($rezultat);if ($nr==0) {

echo "<p>Eroare: Domeniul cu identificatorul $idDomeniu nu a fost gasit.</p>";

exit();}$observatii = $_GET['observatii'];$rezultat = mysql_query("update resurse set titlu='$titlu',

anAparitie=$anAparitie, editura='$editura', nrExemplare=$nrExemplare, idDomeniu=$idDomeniu, observatii='$observatii' where idResursa=$id");

// Mai intai sterge orice legatura in autoriresurse.mysql_query("delete from autoriresursa where idResursa=$id");// Insereaza si in tabela ce mapeaza autorii la resurse.for ($i=0; $i<count($autori);$i++) {

$idAutor = $autori[$i];mysql_query("insert into autoriresursa values ($id, $idAutor)");

}}if ($tip=="autor") {

$nume = $_GET['nume'];$observatii = $_GET['observatii'];$rezultat = mysql_query("update autori set nume='$nume',

observatii='$observatii' where idAutor=$id");}if ($tip=="cititor") {

$nume = $_GET['nume'];$CNP = $_GET['CNP'];$adresa = $_GET['adresa'];$tel = $_GET['tel'];$email = $_GET['email'];$observatii = $_GET['observatii'];$rezultat = mysql_query("update cititori set nume='$nume', CNP='$CNP',

adresa='$adresa', tel='$tel', email='$email', observatii='$observatii' where idCititor=$id");}if ($tip=="domeniu") {

$nume = $_GET['nume'];$rezultat = mysql_query("update domenii set nume='$nume' where

idDomeniu=$id");}

if ($rezultat) {$nr = mysql_affected_rows();echo "<p>S-a modificat $nr inregistrare.</p>";

} else {echo '<p>Nu s-a putut modifica.</p>';

}}

52

if ($operatie=='Modificare') {echo "<form action='modificare.php' method='get'>";echo '<input type="hidden" name="operatie" value="Salvare"/>';

$rezultat = mysql_query($sql);$row = mysql_fetch_array($rezultat);

if ($tip=="Domeniu") {$id = $row['idDomeniu'];$nume = $row['nume']; echo "<p>Nume:<input type='text' name='nume' maxlength='50' size='50'

value='$nume'/></p>";

echo '<input type="hidden" name="id" value="'.$id.'"/>';echo '<input type="hidden" name="tip" value="domeniu"/>';

}

if ($tip=="Autor") {$id = $row['idAutor'];$nume = $row ['nume'];$observatii = $row['observatii'];echo '<p>Nume:<input type="text" name="nume" value="'.$nume.'"

maxlength="50" size="50"/></p>';echo '<p>Observatii:<textarea cols="38" rows="3" value="'.

$observatii.'"name="observatii"></textarea></p>';

echo '<input type="hidden" name="id" value="'.$id.'"/>';echo '<input type="hidden" name="tip" value="autor"/>';

}

if ($tip=="Cititor") {$id = $row['idCititor'];$nume = $row ['nume'];$CNP = $row['CNP'];$adresa = $row['adresa'];$tel = $row['tel'];$email = $row['email'];$observatii = $row['observatii'];echo '<p>Nume:<input type="text" name="nume" value="'.$nume.'"

maxlength="50" size="50"/></p>';echo '<p>CNP:<input type="text" name="CNP" value="'.$CNP.'"

maxlength="13" size="13"/></p>';echo '<p>Adresa:<input type="text" name="adresa" value="'.$adresa.'"

maxlength="100" size="50"/></p>';echo '<p>Tel:<input type="text" name="tel" value="'.$tel.'"

maxlength="50" size="50"/></p>';echo '<p>Email:<input type="text" name="email" value="'.$email.'"

maxlength="50" size="50"/></p>';echo '<p>Observatii:<textarea cols="38" rows="3" name="observatii"

value="'.$observatii.'"></textarea></p>';

53

echo '<input type="hidden" name="id" value="'.$id.'"/>';echo '<input type="hidden" name="tip" value="cititor"/>';

}if ($tip=="Resursa") {

$id = $row['idResursa'];$titlu = $row['titlu'];$anAparitie = $row['anAparitie'];$editura = $row['editura'];$nrExemplare = $row['nrExemplare'];$idDomeniu = $row['idDomeniu'];

$autori="";$cerere2= "select * from autoriResursa where idResursa='".$id."'";$rezultat2 = mysql_query($cerere2);for ($j=0; $j <mysql_num_rows($rezultat2); $j++) {

$autorResursa = mysql_fetch_array($rezultat2);$autori = $autori.$autorResursa['idAutor'];if ($j<mysql_num_rows($rezultat2)-1) {

$autori = $autori.",";}

}$observatii = $row['observatii'];echo '<p>Titlu:<input type="text" name="titlu" value="'.$titlu.'"

maxlength="100" size="50"/></p>';echo '<p>Identificatori autori separati prin virgula:<input type="text"

name="autori" value="'.$autori.'" maxlength="200" size="25"/></p>';echo '<p>An aparitie:<input type="text" name="anAparitie" value="'.

$anAparitie.'" maxlength="10" size="3"/></p>';echo '<p>Editura:<input type="text" name="editura" value="'.$editura.'"

maxlength="50" size="25"/></p>';echo '<p>Numar exemplare:<input type="text" name="nrExemplare"

value="'.$nrExemplare.'" maxlength="3" size="3"/></p>';echo '<p>Identificator domeniu:<input type="text" name="idDomeniu"

value="'.$idDomeniu.'" maxlength="7" size="3"/></p>';echo '<p>Observatii:<textarea cols="38" rows="3"

name="observatii"value="'.$observatii.'" ></textarea></p>';echo '<input type="hidden" name="id" value="'.$id.'"/>';echo '<input type="hidden" name="tip" value="resursa"/>';

}echo "<input type='submit' value='Modifica'/></form>";

}include("footer.php");?>

Listare<?php

54

include("header.php");$cerere = "select * from resurse";$rezultat = mysql_query($cerere);$nrResurse = mysql_num_rows($rezultat);echo '<p>Numarul de resurse gasite: '.$nrResurse.'</p>';for ($i=0; $i <$nrResurse; $i++) {

$row = mysql_fetch_array($rezultat);echo '<p><strong>Id:';

echo htmlspecialchars(stripslashes($row['idResursa'])); echo '</strong><p><strong>Titlu: '; echo htmlspecialchars(stripslashes($row['titlu'])); echo '</strong><br>Autorii: ';

$cerere2= "select * from autoriResursa where idResursa='".$row['idResursa']."'";$rezultat2 = mysql_query($cerere2);for ($j=0; $j <mysql_num_rows($rezultat2); $j++) {

$autorResursa = mysql_fetch_array($rezultat2);$cerere3= "select * from autori where idAutor='".

$autorResursa['idAutor']."'";$rezultat3 = mysql_query($cerere3);for ($k=0; $k <mysql_num_rows($rezultat3); $k++) {

$autor = mysql_fetch_array($rezultat3);echo $autor['nume']."<br>";

}}echo 'Observatii:';echo htmlspecialchars(stripslashes($row['observatii']));

}$cerere = "select * from cititori";$rezultat = mysql_query($cerere);$nrCititori = mysql_num_rows($rezultat);echo '<p class="horizline">&nbsp;</p> <tr> <p>Numarul de cititori gasiti: '.$nrCititori.'</p>';for ($i=0; $i <$nrCititori; $i++) {

$row = mysql_fetch_array($rezultat);echo '<p><strong> Id: ';

echo htmlspecialchars(stripslashes($row['idCititor'])); echo '<p>Nume: '; echo htmlspecialchars(stripslashes($row['nume']))."<br>"; echo '</strong><p>CNP: '; echo htmlspecialchars(stripslashes($row['CNP']))."<br>"; echo '<p>Adresa: '; echo htmlspecialchars(stripslashes($row['adresa']))."<br>"; echo '<p>Tel: '; echo htmlspecialchars(stripslashes($row['tel']))."<br>"; echo '<p>Email: '; echo htmlspecialchars(stripslashes($row['email']))."<br>"; echo 'Observatii: '; echo htmlspecialchars(stripslashes($row['observatii']));}$cerere = "select * from autori";$rezultat = mysql_query($cerere);

55

$nrAutori = mysql_num_rows($rezultat);echo '<p class="horizline">&nbsp;</p> <tr> <p>Numarul de autori gasiti: '.$nrAutori.'</p>';for ($i=0; $i <$nrAutori; $i++) {

$row = mysql_fetch_array($rezultat);echo '<p><strong> Id: ';

echo htmlspecialchars(stripslashes($row['idAutor'])); echo '<p>Nume: '; echo htmlspecialchars(stripslashes($row['nume']))."<br>"; echo '</strong>Observatii: '; echo htmlspecialchars(stripslashes($row['observatii']));}$cerere = "select * from domenii";$rezultat = mysql_query($cerere);$nrDomenii = mysql_num_rows($rezultat);echo '<p class="horizline">&nbsp;</p> <tr> <p>Numarul de domenii gasite: '.$nrDomenii.'</p>';for ($i=0; $i <$nrDomenii; $i++) {

$row = mysql_fetch_array($rezultat);echo '<strong><p>Id: ';

echo htmlspecialchars(stripslashes($row['idDomeniu'])); echo '<br>Nume: '; echo htmlspecialchars(stripslashes($row['nume'])).'</strong>';} include("footer.php");?>

Împrumutare<?phpinclude("header.php");if (!$_GET['idResursa']) {?> <form action="imprumutare.php" method="get">

<p>Identificator resursa: <input type="text" name="idResursa" maxlength="7" size="3"></p>

<p>Identificator cititor: <input type="text" name="idCititor" maxlength="7" size="3"></p>

<p>Numar exemplare: <input type="text" name="nrExemplare" maxlength="7" size="3"></p>

<p>Data sfarsit (Ex: 2010-05-09): <input type="text" name="sfarsit" maxlength="10" size="10"></p>

</br><input type="submit" value="Imprumuta"/>

</form><?php

exit();

56

} $idResursa = $_GET['idResursa'];$idCititor = $_GET['idCititor'];$nrExemplareDorite = $_GET['nrExemplare'];$sfarsit = $_GET['sfarsit'];$rezultat = mysql_query("select * from cititori where idCititor=".$idCititor."");$nr = mysql_num_rows($rezultat);if ($nr==0) {

echo '<p>Cititorul cu identificatorul dat nu a fost gasit.</p>';exit();

}$rezultat = mysql_query("select * from resurse where idResursa=".$idResursa."");$nrResurse = mysql_num_rows($rezultat);if ($nrResurse==0) {

echo '<p>Resursa cu identificatorul dat nu a fost gasita.</p>';exit();

}$row = mysql_fetch_array($rezultat);$nrExemplare = $row['nrExemplare'];// Verifica ca nu e deja imprumutata.$rezultat = mysql_query("select * from imprumuturi where idResursa=".$idResursa."");$nrImprumuturi = mysql_num_rows($rezultat);$nrExemplareImprumutate = 0;for ($i=0; $i <$nrImprumuturi; $i++) {

$row = mysql_fetch_array($rezultat);$nrExemplareImprumutate += $row['nrExemplare'];

}$rezultat2 = mysql_query("select * from resurse where idResursa=".

$idResursa."");$resursa = mysql_fetch_array($rezultat2);if ($resursa['nrExemplare']-$nrExemplareImprumutate<$nrExemplareDorite) {

echo '<p>Nu se poate imprumuta. Mai exista doar '.(($resursa['nrExemplare']-$nrExemplareImprumutate)).' exemplare care pot fi imprumutate.</p>';

exit();}

$rezultat = mysql_query("insert into imprumuturi values ($idCititor, $idResursa, $nrExemplareDorite, curdate(), '$sfarsit')");if ($rezultat) echo mysql_affected_rows().' resursa imprumutata.'; echo '<p>Resursa a fost imprumutata.</p>';include("footer.php");?>

Căutare<?phpinclude("header.php");

57

if (!$_GET['id']) {?> <form action="cautare.php" method="get">

<p>Nume sau doar o parte din nume(titlu, nume autor, nume cititor, domeniu):

<input type="text" name="id" maxlength="100" size="50"><p><input type="radio" name="tip" value="Resursa"

checked>resursa</input><input type="radio" name="tip" value="Autor">autor</input><input type="radio" name="tip" value="Cititor">cititor</input><input type="radio" name="tip"

value="Domeniu">domeniu</input></p> </br>

<input type="submit" value="Cauta"/></form>

<?phpexit();} $id = $_GET['id'];$tip= $_GET['tip'];if ($tip=="Resursa") {

$sql = "select * from resurse where titlu like '%".$id."%'";}if ($tip=="Autor") {

$sql = "select * from autori where nume like '%".$id."%'";}if ($tip=="Cititor") {

$sql = "select * from cititori where nume like '%".$id."%'";}if ($tip=="Domeniu") {

$sql = "select * from domenii where nume like '%".$id."%'";}$rezultat = mysql_query($sql);$nr = mysql_num_rows($rezultat);if ($nr==0) {

echo '<p>Inregistrarea cu identificatorul dat nu a fost gasit.</p>';exit();

} else {echo "<p>S-au gasit $nr rezultat(e).</p>";$nrCol = mysql_num_fields($rezultat);

}while ($row = mysql_fetch_assoc($rezultat)) {

foreach($row as $name => $value) {print "<p>$name : $value</p>";

}echo '<p class="horizline">&nbsp;</p> <tr>';

}include("footer.php");?>

Adăugare resurse58

<?php include("header.php");

?> <ul id="tabmenu">

<li><a class="active" href="adaugareResursa.php">Resursa</a></li><li><a href="adaugareAutor.php">Autor</a></li><li><a href="adaugareCititor.php">Cititor</a></li><li><a href="adaugareDomeniu.php">Domeniu</a></li>

</ul><div id="sidebar2">

<p>Titlu</p><p>Identificatori autori*</p><p>An aparitie</p><p>Editura</p><p>Numar exemplare</p><p>Identificator domeniu</p><p>Observatii</p><br><br><br><br><br><br><br><br>* Autorul (precum si domeniul) tb introdus inaintea resursei, pentru ai afla

identificatorul iar in caz ca sunt mai multi autori, identificatorii ii introduceti separati prin virgula.

</div> <div id="mainpage2">

<form action="inserare.php?tip=resursa" method="get"> <p><input type="text" name="titlu" maxlength="100"

size="50"/></p> <p><input type="text" name="autor" maxlength="200"

size="25"/></p> <p><input type="text" name="anAparitie" maxlength="10"

size="3"/></p> <p><input type="text" name="editura" maxlength="50"

size="25"/></p> <p><input type="text" name="nrExemplare" maxlength="3"

size="3"/></p> <p><input type="text" name="idDomeniu" maxlength="7"

size="3"/></p><p><textarea cols="38" rows="3"

name="observatii"></textarea></p><br><input type="hidden" name="tip" value="resursa"/>

<input type="submit" value="Adauga"/></form>

</div><?php

include("footer.php");?>

Adăugare domeniu

59

<?php include("header.php");

?> <ul id="tabmenu">

<li><a class="active" href="adaugareResursa.php">Resursa</a></li><li><a href="adaugareAutor.php">Autor</a></li><li><a href="adaugareCititor.php">Cititor</a></li><li><a href="adaugareDomeniu.php">Domeniu</a></li>

</ul><div id="sidebar2">

<p>Nume domeniu</p></div>

<div id="mainpage2"> <form action="inserare.php?tip=domeniu" method="get">

<p><input type="text" name="nume" maxlength="50" size="50"/></p> <input type="hidden" name="tip" value="domeniu"/>

<input type="submit" value="Adauga"/></form>

</div><?php

include("footer.php");?>

Adăugare cititor<?php

include("header.php");?> <ul id="tabmenu">

<li><a class="active" href="adaugareResursa.php">Resursa</a></li><li><a href="adaugareAutor.php">Autor</a></li><li><a href="adaugareCititor.php">Cititor</a></li><li><a href="adaugareDomeniu.php">Domeniu</a></li>

</ul><div id="sidebar2">

<p>Nume</p><p>CNP</p><p>Adresa</p><p>Tel</p><p>E-mail</p><p>Observatii</p><br><br><br><br><br><br><br><br>

</div> <div id="mainpage2">

<form action="inserare.php?tip=cititor" method="get"> <p><input type="text" name="nume" maxlength="50"

size="50"/></p> <p><input type="text" name="CNP" maxlength="13"

size="13"/></p>

60

<p><input type="text" name="adresa" maxlength="100" size="50"/></p>

<p><input type="text" name="tel" maxlength="50" size="50"/></p>

<p><input type="text" name="email" maxlength="50" size="50"/></p>

<p><textarea cols="38" rows="3" name="observatii"></textarea></p><br>

<input type="hidden" name="tip" value="cititor"/>

<input type="submit" value="Adauga"/></form>

</div>

<?php include("footer.php");

?>

Adăugare autor<?php

include("header.php");?> <ul id="tabmenu">

<li><a href="adaugareResursa.php">Resursa</a></li><li><a class="active" href="adaugareAutor.php">Autor</a></li><li><a href="adaugareCititor.php">Cititor</a></li><li><a href="adaugareDomeniu.php">Domeniu</a></li>

</ul><div id="sidebar2">

<p>Nume</p><p>Observatii</p><br><br><br><br><br><br><br><br>* Autorul tb introdus inaintea cartii, pentru ai afla identificatorul iar in caz

ca sunt mai multi separatii prin virgula.</div>

<div id="mainpage2"> <form action="inserare.php" method="get">

<p><input type="text" name="nume" maxlength="50" size="50"/></p>

<p><textarea cols="38" rows="3" name="observatii"></textarea></p><br>

<input type="hidden" name="tip" value="autor"/><input type="submit" value="Adauga"/>

</form></div>

<?php include("footer.php");

?>

61