Sunteți pe pagina 1din 54

Studiu privind sistemul de gestiune al bazelor de date

Short English Presentation

This project represents an intuitive and dynamic web application useful to students. The reason that this program was made is to improve the ways of teaching FoxPro in high schools. As an application this project offers an interactive way of showing formulae that are used to make FoxPro databases thorugh an easy web interface, every command is explained step by step showing how it works.

Pagina 1 din 54

Capitolul I Cuvant inainte In viata noastra de zi cu zi, calculatoarele sunt ceva obisnuit, ba chiar indinspensabil in unele cazuri. Se poate spune, pe drept cuvant ca traim intr-o societate informatizata. In zilele noastre, intalnim calculatoare peste tot, de la bacanul din colt, care-si tine evidentele sale cu ajutorul unui PC si pana la ghiseul la care platim telefonul. Peste tot sunt calculatoare, legate eventual intre ele si formand astfel retele de calculatoare. Toate acestea se datoreaza faptului ca ne dam seama din ce in ce mai mult ca PC-ul ne usureaza munca. Dar trebuie de subliniat faptul ca un calculator este de fapt o masinarie care prelucreaza o serie de informatii pe care i le dam. Informatia, este elementul esential din acest intreg lant. De fapt, in practica intalnim, printre altele, doua concepte legate de aceasta si anume sistemul informational si sistemul informatic. Prin aceasta aplicatie am incercat sa realizez o metoda de invatare a limbajului FoxPro pentru elevi/studenti. Metoda este vizuala, utilizatorii realizand operatii de creare, modificare, adaugare elemente la baza de date doar apasand un buton. In acelasi timp li se prezinta codul ce-l utilizeaza FoxPro pentru efectuarea acestor operatiuni. Fisierele cu baza de date, unde se stocheaza informatia, se pot folosi in cadrul limbajului FoxPro, aceste fisiere avand extensia .dbf.

Pagina 2 din 54

Capitolul II Introducere 2.1. Cum si cand a aparut INTERNET-ul? Reteaua Internet a aparut acum 21 de ani, printr-un efort de a conecta reteaua Departamentului Apararii Statelor Unite (cunoscuta sub numele de ARPAnet - Advanced Research Projects Agency) cu alte retele conectate prin dispozitive radio sau satelit. ARPAnet a fost o retea experimentala proiectata sa asigure suportul pentru cercetarea militara - in particular cercetari privind construirea unor retele care puteau rezista cu succes unor intreruperi partiale. Una din cele mai importante retele noi aparute ulterior a fost NSFNET, infiintata de NSF (National Science Fundation), o agentie guvernamentala americana. Spre sfirsitul anilor `80 aceasta organizatie a creat cinci noduri de comunicatii puternice in centrele universitare americane cele mai importante. Problema care aparea acum era datorata costului ridicat al serviciului telefonic prin linii telefonice inchiriate pe distante foarte mari. Solutia a constat in infiintarea unor centre regionale. Astfel aproape fiecare campus universitar a fost conectat la centrul Internet cel mai apropiat. 1982 - ARPANet s-a unit cu MILNet (Retea militara) cu NSFNet (cercetatori si oameni de stiinta) si cu alte retele (de exemplu BITNet si USENet, retele concepute pentru schimbul de stiri). Acum in anul 2002 Internet creste cu o viteza pe care cercetatorii sau fondatorii acestei retele nici nu au visat-o. Noi companii se lanseaza cu o viteza fenomenala si multe persoane acceseaza Internet prin distribuitori sau servicii familiare. Astfel la ora actuala sunt peste 63000 de sisteme de retele direct accesibile prin Internet.

Pagina 3 din 54

Capitolul III Date teoretice 2.2. PHP PHP este una dintre cele mai interesante tehnologii existente in prezent. Deoarece imbina caracteristici dintre cele mai complexe cu simplitatea in utilizare, PHP a devenit rapid un instrument de frunte pentru dezvoltarea aplicatiilor in Web. Totusi, spre deosebire de alte instrumente populare pentru dezvoltarea aplicatiilor Web, cum este Perl, PHP este un limbaj de programare comod pentru incepatori, chiar si pentru cei care nu au mai desfasurat activitati de programare in trecut. Ca si alte limbaje de scripting pentru Web, PHP permite furnizarea unui continut Web dinamic, adica un continut Web care se modifica automat de la o zi la alta sau chiar de la un minut la altul. Continutul Web este un element important in sustinerea traficului unui site Web; de regula, vizitatorii nu vor mai reveni la o pagina Web care contine aceleasi informatii ca si cele prezentate la ultima vizita. Mai mult, spre deosebire de limbajele de scripting, precum JavaScript, PHP ruleaza pe serverul Web, nu in browserul Web. In consecinta, PHP poate obtine accesul la fisiere, baze de date si alte resurse inaccesibile programului JavaScript. Acestea constituie bogate surse de continut dinamic. Un script PHP poate fi foarte simplu sau foarte complex. Totusi, crearea chiar si a unui script PHP complex este extrem de simpla, necesitand numai un editor de texte obisnuit. Pentru a crea scripturi PHP, majoritatea programatorilor PHP folosesc un editor de texte obisnuit. Sub Microsoft Windows, se foloseste frecvent programul Windows Notepad. Se poate totusi folosi WordPad sau chiar un procesor de texte, precum Microsoft Word. Totusi, trebuie sa fie salvat scriptul sub forma de document text; in caz contrar, fisierul script contine informatii de formatare care vor deruta serverul PHP. Pentru utilizatorii ce folosesc UNIX sau Linux, se pot crea scripturi PHP folosind un program precum vi, emacs sau pico. Programul in sine nu conteaza, atata vreme cat poate crea fisiere text ASCII. 2.2.1. Scrierea scheletului programelor PHP Fiecare program PHP include doua linii speciale, care indica serverului PHP ca textul cuprins intre cele doua linii este alcatuit din instructiuni PHP.
Pagina 4 din 54

Unele editoare de texte, precum HomeSite al firmei Allaire, asigura colorarea elementelor de sintaxa si alte caracteristici care vin in sprijinul programatorilor PHP, precum manualele on-line si constructorii de expresii. Cateva caracteristici importante ale limbajului PHP: Numele fisierului trebuie sa fie alcatuit numai din caractere minuscule, cifre si liniute. Utilizarea spatiilor si a altor caractere este interzisa. Extensia numelui fisierelor trebuie sa fie . php. Crearea datelor de iesire pentru un browser Web Programele PHP executa trei categorii de operatii elementare: Obtin date de la un utilizator. Executa prelucrari ale datelor, respectiv obtin accesul la datele stocate in fisiere si baze de date si le manipuleaza. Afiseaza date astfel incat un utilizator sa le poata vizualiza. Primele doua operatii sunt oarecum mai dificil de realizat decat cea de-a treia. Totusi, afisarea datelor astfel incat acestea sa fie vizibile utilizatorului este o operatie foarte simpla. Parantezele si ghilimelele duble se folosesc pentru delimitarea unei expresii de tip text. In afara de a furniza nume descriptive fisierelor care contin scripturile PHP, trebuie inclus in fiecare script atat comentarii care sa permita unui cititor sa determine cu usurinta utilitatea scriptului, cat si alte informatii referitoare la script. Un comentariu incepe cu doua caractere slash, urmate de un spatiu. In continuare, linia contine comentariul dumneavoastra, care poate include orice caractere doriti, inclusiv caractere speciale. Pentru a incepe un comentariu alcatuit din mai multe linii, se folosesc caracterele /*, iar pentru a incheia comentariul caracterele */. Intre cele doua perechi de caractere, se poate scrie orice text, folosind oricate linii. 2.2.2. Elementele constructive ale limbajului PHP Numere si siruri
Pagina 5 din 54

Programele de calculator manipuleaza datele, care reprezinta informatii. Programele PHP folosesc doua categorii principale de date: numere si siruri. Numerele sunt compuse mai ales din cifre, in timp ce un sir poate contine orice caracter, inclusiv cifre, litere si simboluri speciale. Decizia privind modul de stocare a datelor este importanta, in mod caracteristic, datele se stocheaza sub forma de numere atunci cand se doreste executarea unor operatii matematice asupra datelor, deoarece numerele sunt stocate intr-un mod care permite efectuarea de calcule. Pe de alta parte, sirurile sunt stocate folosind o modalitate care faciliteaza intelegerea lor de catre operatorul uman. Datele trebuie stocate sub forma de siruri daca formatul acestora nu este numeric sau daca doriti ca operatorul uman sa fie capabil de a introduce sau de a vizualiza datele. Practic, se poate asimila numerele cu un mod de stocare a datelor in interiorul calculatorului, in speta un format intern. Sirurile se pot asimila unui mod de stocare a datelor in afara calculatorului, in speta un format extern. Numere PHP foloseste doua categorii de numere: intregi si duble. Numerele intregi reprezinta numerele fara parte fractionara folosite la numarare, plus zero si numerele negative. Cu alte cuvinte, in PHP termenul de intreg are aceeasi semnificatie ca si in matematica. De exemplu, numarul 100 poate fi reprezentat in PHP sub forma de intreg. Numerele duble, spre deosebire de intregi, reprezinta valori numerice care pot include fractii zecimale, ca de exemplu 2,5. Numerele duble sunt sinonime cu numerele reale din matematica. Uneori, numerele duble mai sunt denumite si numere cu virgula mobila. Deoarece PHP stocheaza numerele in calculatoare, care dispun de o cantitate limitata de memorie, numerele intregi si duble din PHP difera de omoloagele lor matematice prin aceea ca precizia lor este limitata, in general, numerele intregi sunt stocate sub forma de valori pe 32 de biti, ceea ce le limiteaza la domeniul cuprins intre -2.147.483.648 si 2.147.483.647 inclusiv. Totusi, unele calculatoare stocheaza numerele PHP intregi intr-un mod mai compact, limitand si mai mult domeniul de valori posibile. In general, numerele duble sunt stocate folosindu-se formatul standard IEEE-64, care furnizeaza 64 de biti. Acest format va permite sa stocati valori care pot merge pana la 1,8 x 10 la puterea 308 sub forma de numere duble si furnizeaza aproximativ 14 cifre dupa punctul zecimal (sau cifre semnificative) de precizie.

Pagina 6 din 54

Scrierea numerelor PHP este simpla. Un intreg PHP se obtine prin scrierea cifrelor care ii alcatuiesc valoarea. Daca valoarea este negativa, se scrie un semn minus imediat la stanga numarului. Un numar PHP dublu se scrie cu ajutorul unei serii de cifre, plasand un punct zecimal la locatia adecvata. Ca in cazul intregilor PHP, daca valoarea este negativa, se scrie un semn minus imediat la stanga numarului. De asemenea, din nou similar cu numerele PHP intregi, trebuie sa evitati a scrie spatii sau virgule ca parte a unui numar dublu. Cand se scrie numere duble foarte mari sau foarte mici, se poate folosi o forma speciala, care arata astfel: 2.3e4. Numarul plasat dupa litera e determina inmultirea cu 10 la puterea data de numarul respectiv a numarului plasat anterior literei respective. Siruri Spre deosebire de intregi si de numere duble, care contin cu precadere cifre, sirurile pot contine orice caracter. Ca atare, sirurile sunt utile pentru stocarea datelor care nu pot fi calculate, precum nume si adrese. De asemenea, sirurile pot fi utilizate pentru stocarea datelor numerice. Reprezentarile sub forma de numere intregi si duble sunt folosite, in general, numai in interiorul calculatoarelor; de regula, datele sunt introduse in calculatoare si afisate de catre acestea sub forma de siruri. Pentru a specifica un sir in PHP, caracterele care alcatuiesc sirul sunt incluse intre ghilimele duble. PHP faciliteaza includerea in siruri a unor caractere speciale, precum caracterele de salt la linie noua sau retur de car, prin furnizarea de secvente escape care reprezinta caractere speciale. Iata secventele escape folosite in PHP: \n salt la linie noua \r retur de car \t caracter de tabulare pe orizontala \\ backslash \$ simbolul dolarului \ ghilimele duble Valori literale si variabile Categoriile de valori despre care ati invatat pana acum se numesc valori literale. Deseori, este convenabil sa atribui un nume unei valori, similar procedeului comun folosit in
Pagina 7 din 54

algebra. O valoare cu nume se numeste variabila, deoarece este posibila modificarea valorii asociate numelui. Prin contrast, o valoare literala este fixa. Desi se pot folosi litere majuscule sau minuscule in numele variabilelor, diferenta dintre literele scrise cu majuscule si cele scrise cu minuscule este importanta. Variabila denumita $A nu este una si aceeasi cu variabila $a. Numele variabilei este urmat de un semn egal (=), care identifica instructiunea ca fiind o instructiune de atribuire. Semnul egal este urmat de valoarea care urmeaza a fi atribuita variabilei. Caracterul punct si virgula (;) marcheaza sfarsitul instructiunii. Ca o valoare literala, o variabila poate avea o valoare de tip intreg, dublu sau sir. Forma valorii unei variabile se numeste tipul variabilei. Tipul unei variabile se poate modifica daca atribuiti variabilei o valoare de un tip diferit fata de cel al valorii curente a variabilei. Deseori este convenabila stocarea mai multor valori intr-o variabila. O asemenea variabila se numeste tablou, iar valorile individuale se numesc elementele tabloului. Variabilele care au o singura valoare se numesc scalare. Pentru a fi posibil accesul individual la fiecare element al unui tablou, fiecare element are o cheie asociata. Se poate asimila numele unui tablou cu numele de familie al tuturor elementelor sale. Similar, cheia unui element este echivalenta cu numele de botez al elementului respectiv. Combinatia intre numele tabloului (numele de familie) si valoarea unei chei (numele de botez) identifica un element al tabloului. Pentru a crea un tablou, se atribuie unui element al tabloului o valoare si o cheie. Exemplu: $clasa[1] = geometrie; creeaza un tablou denumit $clasa si un element cu valoarea "geometrie" identificat prin cheia 1. Pentru a stoca in tablou o a doua valoare, se poate folosi urmatoarea instructiune de atribuire: $clasa[2] = contabilitate; Pentru a obtine acces la un element al tabloului, se specifica numele tabloului si valoarea cheii. De exemplu, instructiunea de atribuire

Pagina 8 din 54

$clasa_mate = $clasa[1]; atribuie valoarea "geometrie" variabilei scalare $clasa_mate. Cheile folosite pentru identificarea elementelor unui tablou nu trebuie sa fie numere consecutive; nici macar nu trebuie sa fie numere.

Operatori si functii Pentru a efectua calcule si prelucrari ale datelor, PHP include o diversitate de operatori si functii utile. Cand se combina valorile literale si variabilele cu operatori si functii, se construieste de fapt ceea ce este cunoscut sub numele de expresii. Operatori PHP include operatorii familiari folositi pentru executarea operatiilor aritmetice: + Adunare - Scadere * Inmultire / Impartire Variabilele sau valorile literale asociate cu un operator se numesc operanzi. O proprietate interesanta a operatorului de impartire este aceea ca returneaza o valoare intreaga daca ambii sai operanzi sunt intregi, iar rezultatul este un intreg; in caz contrar, returneaza o valoare cu virgula mobila. In afara de acesti operatori aritmetici familiari, PHP include numerosi operatori mai putin cunoscuti: % Modulo ++ Incrementare <<-- Decrementare Concatenare Similar operatorului de impartire, operatorul modulo executa o impartire; cu toate acestea, operatorul modulo returneaza restul, nu catul impartirii. In programare, operatiile de adaugare, respectiv de scadere a unei unitati dintr-o valoare sunt frecvent intalnite. Pentru comoditate, PHP include operatori care executa aceste

Pagina 9 din 54

operatii. Operatorul de incrementare adauga o unitate la valoarea unei variabile, iar operatorul de decrementare scade o unitate din valoarea unei variabile. Operatorii sunt utilizati astfel: ++$x; --$y; Trebuie retinut ca acesti operatori au nevoie de un singur operand, in timp ce majoritatea operatorilor necesita doi operanzi. Prima instructiune adauga o unitate la valoarea variabilei $x, in timp ce a doua instructiune scade o unitate din valoarea variabilei $y. Functii In afara de operatori, PHP include functii care executa operatii utile. Iata unele exemple de functii: abs(x) Returneaza valoarea absoluta a lui x ceil(x) Returneaza valoarea x, rotunjita la intregul imediat superior floor(x) Returneaza valoarea x, rotunjita la intregul imediat inferior rnax(x,y,...) Returneaza valoarea maxima a unui set de valori min(x,y,...) Returneaza valoarea minima a unui set de valori pow(x,n) Returneaza numarul x, ridicat la puterea specificata n strftime(f) Returneaza data curenta, formatata conform continutului parametrului f sqrt(x) Returneaza radacina patrata a lui x In afara de acestea, PHP include multe alte functii. Majoritatea functiilor necesita una sau mai multe valori de intrare, cunoscute sub numele de argumente. De exemplu, functia sqrt necesita un argument care specifica valoarea a carei radacina patrata trebuie calculata. Unele functii, precum min si max, preiau un numar nedefinit de argumente. Alte functii nu necesita nici un fel de argumente. Pentru a putea folosi o functie in mod corespunzator, trebuie sa cunoasteti: Numele functiei Actiunea functiei si valoarea returnata de aceasta, daca exista Numarul argumentelor preluate de functie Semnificatia fiecarui argument
Pagina 10 din 54

Eticheta FORM In interiorul corpului unei pagini HTML care contine un formular se poate folosi orice eticheta HTML obisnuita. Pentru a descrie formularul in sine, folositi eticheta FORM, care are urmatoarea forma elementara: <FORM METHOD="metoda" ACTION="url"> Atributul METHOD al etichetei FORM poate lua una din valorile GET sau POST. Atributul ACTION specifica adresa URL a scriptului PHP care prelucreaza datele adunate prin intermediul formularului. Adresa URL poate fi o adresa completa, care include protocolul, numele gazdei si calea de acces, respectiv o adresa partiala, care specifica o locatie relativa la locatia paginii curente, intre eticheta FORM si eticheta sa /FORM corespunzatoare, plasati controalele formularului. Obtinerea si utilizarea datelor de la o variabila de mediu Variabilele de mediu sunt folosite pentru stocarea optiunilor si a parametrilor care personalizeaza mediul de aplicatie. Aplicatiile pot obtine accesul la valorile variabilelor de mediu si isi pot ajusta comportamentul in consecinta. De exemplu, calea de cautare a programelor MS-DOS este stocata intr-o variabila de mediu denumita PATH. In general, comenzile sistemelor de operare sunt folosite pentru a configura variabilele de mediu si pentru a stabili valorile acestora. Cu toate acestea, unele aplicatii manipuleaza valorile variabilelor de mediu. Atat serverul Web Apache, cat si serverul de aplicatie PHP folosesc variabile de mediu pentru a prezenta informatii de stare. Multe dintre aceste variabile reflecta caracteristicile cererii HTTP care a solicitat executia PHP. Se poate vizualiza toate variabilele de mediu disponibile pentru programele PHP prin invocarea functiei phpinfo() si vizualizarea datelor de iesire generate de aceasta. Utilizarea constantelor O constanta este o valoare care nu se modifica, in acest sens, constantele sunt opusele variabilelor, deoarece valoarea unei variabile se poate modifica pe durata executiei unui program.

Pagina 11 din 54

Pentru a defini o constanta, folositi functia define(). Sa consideram urmatorul exemplu: define(PI, 3.14159); Aceasta instructiune defineste constanta PI, atribuindu-i valoarea 3.14159. Dupa ce a fost definita, o constanta se poate folosi in cadrul unei expresii. De exemplu, se poate calcula aria unui cerc dupa cum urmeaza: $arie = PI * $raza * $raza; Referintele la o constanta nu folosesc simbolul dolarului. Astfel, o constanta poate fi cu usurinta deosebita de o variabila. Pe langa sporirea lizibilitatii programelor, constantele pot facilita modificarea acestora. 2.3. HTML Html-ul este un limbaj de formatare a unui continut informational, care a aparut odata cu dezvoltarea InterNet-ului, ca un numitor comun al multitudinii de sisteme si medii de operare prin intermediul carora utilizatorii acceseaza aceeasi informatie. Acesta, este un sir de caractere ASCII pe care anumite programe specializate (browserele) il interpreteaza, rezultatul fiind afisat sub forma unei "pagini" web. Este acronimul de la HyperText Markup Language, care e numele unui limbaj de marcare ce a inlocuit SGML-ul. A fost conceput in 1989 de Tim Berners-Lee (actualmente director al consortiului World Wide Web) si a cunoscut o popularitate rapida. In prezent, aproape toate paginile web sunt scrise in HTML. Fiind un limbaj de marcare, HTML nu utilizeaza instructiuni (ca Pascal-ul sau C-ul) ori comenzi (ca Fox-ul), ci etichete, acestea fiind numite si balize, elemente sau tag-uri. Sintaxa oricarui tag este: <TAG atribut1="val" atribut2="val">Text</TAG> In unele cazuri, atributele pot lipsi. In altele, poate lipsi tag-ul de inchidere: </TAG>
Pagina 12 din 54

O pagina web poate contine: text imagini fisiere audio fisiere video programe in JavaScript scripturi CSS tag-uri care sa seteze parametrii unui applet ( program scris in Java si care rezida in retea ) Un fisier html se poate realiza: manual, scriind tag dupa tag in Notepad sau cu ajutorul editoarelor HTML precum Homesite, Adobe Golive, Microsoft Frontpage '98 sau 2000, Macromedia Dreamweaver (aplicatia cea mai apreciata de profesionisti ), CoffeeCup HTML Editor, Netscape Composer (recomandat doar incepatorilor), NoteTab Light sau 1st Page 2000 . Inca 1) HTML-ul e trei independent de observatii: platforma.

2) HTML-ul nu e un limbaj case-sensitive, asa ca se poate scrie la fel de bine <BODY>, <body>, <BOdy> sau <boDy> etc., pentru ca in HTML nu se face distinctia intre literele mari si cele mici. 3) HTML-ul nu tine cont de indentarea textului introdus in fisier, acesta putand fi frant dupa preferinte. Cum spuneam, este "un sir de caractere", si atat. Ideea sistemului infomational "hiper-text" consta in a oferi utilizatorului posibilitatea de a viziona/rasfoi documentele (paginile textului) in ordinea preferata, dar nu consecutiv ca la citirea cartilor. Se realizeza cu ajutorul unui mecanism de legaturi intre paginile textului prin intermediul referintelor hiper-text, adica textul obisnuit are referinte de tipul "urmatorulprecedentul", iar la hiper-text pot fi oricite alte referinte. Limbajul HTML permite definirea structurii documentului electronic cu nivel poligrafic de oformare. Limbajul contine mijloace dezvoltate pentru specificarea a cateva niveluri de titluri, diverse fonturi, grupuri de obiecte (exemplu: dictionare, meniuri, cataloguri) si multe alte posibilitati. 2.4. FoxPro 2.4.1. Date generale
Pagina 13 din 54

Principalul domeniu de utilizare a calculatoarelor il reprezinta cel al prelucrarii informatiilor. Pe masura ce societatea se dezvolta, cresc si necesitatile de informare ale acesteia, deci creste si volumul de informatii ce trebuie prelucrate. Astfel apare problema memorarii acestor informatii, a prelucrarii lor in vederea obtinerii diverselor rezultate solicitate. Acesta este tocmai domeniul in care este specializat FoxPro, domeniul bazelor de date. Datorita asemanarii dintre modul de organizare a unei baze de date si cel al unui tabel vom folosi analogia dintre aceste doua elemente in descrierea bazelor de date. Pentru a specifica o anumita inregistrare din baza de date se foloseste indicatorul de inregistrari - o zona de memorie care contine numarul inregistrarii cu care se lucreaza in momentul de fata (inregistrare curenta). Acesta poate fi considerat ca o variabila asociata bazei de date si care exista atata timp cat este deschisa baza de date. La un moment dat o singura inregistrare este cea curenta, numarul ei fiind dat de indicatorul de inregistrari. Indicatorul de inregistrari poate fi modificat prin comenzi FoxPro, acest lucru fiind echivalent cu deplasarea sagetii indicatorului de inregistrari in sus si in jos, de-a lungul bazei de date. Pentru a folosi o baza de date (b.d.) aceasta trebuie mai intai deschisa. Deschiderea bazei de date presupune rezervarea in memoria interna a calculatorului a unei zone rezervate in care FoxPro va memora toate informatiile necesare utilizarii acestei baze de date (structura, numarul de inregistrari, etc.). Aceasta zona de memorie poarta denumirea de zona de lucru (work area). FoxPro poate manipula mai multe b.d. simultan, deci poate lucra cu mai multe zone de lucru, in care se deschid b.d. respective. Asocierea b.d. la zonele de lucru este controlata de programator, acesta avand la dispozitie comenzi si functii specializate in acest scop. Dupa deschiderea unei b.d. (intr-o zona de lucru) se poate trece la lucrul cu aceasta, adica vom putea: sa preluam informatii din b.d.; sa modificam informatiile deja existente; sa adaugam noi informatii; sa stergem informatii din b.d., etc. Dupa terminarea lucrului cu b.d. urmeaza inchiderea acesteia, constand in: desfacerea legaturii dintre b.d. si zona de lucru; eliberarea memoriei alocate la deschidere (eliberarea zonei de lucru);

Pagina 14 din 54

inchiderea fisierului b.d., odata cu memorarea modificarilor efectuate de la deschidere pana in acest moment. Acesta este pe scurt modul de lucru cu o b.d. Pentru a putea lucra cu o baza de date trebuie sa intelegem cum anume se realizeaza prelucrarea si memorarea informatiilor, respectiv organizarea informatilor pe tipuri de date si functiile specifice fiecarui tip de date. 2.4.2. Tipuri de date, functii referitoare la fiecare tip in parte Pentru a transmite calculatorului programul dupa care acesta urmeaza sa prelucreze informatiile se foloseste un limbaj de programare. Acesta reprezinta ansamblul codificarilor operatiilor ce se executa intr-un program cat si a regulilor de combinare a acestora in scopul transmiterii catre calculator a programului dupa care acesta va functiona. Informatiile prelucrate de calculator vor fi numite date. Exemple de date: numere, litere, siruri de litere, etc. Un tip de date reprezinta o caracteristica a datelor care stabileste ce operatii se pot executa asupra lor, modul de codificare a datelor in memoria calculatorului, semnificatia acestor date. Exemple de tipuri de date: numeric, logic, sir de caractere, etc. In limbajul FoxPro vom avea urmatoarele tipuri de date: tipul logic; tipul numeric; tipul sir de caractere; tipul data calendaristica; tipul memo; Aceste tipuri vor fi tratate pe rand, pentru fiecare prezentandu-se: modul de specificare a datelor de tipul respectiv; operatori ce se aplica asupra acestor date; comenzile si functiile referitoare la datele de tipul respectiv. Tipul logic Este alcatuit din datele ce nu pot lua decat doua valori: adevarat(TRUE) sau fals(FALSE). Pentru a specifica valoarea adevarat a unei expresii de tip logic se foloseste constructia .T. (de la TRUE) iar pentru valoarea fals se foloseste .F. (de la FALSE).

Pagina 15 din 54

O expresie de tip logic reprezinta o combinatie de operanzi si operatori. Operanzii pot fi: - campuri de tip logic ;- functii care returneaza valori de tip logic; - variabile de tip logic; alte expresii logice. De asemenea rezultatul unei expresii care contine operatori relationali este tot de tip logic. Tipul numeric Operanzi numerici: campuri numerice ale b.d. variabile de tip numeric functii care returneaza valori numerice constante numerici Functii referitoare la semnul datelor numerice: ABS(<exp N>)= valoarea absoluta a argumentului (respectiv <exp N>); SIGN(<exp N>)=returneaza semnul argumentului +1 daca <exp N> este >0 SIGN(<exp N>)= 0 daca <exp N> este =0 1 daca <exp N> este <0 Functii de aproximare INT(<exp N>)=partea intreaga a argumentului CEILING(<exp N>)= cel mai apropiat intreg mai mare sau egal cu <exp N> FLOOR(<exp N>)= cel mai apropiat intreg mai mic sau egal cu <exp N> ROUND(<expN1,expN2>)= <expN1> expresia de rotunjit, <expN2> numarul de zecimale care se vor pastra in rezultat. Functii matematice elementare EXP(<exp N>)= exponentiala lui <exp N>; LOG(<exp N>)= logaritmul natural din <exp N>; LOG10(<exp N>)=logaritmul zecimal din <exp N>; SQRT(<exp N>)= radicalul de ordinul 2 din <exp N>; Tipul sir de caractere Un sir de caractere reprezinta o multime de caractere ordonata care se trateaza ca un tot unitar. Ordinea caracterelor in sir este esentiala si fiecarui caracter i se asociaza un numar
Pagina 16 din 54

reprezentand pozitia caracterului in cadrul sirului (primul caracter va avea pozitia 1, al II-lea va avea pozitia 2 s.a.m.d.). Numarul caracterelor dintr-un sir reprezinta lungimea sirului. Un subsir al sirului dat reprezinta o portiune din sir, incepand de la o pozitie specificata si de lungime data. Constantele de tip sir de caractere se specifica prin multimea caracterelor care il compun incadrata intre apostrofuri simple sau duble. Pentru a include un apostrof intr-un sir, sirul va fi delimitat de celalalt tip de apostrof. Daca lungimea sirului de caractere este 0 vorbim despre sirul vid sau sirul nul reprezentat prin '' sau "". Daca lungimea sirului este 1 vorbim despre caractere ex.:'1' sau "a". Operatorii care se pot aplica sirurilor de caractere sunt: operatori de concatenare; operatori de comparare sau relationali; Operatorul de concatenare simplu "+" face ca din doua siruri de caractere sa se obtina un al treilea prin alipirea celui de al doilea sir la coada primului. Operatorul de concatenare special "-" face ca din doua siruri de caractere sa se obtina un al treilea prin alipirea celui de al doilea sir la coada primului, blank-urile de la sfarsitul primului sir sunt trecute la sfarsitul sirului al doilea. .

Operatori relationali Operatorii relationali au urmatoare sintaxa: <expc1> <operator> <expc2> Operatorul $ (inclus in) returneaza adevarat daca primul sir de caractere, <expc1> este continut in cel de al doilea, <expc2>, altfel returneaza fals. Functii referitoare la sirurile de caractere Functia CHR( )- returneaza caracterul ASCII corespunzator codului numeric transmis ca parametru. Functia ASC( ) - returneaza codul ASCII al primului caracter din sirul dat. Functia LEN( ) - returneaza lungimea sirului primit ca parametru Functia LOWER( ) - transforma toate majuscule in litere mici, restul caracterelor ramanand neschimbate. Functia UPPER( ) - transforma toate literele mici in majuscule, restul caracterelor ramanand neschimbate.
Pagina 17 din 54

Functia PROPER( ) - transforma primul caracter in majuscula(daca este litera), restul caracterelor in litere mici.

Tipul data calendaristica O constanta de tip data calendaristica se specifica prin luna, ziua si anul corespunzator, separate prin caracterul / si incadrate intre paranteze acolade. Data calendaristica vida se specifica prin blank-uri in pozitia zilei, lunii si anului sau printr-un blanc incadrat intre paranteze acolade. Operatorii relationali se pot aplica si datelor de tip data calendaristica. O data calendaristica este mai mare decat alta atunci cand prima dintre acestea urmeaza calendaristic celei de a doua. Formatul de specificare a datelor calendaristice este controlat de comanda SET DATE 2.4.3. Crearea unei baze de date Pentru a crea o baza de date se foloseste comanda CREATE sintaxa: CREATE [<fisier> | ?] unde <fisier> este numele fisierului in care vrem sa pastram baza de date. Daca nu se specifica o alta extensie, implicit se asociaza extensia dbf(data base file). Daca nu se specifica numele fisierului sau se foloseste parametrul ? pe ecran se deschide o fereastra unde se va introduce numele b.d. Dupa specificarea numelui bazei de date se activeaza declansatorul implicit <Create> dupa care se intra in fereastra de specificare a structurii. In dreptunghiul trasat cu linie simpla se va specifica structura b.d. astfel: in coloana Name se vor introduce numele campurilor care alcatuiesc b.d. in coloana Type se introduce tipul campului, respectiv tipul datelor ce vor putea fi memorate in acest camp.(Character, Numeric, Float, Date, Logical, Memo, Picture). In coloana Width se stabileste numarul de caractere ocupate de campul respectiv in b.d. Dimensiunea campului se stabileste de catre utilizator doar in cazul campurilor de tip Character, Numeric, Float. In ultimele doua situatii latimea campului include si punctul zecimal si
Pagina 18 din 54

partea

fractionara.

in coloana Dec se stabileste numarul de zecimale de dupa virgula (punctul zecimal ) si are sens doar in cazul campurilor de tip Numeric si Float. Pe ultima linie a ferestrei sunt afisate informatii cu privire la structura existenta: numarul de campuri (Fields ) numarul de caractere ocupate de o inregistrare ( Length ) suma latimilor campurilor +1 numarul de caractere disponibile (Available ) stiind ca lungimea maxima a unei inregistrari este 4000. 2.4.4. Manipularea structurii unei baze de date Pentru a realiza modificarea structurii unei b.d. se foloseste comanda MODIFY STRUCTURE sintaxa: modify structure sau modi stru Aceasta comanda deschide o fereastra de dialog, aceeasi ca la crearea b.d. unde se realizeaza modificarile dorite. Daca in zona de lucru curenta avem deschisa o b.d., atunci comanda se refera la aceasta. In caz contrar apare o fereastra de dialog in care utilizatorul selecteaza b.d. careia ii va modifica structura. Vizualizarea continutului unei b.d. se realizeaza cu comenzile DISPLAY STRUCTURE sau LIST STRUCTURE. sintaxa: display structure [in <exp N> | <exp C>] [to printer | to file <fisier>] [noconsole] list structure [in <exp N> | <exp C>] [to printer | to file <fisier>] [noconsole] Deosebirea dintre cele doua comenzi este ca prima (DISPLAY) face pauza dupa umplerea unui ecran cu informatii, la cea de-a doua (LIST) afisarea facandu-se cu defilare.
Pagina 19 din 54

<exp N> sau <exp C> specifica zona de lucru, respectiv baza de date la care se refera comanda. In cazul in care apare optiunea NOCONSOLE afisarea pe ecran (implicita) este inhibata. In paralel cu afisarea pe ecran informatiile pot fi trimise la imprimanta (clauza TO PRINTER) sau in fisierul <fisier>( clauza TO FILE). Un alt mod de a crea o b.d. il reprezinta comanda COPY STRUCTURE - care creeaza o b.d. noua cu aceeasi structura (sau asemanatoare) cu a celei deschise in zona de lucru curenta. sintaxa: copy structure to <fisier> [ FIELDS < lista de campuri >] unde <fisier> reprezinta fisierul noii b.d. Clauza FIELDS are ca efect copierea in noua b.d. doar a campurilor specificate in lista de campuri ce urmeaza clauza.

2.4.5. Vizualizarea continutului unei baze de date Afisarea continutului b.d. se poate face pe ecran, la imprimanta sau intr-un fisier de pe disc folosind comenzile LIST si DISPLAY. sintaxa: DISPLAY [ [ FIELDS ]<lista de campuri> ] [<domeniu> ] [ FOR <expL1> ] [ WHILE <expL2> ] [ OFF ] [ to printer | to file <fisier> ] [ noconsole ] Afisarea informatiilor se face in urmatorul format: Prima linie reprezinta lista campurilor identificate prin numele acestora; urmatoarele linii reprezinta inregistrari din b.d., in cadrul carora campurile sunt afisate unul langa altul.

Pagina 20 din 54

Pe prima pozitie se afiseaza numarul de ordine al inregistrarii in b.d. Clauza FIELDS se foloseste cu scopul de a afisa doar campurile specificate in < lista de campuri >, in ordinea aparitiei lor in aceasta lista. Absenta acestei clauze determina afisarea tuturor campurilor b.d., in ordinea in care apar acestea in structura b.d. <domeniu>, FOR, WHILE determina domeniul inregistrarilor ce vor fi afisate. Daca aceste clauze lipsesc se va afisa doar inregistrarea curenta, acesta fiind domeniul implicit al inregistrarilor, pentru comanda DISPLAY. Prezenta clauzei OFF determina disparitia din formatul de afisare a coloanei 0 (nu se mai afiseaza numarul de ordine). Prezenta clauzei NOCONSOLE opreste afisarea pe ecran. Se poate face afisare si la imprimanta, daca se foloseste clauza TO PRINTER, sau in fisierul <fisier>, daca se foloseste clauza TO FILE. Comanda LIST este asemanatoare cu DISPLAY (are aceeasi sintaxa, cu aceleasi semnificatii ale clauzelor) cu urmatoarele diferente: comanda DISPLAY afiseaza doar inregistrarea curenta pe cand comanda LIST afiseaza toate inregistrarile; comanda DISPLAY are ca efect afisarea continutului b.d. ecran cu ecran, trecerea de la un ecran la altul facandu-se dupa apasarea unei taste, la comanda LIST afisarea se face cu defilare, pauza dintre ecrane lipsind. LIST nu afiseaza inregistrarile marcate pentru stergere cand avem SET DELETED ON, pe cand DISPLAY le afiseaza si pe acestea. Pentru ca denumirile campurilor sa nu mai apara la afisare, se foloseste comanda set heading on|off unde ON determina afisarea antetului iar OFF determina inhibarea afisarii. Optiunea implicita este ON. 2.4.6. Adaugarea de inregistrari la o baza de date Adaugarea de inregistrari se poate face in doua moduri, in functie de pozitia pe care o va ocupa noua inregistrare in b.d.: adaugarea de inregistrari noi la sfarsitul b.d.; introducerea de inregistrari noi in interiorul b.d.
Pagina 21 din 54

Comanda APPEND adauga inregistrari la sfarsitul b.d. deschise in zona de lucru curenta. sintaxa: APPEND [ BLANK ] Comanda APPEND fara clauza BLANK determina deschiderea unei ferestre de editare in care utilizatorul poate introduce, camp cu camp informatiile inregistrarii (inregistrarilor) ce se va adauga. Terminarea introducerii tuturor inregistrarilor se realizeaza apasand simultan tastele Ctrl si End, fereastra de editare inchizandu-se dupa aceasta. O forma deosebita a comenzii APPEND se obtine folosind clauza BLANK. Comanda APPEND BLANK are ca efect adaugarea unei noi inregistrari "blank" la sfarsitul b.d., urmand ca informatia utila sa se incarce mai tarziu, prin alte comenzi. Inregistrarea "blank" este inregistrarea in care toate campurile sunt initializate cu spatii (CHR(32)) Adaugarea de inregistrari la sfarsitul unei b.d., cand continutul este preluat dintr-un alt fisier, se realizeaza cu comanda APPEND FROM care are urmatoarea sintaxa: APPEND FROM <fisier > [ FIELDS <lista campuri>] [FOR < exp L>] unde <fisier> reprezinta numele fisierului din care se preiau inregistrarile ce se vor adauga la baza de date. Daca nu se specifica numele fisierului, trebuie specificata clauza ?, astfel se ofera utilizatorului posibilitatea alegerii fisierului printr-o fereastra de dialog. Daca se doreste ca din baza de date <fisier> sa se preia doar anumite campuri, se va include clauza FIELDS, in care <lista campuri> reprezinta lista campurilor ce se vor copia, separate prin virgula. Pentru a se prelua din fisier doar anumite inregistrari, se va specifica domeniul acestora prin clauza FOR. Cea de-a doua metoda de adaugare a unei inregistrari noi la o b.d. o reprezinta inserarea inregistrarii in interiorul b.d. folosind comanda INSERT. sintaxa: insert [ before ] [blank]
Pagina 22 din 54

are

ca

efect

inserarea

unei

inregistrari

noi,

dupa

inregistrarea

curenta

Daca se specifica clauza BLANK se adauga o inregistrare blank, altfel se intra intr-o fereastra de editare de noi inregistrari asemanatoare ferestrei de la comanda APPEND. Clauza BEFORE determina adaugarea unei inregistrari noi inaintea inregistrarii curente. 2.4.7. Modificarea continutului unei baze de date Modificarea informatiilor stocate intr-o b.d se realizeaza cu ajutorul comenzilor CHANGE, EDIT, BROWSE si REPLACE. Primele trei comenzi nu modifica propriu-zis continutul b.d., ci deschid o fereastra de editare in care utilizatorul va modifica informatiile din b.d. Comenzile CHANGE si EDIT sunt identice, ele difera de comanda BROWSE doar prin modul de organizare pe ecran a ferestrei corespunzatoare. sintaxa: change | edit [ FIELDS <lista campuri> ] [ <domeniu>] [ FOR<expL1>] [WHILE<expL2>] [ FREEZE <camp>] [noapPend] [noclear] [nodelete] [noedit] [nomodify] [VALID [:F] <exp1>[ ERROR<expC1>]] [WHEN<expL1>] [WIDTH<expN1>] Iesirea din fereastra de editare si salvarea modificarilor se face folosind combinatia de taste Ctrl+End. Daca nu se doreste salvarea se va folosi iesirea cu tastele Ctrl+Q Clauza FIELDS are ca efect afisarea spre editare doar a campurilor specificate in <lista campuri>, in ordinea aparitiei lor in lista. <domeniu>, FOR, WHILE specifica domeniul inregistrarilor ce vor fi accesibile spre editare. Clauza FREEZE se foloseste pentru a selecta spre modificare un singur camp restul fiind doar afisate in fereastra de editare, fara a se permite modificarea lor.

Pagina 23 din 54

Clauza NOAPPEND opreste utilizatorul de a adauga noi inregistrari din fereastra de editare. Clauza NODELETE nu permite stergerea inregistrarilor din b.d. NOEDIT si NOMODIFY se exclud reciproc, nu permit utilizatorului modificarea inregistrarilor ci doar vizualizarea acestora, dar nu presupun protectie la stergere. Clauza WIDTH limiteaza numarul de caractere afisate, fara a afecta latimea campului in b.d. Comanda BROWSE sintaxa: BROWSE [FIELDS <lista campuri>] [ FOR <expL1>] [FREEZE] [noapPend] [noclear] [nodelete] [noedit] [nomodify] [VALID [:F] <exp1>[ ERROR<expC1>]] [WHEN<expL1>] [WIDTH<expN1>] Semnificatia clauzelor este aceeasi ca la comanda CHANGE.

Modificarea continutului unei b.d. se poate face si cu comanda REPLACE, insa aceasta nu deschide o fereastra de editare, ci realizeaza propriu-zis actualizarea b.d. cu datele precizate prin comanda. sintaxa: REPLACE <camp1> WITH <expr1 > [, <camp2> WITH <expr2 > ...] [<domeniu>] [FOR<expL1>] [WHILE<expL2>]

Pagina 24 din 54

Comanda inlocuieste vechea valoare din campul <camp1> cu valoarea rezultata din evaluarea expresie<expr1>, valoarea din <camp2> cu <expr2> s.a.m.d. Pentru campuri numerice, daca nu se reuseste incadrarea valorii expresiei in campul respectiv, acesta va fi umplut cu asteriscuri. <domeniu> FOR, WHILE specifica domeniul inregistrarilor la care se refera comanda, domeniul implicit fiind inregistrarea curenta 2.4.8. Stergerea inregistrarilor dintr-o baza de date Stergerea unei inregistrari se poate realiza la doua nivele si anume:

la nivel logic - inregistrarea nu este propriu-zis stearsa ci ea este marcata pentru stergere, anumite comenzi si functii considera aceste inregistrari absente din fisierul b.d., dar exista posibilitatea ca informatia continuta in inregistrare poate fi recuperata; la nivel fizic inregistrarea este stearsa efectiv din b.d., ea nemaiputand fi recuperata. Marcarea pentru stergere a uneia sau a mai multor inregistrari se realizeaza cu ajutorul comenzii DELETE sintaxa: DELETE [ <domeniu> ] [ FOR<expL1>] [ WHILE<expL2>] unde <domeniu>, FOR, WHILE identifica inregistrarile ce vor fi marcate pentru stergere. Domeniul implicit al comenzii DELETE este inregistrarea curenta. Accesul la inregistrarile marcate pentru stergere este controlat de comanda SET DELETED sintaxa: set deleted on |off unde optiunea ON determina ca inregistrarile marcate pentru stergere sa nu poata fi folosite de comenzile care folosesc domeniul inregistrarilor. Starea initiala este OFF.

Pagina 25 din 54

Comenzile care actioneaza asupra unei singure inregistrari sau care au ca domeniu implicit inregistrarea curenta nu sunt afectate de aceasta comanda. In interiorul unui program testarea marcajului de stergere a unei inregistrari se face cu functia DELETED(). Aceasta returneaza valoarea logica .T. daca inregistrarea curenta este marcata pentru stergere. sintaxa: DELETED( [<exp N>] ) unde <exp N> reprezinta zona de lucru in care este deschisa b.d. in cazul in care functia se refera la alta b.d. decat cea activa. Inlaturarea marcajului pentru stergere se realizeaza cu comanda RECALL; dupa ce marcajul a fost indepartat inregistrarea devine accesibila pentru toate comenzile. sintaxa: recall [<domeniu>] [FOR <expL1>] [WHILE<expL2>] Inregistrarile care nu sunt marcate pentru stergere nu sunt afectate de aceasta comanda; domeniul implicit al comenzii RECALL este inregistrarea curenta.

2.4.9. Manipularea campurilor unei baze de date Accesul la campurile unei b.d. este controlat de comanda SET FIELDS. sintaxa: set fields on | off SET FIELDS TO [ [<camp1> [<camp2>..] ] | ALL ] unde <camp1>,<camp2>,..

Pagina 26 din 54

reprezinta lista campurilor ce pot fi accesate in cazul SET FIELDS ON. SET FIELDS TO ALL permite accesul la toate campurile, chiar daca starea lui SET FIELDS este ON. SET FIELDS TO face ca lista campurilor sa fie vida, deci nici un camp nu va putea fi accesat in cazul SET FIELDS ON. Pentru a se reveni la accesul tuturor campurilor se introduce una dintre comenzile: set fields to all sau set fields off Numarul campurilor dintr-o b.d. este dat de functia FCOUNT( [<exp N>]) unde <exp N> reprezinta zona de lucru in care este deschisa b.d. (daca nu se specifica, se considera ca functia se refera la b.d. deschisa in zona de lucru curenta). Daca in zona de lucru specificata nu este deschisa nici o b.d. functia va returna valoarea 0. Functia FIELD( ) returneaza numele unui camp dintr-o b.d., identificat prin numarul campului in cadrul structurii b.d. sintaxa: FIELD (<expN1>[, <expN2>]) unde <expN1> specifica numarul campului, iar <expN2> identifica zona de lucru in care se afla b.d. (daca nu se specifica, functia se refera la zona de lucru curenta). Functia returneaza un sir de caractere continand numele campului specificat, scris cu majuscule. In cazul in care numarul de ordine al campului specificat este mai mare decat numarul total de campuri al b.d., functia va returna sirul vid de caractere. Functia FSIZE() returneaza marimea unui camp al unei b.d., specificat prin numele sau. sintaxa: FSIZE (<expC1>[, <exp N>]) unde <expC1> este un sir de caractere ce reprezinta numele campului, <exp N> specifica zona de lucru. Rezultatul este de tip numeric.

Pagina 27 din 54

Pagina 28 din 54

2.4.10. Accesul la inregistrari In afara de controlul asupra inregistrarilor exercitat cu ajutorul comenzilor de stergere, mai exista o metoda de control a accesului la informatiile din inregistrari. Aceasta metoda este data de comanda SET FILTER. sintaxa: SET FILTER TO [<exp L>] Comanda determina ca in b.d. sa apara doar inregistrarile care indeplinesc conditia <exp L>. SET FILTER TO, fara conditie, face ca toate inregistrarile din b.d. sa poata fi accesate. Pentru a afla conditia de accesare a inregistrarilor( expresia filtru) se foloseste functia FILTER sintaxa: FILTER(<exp N>) unde SET FILTER <exp N> specifica zona de lucru in care este deschisa b.d.

Rezultatul functiei este un sir de caractere reprezentand expresia filtru stabilita de comanda

Pagina 29 din 54

Capitolul IV Mod de lucru Pentru realizarea acestui proiect am folosit limbajul de scripting PHP. Pentru efectuarea operatiilor, in functie de tipul operatiei, fisierul operatii.php include fisierul ce contine codul necesar prin utilizarea comenzii CASE. Pentru creare folosim fisierul pre_creare.php pentru a defini forma de creare a bazei de date, pentru ca mai departe sa utilizam fisierul creat.php. Fisireul creat.php citeste fiecare camp trimis de la forma de creare prin metoda GET. Prin aceasta metoda toate datele sunt trimise prin URL-ul browser-ului. Creat.php creaza efectiv baza de date. Fisierul afisare.php afiseaza elementele din baza de date selectata. In caz ca nici o baza de date nu este selectata apare mesajul de eroare: Nu ati specificat baza de date. Acest fisier deschide baza de date selectata, $db=dbase_open('files/'.$db_link,0): citeste numarul de inregistrari din baza de date $nr=dbase_numrecords($db); creaza tabela unde vor fi afisate rezultatele print('<table align="center" width="100%" cellpadding="3" cellspacing="0"

border="1" bordercolor="#003366">'); pentru fiecare inregistrare citeste inregistrarea $rec=dbase_get_record_with_names($db,$i); creaza linkurile pentru editare print('<td><a href="index.php?op=modif&db='.$db_name.'&rec_num='.$i.'"> modifica</a></td>'); creaza linkurile pentru stergere if($i!=1)print('<td><a href="index.php?op=del&db='.$db_name.'&rec_num='.$i.'"> sterge</a></td>');
Pagina 30 din 54

Pentru modificare se foloseste fisierul pre_modificare.php care afiseaza forma de modificare a unui element. Fisierul modificat.php realizeaza modificarea efectiva a elementului. Stergerea unui element din baza de date se realizeaza cu fisierul sterge.php. Pentru a sterge un element numele bazei de date trebuie sa fie definit si trebuie specificat numarul acestuia. dbase_delete_record($db,$rec_num); marcheaza ca sters elementul selectat dbase_pack($db); sterge efectiv inregistrarea din baza de date Adaugarea efectiva a unui element in baza de date se realizeaza prin fisierul adaugat.php, iar forma de adaugare a unui element se realizeaza prin fisierul pre_adaugare.php. $rec=dbase_get_record_with_names($db,1); citeste prima inregistrarea pentru a afla structura bazei de date dbase_add_record($db,$row); adauga efectiv elementul in BD Inchiderea ferestrei se realizeaza prin functia: input type="button" onClick="window.close();" value="Inchide Fereastra"

Pagina 31 din 54

Capitolul V Concluzii Exista mai multe metode pentru a realiza in mod dinamic pagini Web insa limbajul PHP are avantajul simplitatii si a independentei de sistemul de operare. Limbajul PHP functioneaza in regim open source. Ajuns la versiunea 4, PHP este un limbaj de scripting server-side foarte solid, dotat cu peste 1000 de functii, implementat pe numeroase platforme, conlucrand cu toate serverele Web importante si dispunand de interfete pentru toate majoritatea bazelor de date utilizate. Popularitatea sa a crescut neincetat, unele statistici estimand ca PHP este folosit in circa 1,5 milioane de domenii Web.

Anexe Index.php <?php //Initializeaza variabilele necesare require('variabile.php'); ?> <html> <head> <title>Prelucrarea Bazelor de Date FoxPro</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <style TYPE="text/css"> a{ font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; font-style: normal; color: #CCCCFF; text-decoration: none; } a:hover { text-decoration: underline; color: #CCCC00;
Pagina 32 din 54

} </style> </head> <body bgcolor="#336699"> <table align="center" border="0" width="65%"> <tr> <td colspan="2" align="center"> <font color="#CCCCCC" size="+2"><strong> Prelucrarea Bazelor de Date FoxPro </strong></font> </td> </tr> <tr><td colspan="2"><hr align="center" size="2"></td></tr> <tr> <td align="right" width="30%"> <font color="#CCCCCC" size="+1"><strong> Baza de date: </strong></font> </td> <td><!-- Afiseaza variabilele initializate la inceput --> <!-- in momentul executarii codului php, acesta va fi inlocuit cu rezultatul functiei print() --> &nbsp;<a href="files/<?php print($db_link);?>"><font color="#CCCCCC" size="+2"><strong><?php print($db_name);?></font></strong></a> &nbsp;<font color="#CCCCCC">( Click pentru a downloada fisierul .dbf )</font> </td> </tr> <tr><td colspan="2"><hr align="center" size="2"></td></tr> <tr> <td colspan="2" align="left"> <font color="#CCCCCC"><em>Optiuni:</em></font> <a href="<?php print($link_creare);?>">Creeare BD</a>&nbsp;|&nbsp;<a href="<?php print($link_afisare);?>">Afisare BD</a>&nbsp;|&nbsp;<a href="<?php print($link_adaugare);?>">Adaugare Inregistrare</a>
Pagina 33 din 54

</td> </tr> <tr><td colspan="2"><hr align="center" size="2"></td></tr> <tr><td colspan="2"><?php /*Executa codul necesar, in functie de operatia aleasa*/require('operatii.php');?></td></tr> <tr><td colspan="2"><hr align="center" size="2"></td></tr> <tr><td colspan="2"><?php /*Citeste si afiseaza fisierele *.dbf gasite*/require('files.php');?></td></tr> <tr><td colspan="2">&nbsp</td></<tr> <tr><td colspan="2">&nbsp</td></<tr> <tr><td colspan="2">&nbsp</td></<tr> <tr><td </table> </body> </html> colspan="2"><input a"></td></tr> type="button" onClick="window.close();" value="Inchide Fereastr

Pagina 34 din 54

Variabile.php <?php // Citeste numele bazei de date ce a fost trimis prin metoda GET if(isset($_GET['db'])) //daca este trimis numele bazei de date $db_name=$_GET['db']; // atunci acesta este bastrat in variabila $db_name else $db_name=""; // daca nu este trimis atunci $db_name este vid. // Citeste numele operatiei ce trebuie executata if(isset($_GET['op'])) $operatie=$_GET['op']; else $operatie=""; // Citeste numarul inregistrarii asupra careia se executa operatia if(isset($_GET['rec_num'])) $rec_num=$_GET['rec_num']; else $rec_num=""; // Creeaza un link spre fisierul .dbf $db_link=$db_name.'.dbf'; // Creaza linkuri pentru optiunile din meniu $link_creare='index.php?op=creare'; $link_afisare='index.php?op=afisare&db='.$db_name; $link_adaugare='index.php?op=add&db='.$db_name; ?>

Pagina 35 din 54

operatii.php <?php //in functie de tipul operatiei include fisierul ce contine codul necesar switch($operatie){ case "": //pagina a fost deschisa pentru prima oara, nu trebuie executat nimic break;// instructiunea break este folosita pentru a nu se putea executa doua operatii odata case "creare": //afiseaza forma de creare a bazei de date require('pre_creare.php'); break; case "creat": // realizeaza crearea efectiva a bazei de date require('creat.php'); break; case "afisare": // afiseaza continutul bazei de date require('afisare.php'); break; case "modif": // afiseaza forma de modificare a unui element require('pre_modificare.php'); break; case "modificat": // realizeaza modificarea efectiva a elementului require('modificat.php'); break; case "del": // sterge un element din baza de date require('sterge.php'); break; case "add": break; case "adaugat": // realizeaza adaugarea efectiva a elementului require('adaugat.php'); break; } ?>
Pagina 36 din 54

// afiseaza forma de adaugare a unui element

require('pre_adaugare.php');

pre_creare.php <!-- fisierul html ce defineste forma de creare a bazei de date --> <table width="70%" align="center" border="1" bordercolor="#FFFFFF"><tr><td> <table align="center" width="100%" cellpadding="3" cellspacing="0" border="1" bordercolor="#003366"> <form action="index.php" name="definitii" method="get"> <tr> <td colspan="3" align="center"> <font color="#CCCCCC" size="+1"><strong> Creare BD : <input type="text" name="db">&nbsp;(Numele BD) </strong></font> </td> </tr> <tr> <td align="center"> <font color="#CCCCCC">Numele Campului</font> </td> <td align="center"> <font color="#CCCCCC">Tipul Campului</font> </td> <td align="center"> <font color="#CCCCCC">Valoarea Campului</font> </td> </tr> <input type="hidden" name="op" value="creat"> <tr> <td align="center"> <input name="num1" type="text" value="" size="10" maxlength="10"> </td> <td align="center"> <select name="tip1"><option>Character</option><option>Numeric</option></select> </td>
Pagina 37 din 54

<td align="center"> <input type="text" name="val1" size="10" maxlength="128" value=""> </td> </tr> <tr> <td align="center"> <input type="text" name="num2" size="10" maxlength="10" value=""> </td> <td align="center"> <select name="tip2"><option>Character</option><option>Numeric</option></select> </td> <td align="center"> <input type="text" name="val2" size="10" maxlength="128" value=""> </td> </tr> <tr> <td align="center"> <input type="text" name="num3" size="10" maxlength="10" value=""> </td> <td align="center"> <select name="tip3"><option>Character</option><option>Numeric</option></select> </td> <td align="center"> <input type="text" name="val3" size="10" maxlength="128" value=""> </td> </tr> <tr> <td align="center"> <input type="text" name="num4" size="10" maxlength="10" value=""> </td> <td align="center">

Pagina 38 din 54

<select name="tip4"><option>Character</option><option>Numeric</option></select> </td> <td align="center"> <input type="text" name="val4" size="10" maxlength="128" value=""> </td> <tr> <td align="center"> <input type="text" name="num5" size="10" maxlength="10" value=""> </td> <td align="center"> <select name="tip5"><option>Character</option><option>Numeric</option></select> </td> <td align="center"> <input type="text" name="val5" size="10" maxlength="128" value=""> </td> </tr> <tr> <td align="center"> <input type="text" name="num6" size="10" maxlength="10" value=""> </td> <td align="center"> <select name="tip6"><option>Character</option><option>Numeric</option></select> </td> <td align="center"> <input type="text" name="val6" size="10" maxlength="128" value=""> </td> </tr> <tr><td </form> </table>
Pagina 39 din 54

colspan="2"

align="center"><input

type="submit"

value="Creeaza"></td></tr>

</td></tr></table> Creat.php <center><font color="#CCCCCC" size="+1"><strong> <?php $nr=0; //numarul de campuri // citeste fiecare camp trimis de la forma de creare prin metoda GET if(!empty($_GET['num1'])){ //daca este trimis campul 1 atunci $f_name1=$_GET['num1'];$f_tip1=$_GET['tip1'];$f_val1=$_GET['val1'];$nr++;// citeste numele campului, tipul si valoarea acestuia if(!empty($_GET['num2'])){ $f_name2=$_GET['num2'];$f_tip2=$_GET['tip2'];$f_val2=$_GET['val2'];$nr++; if(!empty($_GET['num3'])){ $f_name3=$_GET['num3'];$f_tip3=$_GET['tip3'];$f_val3=$_GET['val3'];$nr++; if(!empty($_GET['num4'])){ $f_name4=$_GET['num4'];$f_tip4=$_GET['tip4'];$f_val4=$_GET['val4'];$nr++; if(!empty($_GET['num5'])){ $f_name5=$_GET['num5'];$f_tip5=$_GET['tip5'];$f_val5=$_GET['val5'];$nr++; if(!empty($_GET['num6'])){ $f_name6=$_GET['num6'];$f_tip6=$_GET['tip6'];$f_val6=$_GET['val6'];$nr+ +;}}}}}} if(empty($db_name)){ //pentru a crea baza de date numele acesteia trebuie sa fie definit print('Numele Bazei de Date nu a fost specificat'); require('pre_creare.php'); }elseif($nr==0){ // baza de date trebuie sa aiba macar un camp print('Nu ati specificat nici un camp'); require('pre_creare.php'); }else{ //initializaza variabilele ce vor contine structura bazei de date $struc=array();$row=array();$initval=array(); for($i=1;$i<=$nr;$i++){ //pentru fiecare camp ce a fost definit $tip="f_tip$i";$fval="f_val$i"; //creaza variabila ce contine numele, tipul si valoarea campului
Pagina 40 din 54

$name="f_name$i"; switch($$tip){ //in functie de tipul campului adauga un element in sirul ce contine structura BD case 'Character': //pentrul tipul caracter $row=array( $$name , "C", 128); //se specifica numele campului , tipul si lungimea maxima break; case 'Numeric': // pentru tipul numeric $row=array( $$name , "N", 10 , 0 ); // se specifica numele, marimea si precizia break; } $struc[]=$row; // adauga campul la sirul ca contine structura BD $initval[]=$$fval; // creaza un sir cu valoarea primei inregistrari } if (!dbase_create('files/'.$db_link, $struc)) //apeleaza functia ce creaza efectiv BD print "Eroare la creare!"; else { $db=dbase_open('files/'.$db_link,2); //deschide BD creata dbase_add_record($db,$initval); //adauga prima inregistrare in BD dbase_close($db); // inchide BD print "Baza de date a fost creeata cu succes"; //afiseaza mesajul corespunzator print('<hr align="center" size="2">'); // traseaza o linie orizontala //afiseaza codul necesar pentru a realiza aceasta operatie din mediul FoxPro print("Codul FoxPro corespunzator operatiei de creare:<br>"); print('<p align="left"><font color="#FFFFCC" size="-1">'); print('CREATE TABLE '.$db_name.'&nbsp;('); foreach($struc as $element) //pentru fiecare element al sirului ce contine structura BD { print($element[0].'('.$element[1]); if(isset($element[2])) print(','.$element[2]); if($element!=$struc[count($struc)-1]) print('), '); else
Pagina 41 din 54

print(') '); } print(')<br>CLOSE DATABASES'); print('</font></p>'); } } ?> </strong></font></center><br>

Pagina 42 din 54

Afisare.php <?php if(empty($db_name)) //pentru a afisa baza de date numele acesteia trebuie sa fie definit { print('<center><font color="#CCCCCC" size="+1"><strong>Nu ati specificat baza de date</strong></font></center>'); } else{ print('<center><font color="#CCCCCC" size="+1"><strong>Elementele BD</strong></font></center><br>'); $db=dbase_open('files/'.$db_link,0); //deschide BD $nr=dbase_numrecords($db); //citeste numarul de inregistrari din BD //creaza tabela in care va fi afisata baza de date print('<table align="center" width="100%" cellpadding="3" cellspacing="0" border="1" bordercolor="#003366">'); for($i=1;$i<=$nr;$i++){ //pentru fiecare inregistrare $rec=dbase_get_record_with_names($db,$i); //citeste inregistrarea print('<tr>'); if($i==1){ //pentru prima inregistrare citeste numele fiecarui camp print('<td colspan="2">&nbsp;</td>'); foreach(array_keys($rec) as $key) //pentru fiecare camp if($key!='deleted') // mai putin delete care este un identificator special { print('<td align="center"><font color="#CCCCCC" size="+1"><strong>'); print($key); //afiseaza ca si cap de tabel numele campului print('</strong></font></td>'); } print('</tr><tr>'); } //creaza linkurile pentru editare si stergere print('<td><a $i.'">modifica</a></td>');
Pagina 43 din 54

href="index.php?op=modif&db='.$db_name.'&rec_num='.

if($i!=1)print('<td><a $i.'">sterge</a></td>');

href="index.php?op=del&db='.$db_name.'&rec_num='.

else print("<td>&nbsp</td>"); foreach($rec as $key) // pentru fiecare camp if($key!='deleted') print('<td align="center">'.$key.'</td>'); // afiseaza informatia corespunzatoare campului print('</tr>'); } print('</table>'); //creaza linkul pentru adaugarea unui element print('<br><a href="'.$link_adaugare.'">&gt;Adaugare Inregistrare</a>'); dbase_close($db); //inchide baza de date print('<hr align="center" size="2">'); //afiseaza codul necesar pentru a realiza aceasta operatie din mediul FoxPro print("Codul FoxPro corespunzator operatiei de afisare:<br>"); print('<p align="left"><font color="#FFFFCC">'); print('USE '.$db_name.'<br>'); print('BROWSE FIELDS '); unset($rec['deleted']); $keys=array_keys($rec); $last=$keys[count($keys)-1]; foreach(array_keys($rec) as $key) { print($key); if($key!=$last) print(','); else print(' '); } print('<br>CLOSE DATABASES'); print('</font></p>'); } ?> <br>
Pagina 44 din 54

pre_adaugare.php <center><font color="#CCCCCC" size="+1"><strong> <?php if(empty($db_name))//pentru a modifica baza de date numele acesteia trebuie sa fie definit { print('<center><font color="#CCCCCC" size="+1"><strong>Nu ati specificat baza de date</strong></font></center>'); } else{ print('<center><font color="#CCCCCC" size="+1"><strong>Adaugare element</strong></font></center><br>'); $db=dbase_open('files/'.$db_link,0);//deschide BD $rec=dbase_get_record_with_names($db,1);//citeste prima inregistrarea pentru a afla structura BD //creaza forma necesara pentru adaugarea datelor print('<table align="center" width="100%" cellpadding="3" cellspacing="0" border="0" bordercolor="#003366">'); print('<form name="modifica" action="index.php" method="GET">'); print('<input type="hidden" name="op" value="adaugat">'); print('<input type="hidden" name="db" value="'.$db_name.'">'); print('<input type="hidden" name="rec_num" value="'.$rec_num.'">'); foreach(array_keys($rec) as $key) if($key!='deleted') { //creaza un inputbox pentru a putea adauga valoarea elementului print('<tr><td align="right"><font color="#CCCCCC" size="+1"><strong>'); print($key);print(':</strong></font></td>'); print('<td><input type="text" name="'.trim($key).'" value="">'); print('</td></tr>'); } print('<tr><td align="center" colspan="2"><input type="submit" value="Adauga"></td></tr>');
Pagina 45 din 54

print('</form></table>'); dbase_close($db);//inchide BD } ?> </strong></font></center><br>

Pagina 46 din 54

adaugat.php <center><font color="#CCCCCC" size="+1"><strong> <?php if(empty($db_name)){//pentru a modifica baza de date numele acesteia trebuie sa fie definit print('Numele Bazei de Date nu a fost specificat'); require('pre_creare.php'); }else{ $db=dbase_open('files/'.$db_link,2);//deschide BD $rec=dbase_get_record_with_names($db,1);//citeste prima inregistrarea pentru a afla structura BD $i=0; foreach(array_keys($rec) as $key)//pentru fiecare camp al inregistrarii if($key!='deleted') { $row[]=$_GET[$key];// modifica valoarea campului cu valoarea corespunzatoare trimisa prin metoda GET } dbase_add_record($db,$row);//adauga efectiv elementul in BD dbase_close($db);//inchide BD print('Inregistrarea a fost adaugata cu succes'); print('<hr align="center" size="2">'); //afiseaza codul necesar pentru a realiza aceasta operatie din mediul FoxPro print("Codul FoxPro corespunzator operatiei de adaugare:<br>"); print('<p align="left"><font color="#FFFFCC">'); print('USE '.$db_name.'<br>'); print('INSERT INTO '.$db_name.' ('); unset($rec['deleted']); $keys=array_keys($rec); $last=$keys[count($keys)-1]; foreach(array_keys($rec) as $key) { print($key);
Pagina 47 din 54

if($key!=$last) print(','); } print(') VALUES ('); $keys=array_keys($rec); $last=$keys[count($keys)-1]; foreach(array_keys($rec) as $key) { if(is_numeric($_GET[$key])) print($_GET[$key]); else print("'$_GET[$key]'"); if($key!=$last) print(','); } print(')'); print('<br>CLOSE DATABASES'); print('</font></p>'); } ?> </strong></font></center><br>

Pagina 48 din 54

pre_modificare.php <center><font color="#CCCCCC" size="+1"><strong> <?php if(empty($db_name))//pentru a modifica baza de date numele acesteia trebuie sa fie definit { print('<center><font color="#CCCCCC" size="+1"><strong>Nu ati specificat baza de date</strong></font></center>'); } else{ print('<center><font color="#CCCCCC" size="+1"><strong>Modificare element</strong></font></center><br>'); $db=dbase_open('files/'.$db_link,0); //descide BD $rec=dbase_get_record_with_names($db,$rec_num); //citeste inregistrarea ce trebuie modificata //creaza forma necesara pentru modificarea datelor print('<table align="center" width="100%" cellpadding="3" cellspacing="0" border="0" bordercolor="#003366">'); print('<form name="modifica" action="index.php" method="GET">'); print('<input type="hidden" name="op" value="modificat">'); print('<input type="hidden" name="db" value="'.$db_name.'">'); print('<input type="hidden" name="rec_num" value="'.$rec_num.'">'); foreach(array_keys($rec) as $key) //pentru fiecare camp if($key!='deleted') { //creaza un inputbox pentru a putea modifica valoarea elementului print('<tr><td align="right"><font color="#CCCCCC" size="+1"><strong>'); print($key);print(':</strong></font></td>'); print('<td><input type="text" name="'.trim($key).'" value="'.trim($rec[$key]).'">'); print('</td></tr>'); } print('<tr><td align="center" colspan="2"><input type="submit" value="Modifica"></td></tr>');
Pagina 49 din 54

print('</form></table>'); dbase_close($db); //inchide BD } ?> </strong></font></center><br>

Pagina 50 din 54

modificat.php <center><font color="#CCCCCC" size="+1"><strong> <?php if(empty($db_name)){//pentru a modifica baza de date numele acesteia trebuie sa fie definit print('Numele Bazei de Date nu a fost specificat'); require('pre_creare.php'); }elseif($rec_num==0){//pentru a modifica un element trebuie specificat numarul acestuia print('Nu ati specificat nici un element'); require('afisare.php'); }else{ $db=dbase_open('files/'.$db_link,2); //deschide BD $rec=dbase_get_record_with_names($db,$rec_num); //citeste elementul ce trebuie modificat $i=0; foreach(array_keys($rec) as $key) //pentru fiecare camp al inregistrarii if($key!='deleted') { $row[]=$_GET[$key]; // modifica valoarea campului cu valoarea corespunzatoare trimisa prin metoda GET } dbase_replace_record($db,$row,$rec_num); //modifica efectiv elementul in BD dbase_close($db); //inchide BD print('Inregistrarea a fost modificata cu succes'); print('<hr align="center" size="2">'); //afiseaza codul necesar pentru a realiza aceasta operatie din mediul FoxPro print("Codul FoxPro corespunzator operatiei de modificare:<br>"); print('<p align="left"><font color="#FFFFCC">'); print('USE '.$db_name.'<br>'); print('GO '.$rec_num.'<br>REPLACE&nbsp;'); unset($rec['deleted']); $keys=array_keys($rec);
Pagina 51 din 54

$last=$keys[count($keys)-1]; foreach(array_keys($rec) as $key) { //functia is_numeric verifica daca valoarea este numerica iar functia strtolower sirul in litere mici if(is_numeric($_GET[$key])) print(strtolower($key).' WITH '.$_GET[$key]); else print(strtolower($key).' WITH \''.$_GET[$key].'\''); if($key!=$last) print(', '); } print('<br>CLOSE DATABASES'); print('</font></p>'); } ?> </strong></font></center><br>

Pagina 52 din 54

sterge.php <center><font color="#CCCCCC" size="+1"><strong> <?php if(empty($db_name)){//pentru a sterge un element numele BD trebuie sa fie definit print('Numele Bazei de Date nu a fost specificat'); require('pre_creare.php'); }elseif($rec_num==0){//pentru a sterge un element trebuie specificat numarul acestuia print('Nu ati specificat nici un element'); require('afisare.php'); }else{ $db=dbase_open('files/'.$db_link,2); //deschide BD dbase_delete_record($db,$rec_num); //marcheaza ca sters elementul selectat dbase_pack($db); //sterge efectiv inregistrarea din BD dbase_close($db); //inchide BD print('Inregistrarea a fost stearsa cu succes'); print('<hr align="center" size="2">'); //afiseaza codul necesar pentru a realiza aceasta operatie din mediul FoxPro print("Codul FoxPro corespunzator operatiei de stergere:<br>"); print('<p align="left"><font color="#FFFFCC">'); print('USE '.$db_name.'<br>'); print('DELETE RECPRD '.$rec_num.'<br>'); print('PACK DBF <br>'); print('<br>CLOSE DATABASES'); print('</font></p>'); } ?> </strong></font></center><br>

Pagina 53 din 54

files.php <font color="#CCCCCC" size="+1"><strong> <?php print('Baze de date existente: &nbsp;'); $d = dir("files/"); //initializeaza clasa dir while (false !== ($entry = $d->read())) { //atata timp cat mai sunt fisiere in director if(strstr($entry,'.dbf')) // daca fisierul are extensia .dbf { $dbfile=substr($entry,0,strlen($entry)-4); // citeste numele fisierului fara extensie print('<a href="index.php?op=afisare&db='.$dbfile.'">'.$dbfile."</a>&nbsp;&nbsp;"); //afiseaza numele fisierului ca link pentru a putea fi selectat din pagina } } $d->close(); //distruge obiectul dir ?> </strong></font>

Pagina 54 din 54