Interfata Web Pentru Administrarea Bazelor de Date
Cuprins
Interfețe web pentru baze de date
Proiectarea unei interfețe evoluate
În procesul dezvoltării unei aplicații software, studierea interfațării om-calculator prezintă o importanță deosebită, scopul principal al unui astfel de studiu fiind realizarea de interfețe cât mai ușor de utilizat, cât mai prietenoase, cât mai „utilizabile”.
Gradul de utilizabilitate al unei interfețe rezultă din considerarea mai multor criterii, cum ar fi:
Ușurința de învățare si de reamintire din partea unui utilizator;
Eficiența, adică rapiditatea de executare a acțiunilor complexe;
Gradul de consistență și de unitate;
Flexibilitatea.
Importanța proiectării de interfețe evoluate care să răspundă eficient nevoilor utilizatorilor este evidențiată și de dezvoltarea accentuată, în ultimii ani, a ergonomiei interfețelor, și, în acest cadru general, al unui domeniu specializat de ergonomie: ergonomia cognitivă.
Ergonomia cognitivă are în vedere aspectele cognitive, mentale și psihice ale ergonomiei interfețelor. Principiile enunțate de ergonomia cognitivă sunt:
Principiul coerenței, al caracterului unitar al constituenților interfeței, (conform și principiilor gestaltiste);
Principiul conciziunii, al asigurării unei economii cognitive în scopul reducerii efortului cognitiv;
Principiul asigurarea unei reacții (feedback) la orice acțiune, pentru a furniza permanent informații utilizatorului asupra funcționării sistemului, în vederea înțelegerii cât mai usoare a stării curente și a detectării situațiilor nedorite, altfel spus, pentru asigurarea imersiunii utilizatorului sau asigurarea unei stări de flux.
Interfațarea om-calculator poate fi analizată și studiată din trei perspective:
1. Perspectiva care consideră aspectele umane include studierea aspectelor
fiziologice, adică a rolului în interfațare a percepției (vizuale, auditive sau tactile), memoriei, prelucrării semnalelor,
psihologice, cum ar fi: percepția imaginilor și formelor, modelarea mentală, recunoașterea configurațiilor, învățarea, memorarea, reprezentarea cunoștințelor, rezolvarea de probleme, înțelegerea și folosirea limbajului natural, afectivitatea,
sociologice, în special în contextul interfețelor pe Internet, care permit interacțiunea cu un număr imens de alte persoane;
filosofice, ontologice si hermeneutice.
Perspectiva interfeței, care include aspectele de: comunicare, semiotică, limbaj, ergonomie.
Perspectiva computațională, tehnologică, care include aspectele de realizare a aparaturii necesare și, în special a tehnicilor si resurselor de programare implicate, cum ar fi: grafica interactivă, programare orientată spre obiecte, componente program reutilizabile, programare bazată pe evenimente, tratarea excepțiilor, programare bazată pe cunoștințe (inteligență artificială), limbaje de adnotare evoluate, ingineria programării.
Din punctul de vedere al programatorului care dezvoltă o interfață prezintă interes cea de-a doua perspectivă de analiză a interfațării om-calculator, perspectiva interfeței. Raportat la această perspectivă, se disting mai multe clase de interfețe:
interfețe textuale, care folosesc comunicarea (tipărită sau vorbită), în limbaj natural sau în limbaje specializate;
interfețe cu manipulare directă, care sunt caracterizate prin: reprezentarea continuă a elementelor de interes ale interfeței, utilizarea unor acțiuni fizice simple, de tipul “apăsării de butoane” sau “plasează” (“drag and drop”), în locul comenzilor textuale, cu nume si sintaxă complexe, operații incrementale rapide, cu impact vizual imediat asupra elementelor de interes (de exemplu, deplasarea unui element este văzută ca atare).
Dintre cele două mari clase de interfețe, o popularitate ridicată o înregistrează interfețele cu manipulare directă, mai ales o dată cu dezvoltarea rapidă a internetului, fapt ce explică alegerea tot mai multor programatori de a construi o interfață web pentru o aplicație software.
Problematica interfațării aplicațiilor web cu bazele de date
Interfațarea cu bazele de date este o problemă foarte dezbătută datorită utilizării ei pe o scară foarte largă. Datorită evoluției rapide a internetului și odată cu acesta a aplicațiilor web au apărut în domeniu nenumărate soluții propuse la noi probleme: aducerea interfețelor pentru utilizator într-o unealtă care este acum familiară majorității utilizatorilor, adică un browser web.
Două dintre cele mai populare modalități de a aduce funcționalitatea bazelor de date la discreția utilizatorului prin interfețe web evoluate s-au remarcat a fi PHP, în special pentru baze de date MySQL, și Java JDBC, în special pentru baze de date Oracle.
Voi descrie în continuare aceste două modalități de interfațare în detaliu pentru a putea înțelege problemele care se pun la interfațare precum și care sunt punctele critice.
Folosirea PHP pentru interfațarea cu MySQL
Pentru multă lume, principala rațiune de a învăța un limbaj precum PHP ar fi interacțiunea pe care o oferă cu bazele de date. In acest capitol caut să explic cum se folosește PHP și MySQL, pentru a memora informații pe Web și cum includem toate acestea pe site-ul Web.
Este, de fapt, surprinzător cât de utilă poate fi o bază de date, mai ales atunci când poate fi folosită într-un site Web. Sunt foarte multe lucruri care se pot face într-un astfel de caz, de la afișarea unor simple liste și până la producerea integrală a paginilor Web dintr-o bază de date. Câteva exemple cu PHP și MySQL, folosite împreună, sunt:
Schimbarea – rotația Banner-elor.
Pentru a realiza schimbarea pe ecran a imaginilor la diferitele vizitări ale unei pagini și a asigura astfel un interes mai mare al vizitatorilor, se poate folosi un script PHP care deschide o bază de date și extrage aleator o imagine sau un set de imagini, pentru a-l include într-un set de pagini Web.
Scriptul PHP va contoriza deasemeni numărul de câte ori a fost văzut banner-ul, putând, cu modificări minore, să urmărească chiar și numărul de click-uri. Pentru a adăuga, schimba sau edita bannerele, tot ce avem de făcut este să schimbăm baza de date iar scriptul va încărca banner-ul corect în toate paginile site-ului Web.
Forumurile Web.
Sute de forumuri de dezbatere sunt acum realizate – rulează în PHP și MySQL. Acestea s-au dovedit mult mai eficiente dacât alte sisteme, creind câte o pagină pentru fiecare mesaj și oferind o largă varietate de opțiuni. Toate paginile forumului pot fi actualizate prin schimbarea unui script PHP.
Bazele de Date.
Un astfel de exemplu (edificator) îl oferă site-urile care dau toate informațiile dintr-o bază de date. Spre exemplu, Script Avenue este rulat de câteva scripturi, care furnizează toate informațiile dintr-o bază de date amplă. Toate categoriile de scripturi diferite pot fi accesate într-un singur script exact prin schimbarea URL-ului pentru a accesa diferite părți ale bazei de date.
Site-urile Web.
Când avem un site de mari dimensiuni – cu multe pagini, și dorim să modificăm aspectul general sau să schimbăm proiectul, chestiunea ar cere foarte mult timp pentru aducere la zi și încărcare.
Cu PHP și MySQL întregul site Web se poate reduce la unul sau două scripturi PHP care să acceseze o bază de date MySQL pentru a obține informațiile pentru paginile Web. Pentru a actualiza sau a modifica proiectul centrului Web nu trebuie să schimbăm decât o pagină.
Sunt necesare trei componente pentru a putea rula scripturi PHP care să acceseze baze de date MySQL.
În primul rând, este nevoie de un server Web.
Acesta poate fi sau pe calculatorul personal sau pe o 'gazdă' Web. Oricare pachet – oricare tip de server Web este acceptat și va lucra cu PHP și MySQL, dar cel mai recomandat este Apache, care e public și gratis.
PHP trebuie să fie instalat pe server.
Dacă nu este deja instalat, puteți să o faceți sau să apelați la administratorul serverului Web, în acest sens. Pachetul de instalare poate fi descărcat – preluat de la http://PHP.net și este deasemeni public – gratuit. Dacă nu sunteți sigur dacă este sau nu instalat, o să vedeți mai jos cum vă puteți lămuri.
Chiar dacă tot ce ține de administrarea bazelor de date poate fi realizat prin scripturi PHP, instalarea pe server a pachetului PHPMyAdmin poate aduce un plus de confort. Este un excelent set de scripturi care asigură o interfață administrativă pentru bazele de date MySQL. Este și public-gratuit.
Cu el puteți adăuga, elimina, edita, salva și vizualiza bazele de date, fiind deosebit de util pentru depanare.
În fine, aveți nevoie de MySQL.
Acesta este de fapt pachetul de programe pentru gestiunea bazelor de date. Puteți folosi deasemeni multe alte sisteme de baze de date (SQL, Oracle etc.) dar aici discutăm despre PHP/MySQL, deci avem nevoie de MySQL (cu toate că se folosesc comenzi care țin de limbajul SQL 'merg' la oricare din sistemele de baze de date SQL). Și pachetul MySQL este public – gratuit, putând fi preluat din pagina oficială a MySQL.
Dacă nu puteți instala PHP și MySQL, sau dacă gazda Web nu v-o permite, puteți apela la alt server Web, la altă gazdă. Spre exemplu, Freedom2Surf este un server Web public, care acordă acces liber și suportă PHP, având MySQL instalat. HostRocket este un alt server excelent care oferă spațiu de până la 300 MO, și include PHP, MySQL și multe altele, dar percepe o taxă de abonament.
Cum aflăm dacă PHP și MySQL sunt instalate corect ?
Există un test simplu, atât pentru PHP cât și pentru MySQL:
Lansați – deschideți un editor de texte și scrieți următoarele:
<?
phpinfo();
?>
salvând fișierul cu un nume precum phpinfo.php
Apoi încărcați acest fișier în spațiul web, pe server, apelându-l, după aceea, din navigator. Dacă PHP-ul este deja instalat veți căpăta o pagină plină cu toate detaliile instalării respective. Parcurgeți atunci aceste informații. Dacă găsiți o secțiune despre MySQL atunci înseamnă că MySQL este și el deja instalat.
Crearea unei baze de date MySQL
Bazele de date MySQL au un sistem de inițializare standard (un setup). Este vorba de o bază de date, compusă din tabele, oarecum separate, conținând diferite câmpuri, etc. chiar dacă sunt parte dintr-o bază de date. Fiecare tabelă conține înregistrări care sunt făcute din câmpuri.
Procesul de instalare a unei baze de date MySQL diferă de la o platformă la alta. In esență este vorba peste tot de un nume al bazei de date, un nume de utilizator (cont) și o parolă. Aceste informații sunt cerute pentru conectarea la baza de date.
Dacă aveți pachetul PHPMyAdmin (sau un program similar) instalat, atunci puteți să intrați și să vă conectați introducând contul (numele de utilizator) și parola. Dacă nu aveți așa ceva, atunci trebuie să faceți întreaga administrare a bazelor de date folosind script-uri PHP (și o puteți face).
Mai înainte de a folosi orice legat de baza de date, trebuie să vă creați o tabelă. O tabelă este o secțiune a bazei de date pentru memorarea unor informații structurate (legate). Intr-o tabelă vom defini diferite câmpuri care vor fi folosite în acea tabelă. Din cauza acestei construcții, aproape toate centrele cu baze de date trebuie să fie satisfăcute folosind doar o bază de date.
Crearea unei tabele în PHPMyAdmin este simplă, scrieți numele, selectați numărul de câmpuri și “apăsați" butonul (click). Ajungeți atunci la un ecran setup în care trebuie să creați câmpurile pentru baza de date. Dacă folosiți un script PHP pentru a crea propria bază de date, iar, completa creere și inițializarea vor fi făcute îtr-o singură comandă.
Există o largă varietate de câmpuri și de atribute disponibile în MySQL și vom discuta doar câteva din ele:
Acestea sunt doar câteva dintre câmpurile disponibile. O căutare pe Internet poate furniza lista cu toate tipurile de câmpuri permise.
Să creem o tabelă din PHP este ceva mai dificil decât cu MySQL. Avem de parcurs următorii pași:
CREATE TABLE nume_tabel {
Fields
}
Câmpurile sunt definite după cum urmează:
fieldname type(length) extra info,
Ultimu,
Ultimul câmp introdus nu poate include nici o virgulă.
Vom crea o bază de date “contacts” pe care o voi descrie în continuare și o vom lua ca exemplu și în capitolele următoare în exemplificarea folsririi PHP cu MySQL. Baza de date de contact va conține toate informațiile de contact ale cunoscuților introduși în table, iar informațiile vor putea fi editate și consulate în internet.
Următoarele câmpuri vor fi folosite în baza de date:
Am folosit un tip de câmp VARCHAR pentru coloana mumăr_telefon/fax, chiar dacă acestea sunt formate din cifre. Chiar dacă am putea folosi tipul INT, este preferabil să folosim VARCHAR pentru că astfel vor fi permise spații și cratime, precum și porțiuni de text, la fel ca numerele scrise ca text (exemplu 1800-COMPANY) și cum nu vom iniția apeluri telefonice de pe Web, totul e în ordine.
Există încă ceva de care trebuie să avem grije în această bază de date. Câmpul id va fi pus ca PRIMARY, INDEX, UNIQUE și inițializat ca auto_increment (poziție ce apare în Extra în PHPMyAdmin). Rațiunea pentru asta este că acesta va fi câmpul identificator (primar sau index) și deci trebuie să fie unic. Definirea sa ca auto increment înseamnă că la adăugarea fiecărei înregistrări, câtă vreme nu specificăm acolo un id, acesta va primi ca valoare următorul număr.
Pentru a crea această tabelă vom folosi următoarea secvență de comenzi PHP. O parte dintre comenzile de mai jos n-au fost încă discutate, dar le vom explica în detaliu în continuare.
<?
$user="username";
$password="password";
$database="database";
mysql_connect(localhost,$user,$password);
@mysql_select_db($database) or die( "Baza de date nu poate fi selectata");
$query="CREATE TABLE contacts (
id int(6) NOT NULL auto_increment,
nume varchar(15) NOT NULL,
prenume varchar(15) NOT NULL,
telefon varchar(20) NOT NULL,
mobil varchar(20) NOT NULL,
fax varchar(20) NOT NULL,
email varchar(30) NOT NULL, web varchar(30) NOT NULL,
PRIMARY KEY (id),UNIQUE id (id),KEY id_2 (id))";
mysql_query($query);
mysql_close();
?>
Introducerea datelor în baza de date MySQL
Primul lucru care trebuie făcut, mai înainte de a putea face ceva, este conectarea la baza de date MySQL. Acesta este un pas foarte important, pentru că, dacă nu suntem conectați, comenzile către baza de date vor eșua.
Practic, pentru a folosi o bază de date trebuie să precizăm numele de utilizator (username), parola (password) și numele bazei de date :
$username="nume_utilizator";
$password="parola";
$database="numele_bazei_de_date";
Desigur, aici s-ar putea discuta dacă nu este riscant să păstrăm parola într-un fișier. Nu trebuie să vă alarmați, însă, deoarece sursa PHP este prelucrată de server înainte de a fi trimisă navigatorului, astfel încît este imposibil pentru orice utilizator să vadă scriptul.
Apoi, avem nevoie de o comandă care să lanseze conexiunea la baza de date:
mysqli_connect(localhost,$username,$password);
Pentru a putea folosi această funcție precum și celelalte funcții din pachetul mysqli, trebuie ca pe serverul web să fie instalată și configurată extensia MySQLi. Manualul PHP este unealta ideală pentru a va ajuta cu detaliile de configurare și instalare a acesteia. Pentru o listă completă a funcțiilor disponibile în acest pachet vă puteți referi la capitolul Detalii de implementare.
Revenind la problema de față, această linie spune PHP-ului să se conecteze la serverul de baze de date MySQL la 'localhost' (localhost se numește serverul pe care rulează PHP-ul, astfel că în afara cazului în care gazda Web indică altceva, vom folosi localhost și numele de cont memorat în $username și parola din $password.
Mai înainte de a discuta cum lucrăm cu baza de date, vom vedea încă o comandă:
mysqli_close();
Aceasta este o comandă foarte importantă care închide conexiunea cu serverul de baze de date. Scriptul va rula încă, dacă nu includem această comandă, iar prea multe conexiuni MySQL deschise pot cauza probleme serverului web. Este un obicei bun să includem comanda de închidere de mai sus după ce am introdus toate comenzile către baza de date, pentru a menține platforma în bună stare.
După ce ne-am conectat la severul de baze de date, trebuie să selectăm baza de date pe care vrem s-o folosim. Trebuie să fie o bază de date la care avem acces cu respectivul nume de utilizator. Se folosește următoarea comandă:
@mysqli_select_db($database) or die( "Baza de date nu poate fi selectata");
Aceasta spune PHP-ului să selecteze baza de date specificată în variabila $database (pe care am definit-o mai înainte). Dacă conexiunea nu se poate realiza procesul (execuția script-ului) se oprește afișând textul:
Baza de date nu poate fi selectata
Această parte suplimentară 'or die' este bună pentru ieșire, chiar dacă nu asigură decât un minim control al erorii.
După conectarea la server și selecția bazei de date dorite, putem începe execuția comenzilor pe server.
Există două moduri de a executa o comandă. Prima revine pur și simplu la introducerea comenzii în PHP. Acest lucru merge atunci când nu apar rezultate ca urmare a execuției comenzii.
Cea de a doua variantă este să definim comanda ca o variabilă. Astfel se vor atribui variabilei rezultatele operației. Vom folosi prima cale, deoarece nu așteptăm răspuns de la baze de date. Comanda va arăta astfel:
mysql_query($query);
Folosirea acestei forme a comenzii este utilă pentru că repetăm pur și simplu aceiași comandă iarăși și iarăși fără a fi nevoie să memorăm altele. Tot ce avem de făcut este să schimbăm variabila.
Acum ne vom întoarce la baza de date cu adrese de contact, pe care am creat-o în subcapitolul anterior. Pentru a introduce primele informații în baza de date:
Nume: Ionescu
Prenume: Gheorghe
Telefon: 021 3456789
Mobil: 0724 334455
Fax: 0264 567891
E-mail: [anonimizat]
Web: http://www.inext.ro
Toate acestea vor fi introduse cu o singură comandă:
$query = "INSERT INTO contacts VALUES ('','Ionescu', 'Gheorghe', '0213456789', '0724334455', '0264567891', '[anonimizat]', 'http://www.inext.ro')";
Mai întâi, apare variabila $query căreia îi atribuim o comandă. Următoarea parte, adică:
INSERT INTO contacts VALUES
este destul de ușor de înțeles. Ea spune PHP-ului să insereze în tabel numită contacts valorile care urmează (scrise între paranteze).
Acolo, între paranteze, avem toate câmpurile de adăugat. Apar toate câmpurile în ordine și sunt inserate informațiile dintre ghilimele. Spre exemplu:
Ionescu
va fi inserat în al 2-lea câmp, care, în această tabelă este câmpul 'nume' .
Nu am inserat nimic în primul câmp din baza de date (id). Aceasta din cauză că acest câmp va fi un câmp index, elementul unic de identificare. Fiecare înregistrare din baza de date va avea un unic ID. Din această cauză, când încărcăm baza de date, vom pune ID pe 'Auto Increment'. Asta înseamnă că, ne-atribuindu-i nici o valoare, el va lua la fiecare înregistrare următoarea valoare din șir. Iar prima înregistrare va avea valoarea ID=1 .
Afișarea datelor din baza de date
Introducerea datelor din paginile HTML este aproape identică cu inserarea lor din script-uri PHP. Avantajul constă, însă, în faptul că nu apare nevoia schimbării script-ului pentru fiecare câmp de introdus. In plus, putem permite "vizitatorilor" să introducă direct datele lor.
Iată mai jos cum arată o pagină HTML cu celule text pentru introducerea detaliilor corespunzătoare:
<form action="insert.php" method="post">
Nume Familie: <input type="text" name="nume"/><br/>
Prenume: <input type="text" name="prenume"/><br/>
Telefon: <input type="text" name="telefon"/><br/>
Mobil: <input type="text" name="mobil"/><br/>
Fax: <input type="text" name="fax"/><br/>
E-mail: <input type="text" name="email"/><br/>
Web: <input type="text" name="web"/><br/>
<input type="Submit"/>
</form>
Această pagină poate fi, desigur, formatată și pot apare diferite schimbări – variante. Este doar un formular de pornire, ilustrativ. Va trebui însă editat script-ul din lecția precedentă, pentru ca, în locul introducerii informațiilor direct din script în baza de date, să fie folosite variabilele:
<?
$username="username";
$password="password";
$database="baza_mea_de_date";
mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die( "Baza de date nu poate fi selectata");
$query = "INSERT INTO contacts VALUES ('','$nume','$prenume','$telefon','$mobil','$fax','$email','$web')";
mysql_query($query);
mysql_close();
?>
Acest script trebuie salvat ca fișier cu numele insert.php, astfel ca să poată fi apelat de formularul HTML. Treaba va merge întrucât, în loc ca datele să fie introduse local, ele se introduc în formular și sunt memorate în variabilele care apar precizate acolo și care sunt transmise apoi PHP-ului.
Putem să adăugăm script-ului un mesaj care să confirme preluarea datelor. Asta face parte din 'oferta' de bază a PHP și rămâne ca exercițiu.
Acum avem în baza de date cel puțin o înregistrare, dacă nu mai multe. Se pune problema cum vizualizăm, cum scoatem aceste date folosind PHP.
Prima comandă la care vom apela este comanda SELECT din SQL, folosită într-o cerere MySQL în forma:
SELECT * FROM contacts
Aceasta este o comandă de bază din MySQL și orice bază de date în general, care va spune script-ului să selecteze toate înregistrările din tabela contacts. Dar, de data aceasta, comanda furnizează un rezultat, ea va trebui executată atribuind rezultatele unei variabile:
$query = "SELECT * FROM contacts";
$rezultat = mysql_query($query);
In acest caz, întregul conținut al bazei de date va fi atribuit variabilei cu numele $rezultat (care va fi deci o matrice, un tablou). Mai înainte de a putea scoate aceste date va trebui să le extragem ca variabile simple, separate. Pentru asta trebuie să știm câte înregistrări avem în tabelă (deci și în variabila $rezultat ).
Avem o comandă specială în MySQL pentru calculul numărului de linii din tabelă. Este importantă pentru că în baza de date se fac uzual numeroase actualizări, completări, ștergeri.
$num=mysql_numrows($rezultat);
Astfel, variabila $num va căpăta ca valoare numărul de linii din $rezultat (adică tocmai din baza de date). Acest număr va putea fi folosit în continuare pentru ciclul în care se vor analiza și desface în variable separate câmpurile fiecărei linii.
Avem de scris un ciclu pentru a selecta din tabel (din rezultat) linie cu linie. Definim un indice, o variabilă $i care va parcurge (cu incrementare) valorile de la 1 la $num.
$i=0;
while ($i < $num) {
OPERATIILE ASUPRA LINIEI
++$i;
}
Acesta este un ciclu tipic în PHP și va executa ansamblul numit OPERATIILE ASUPRA LINIEI de exact $num ori, adică de atâtea ori cât trebuie. La fiecare reluare $i fiind mărit cu o unitate. Astfel $i poate fi folosit și pentru a preciza numărul liniei care se prelucrează.
In partea pe care am numit-o OPERATIILE ASUPRA LINIEI trebuie să separăm fiecare câmp din linia – înregistrare asociindu-l unei variabile. Folosim pentru asta următoarea secvență:
$variable=mysql_result($rezultat,$i,"numele_campului");
Astfel, pentru a extrage fiecare componentă din baza noastră de date, vom folosi următoarele instrucțiuni:
$nume=mysql_result($result,$i,"nume");
$prenume=mysql_result($result,$i,"prenume");
$telefon=mysql_result($result,$i,"telefon");
$mobil=mysql_result($result,$i,"mobil");
$fax=mysql_result($result,$i,"fax");
$email=mysql_result($result,$i,"email");
$web=mysql_result($result,$i,"web");
Nu ne-am ocupat aici de câmpul ID (deși o puteam face) pentru că nu ne este necesar la afișare datelor.
Acum putem scrie script-ul complet pentru scoaterea datelor. In acest script datele nu sunt formatate, adică vor fi afișate toate cu același font, predefinit.
<?
$username="username";
$password="password";
$database="baza_noastra_de_date";
mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die( "Baza de date nu poate fi selectata");
$query="SELECT * FROM contacts";
$rezultat=mysql_query($query);
$num=mysql_numrows($rezultat);
mysql_close();
echo "<b><center>Database Output</center></b><br><br>";
$i=0;
while ($i < $num) {
$nume=mysql_result($rezultat,$i,"nume");
$prenume=mysql_result($result,$i,"prenume");
$telefon=mysql_result($result,$i,"telefon");
$mobil=mysql_result($result,$i,"mobil");
$fax=mysql_result($result,$i,"fax");
$email=mysql_result($result,$i,"email");
$web=mysql_result($result,$i,"web");
echo "<b>$nume $prenume</b><br>Telefon: $telefon<br>Mobil: $mobil<br>Fax: $fax<br>E-mail: $email<br>Web: $web<br><hr><br>";
++$i;
}
?>
Am scos o listă cu toate persoanele înregistrate în baza de date. De fapt am ajuns să avem definite variabilele care permit scoaterea sau afișarea, încheind cu o comandă destul de simplă de afișare (echo) fără a o explica.
Desigur, datele din tabel ar trebui prezentate pe ecran tot în forma unui tabel. Iar acest lucru nu este prea complicat. In fond se rezumă la a ști să afișezi (scoți) fiecare variabilă în parte, urmând ca tot restul privind formatarea, organizarea ca tabel, etc., să fie doar legat de cunoașterea HTML.
Tot ce avem de făcut deci este să folosim PHP pentru scoaterile HTML incluzând variabilele în zonele corecte. Cel mai simplu este să închidem tagul PHP și să introducem liniile normale din HTML. Oridecâte ori ajungem la o variabilă o vom include folosind o secvență de forma:
<? echo "$numele_variabilei"; ?>
Putem atunci să folosim un ciclu PHP pentru a repeta o secvență de cod ca cea de mai sus, la includerea variabilelor într-un tablou. Spre exemplu, folosind secvența de cod din lecția precedentă cu ciclul corespunzător, putem formata scoaterile pentru ca să apară într-o tabelă mare:
<table border="0" cellspacing="2" cellpadding="2">
<tr>
<th><font face="Arial, Helvetica, sans-serif">Nume</font></th>
<th><font face="Arial, Helvetica, sans-serif">Telefon</font></th>
<th><font face="Arial, Helvetica, sans-serif">Mobil</font></th>
<th><font face="Arial, Helvetica, sans-serif">Fax</font></th>
<th><font face="Arial, Helvetica, sans-serif">E-mail</font></th>
<th><font face="Arial, Helvetica, sans-serif">Website</font></th>
</tr>
$i=0;
while ($i < $num) {
$nume=mysql_result($rezultat,$i,"nume");
$prenume=mysql_result($result,$i,"prenume");
$telefon=mysql_result($result,$i,"telefon");
$mobil=mysql_result($result,$i,"mobil");
$fax=mysql_result($result,$i,"fax");
$email=mysql_result($result,$i,"email");
$web=mysql_result($result,$i,"web");
?>
<tr>
<td><font face="Arial, Helvetica, sans-serif"><? echo "$nume $prenume"; ?></font></td>
<td><font face="Arial, Helvetica, sans-serif"><? echo "$telefon"; ?></font></td>
<td><font face="Arial, Helvetica, sans-serif"><? echo "$mobil"; ?></font></td>
<td><font face="Arial, Helvetica, sans-serif"><? echo "$fax"; ?></font></td>
<td><font face="Arial, Helvetica, sans-serif"><a href="mailto:<? echo "$email"; ?>">E-mail</a></font></td>
<td><font face="Arial, Helvetica, sans-serif"><a href="<? echo "$web"; ?>">Website</a></font></td>
</tr>
<?
++$i;
}
echo "</table>";
Această secvență va afișa antetul tabelului, apoi va adăuga o linie suplimentară pentru fiecare înregistrare din baza de date, formatând datele la scoatere.
Dacă sunteți deja familiarizați cu PHP și HTML, atunci lucrurile sunt probabil destul de clare – de ușor de înțeles. O să explicăm doar una din liniile din tabel, spre exemplu:
<a href="mailto:<? echo "$email"; ?>">E-mail</a>
care construiește o legătură email la adresa transmisă de variabila $email . Asta arată una dintre calitățile importante și utile ale folosirii PHP pentru includerea datelor MySQL . Adică prin astfel de scoateri putem face paginile Web dinamice.
La fel cu afișarea întregii baze de date, PHP poate fi folosit pentru a selecta date individuale, doar anumite înregistrări, sau înregistrările care verifică anumite criterii. Pentru asta trebuie să folosim o variațiune a cererii SELECT . Pentru afișarea întregii tabele am folosit cererea:
SELECT * FROM contacts
Dacă vrem însă să selectăm doar pe acele persoane care au prenumele 'Mihai' vom folosi o cerere de forma:
SELECT * FROM contacts WHERE prenume='mihai'
Ca și la alte cereri – comenzi SQL, avem de fapt propoziții foarte apropiate de formularea curentă din limba engleză. Intr-un mod asemănător vom putea selecta înregistrările pe baza oricărui câmp din baza de date. Dar se poate selecta o înregistrare folosind mai multe câmpuri, adăugând în formularea cererii clauza:
field='value'
Fără a intra în prea multe detalii, vom mai spune că putem folosi variabilele pentru a transmite criteriul dorit pentru selecție. Spre exemplu, dacă dintr-un formular de căutare primim a variabilă numită $nume_cautat putem imagina următoarea secvență:
$query="SELECT * FROM contacts WHERE nume='$nume_cautat'";
$result=mysql_query($query);
Rețineți că la sfârșitul primei linii avem un ' urmat de " , înainte de ; .
Prin scoaterea tuturor informațiilor dintr-o bază de date, este puțin probabil să ajungem la situația când nu mai sunt date. Dar dacă am permis ajustări și, ștergeri și actualizări ale înregistrărilor, atunci se prea poate să ajungem la o eroare. Din fericire, cu PHP și MySQL, avem un mod simplu de a evita o astfel de situație folosind:
$num=mysql_numrows($rezultat);
unde $rezultat conține rezultatul unei cereri – interogări a bazei de date ( precum selectarea tuturor înregistrărilor).
Așa cum am discutat mai sus, aceasta va atribui variabilei $num numărul de linii din rezultat (care s-a utilizat într-un ciclu, în lecția a 4-a). Putem insera în ciclu o comandă de captare/tratare a erorilor folosind o instrucțiune IF :
if ($num==0) {
echo "Baza de date nu conține nici o înregistrare";
} else {
Output Loop
}
Putem dezvolta ramura asta făcând-o mai prietenoasă. Spre exemplu, oferind o legătură la pagina Add Data, de introducere de informații în baza de date, atunci când ea este vidă.
Nu numai că putem scoate datele în funcție de conținutul unui câmp, dar putem ordona aceste date pe baza unei reguli aplicată conținutului unei coloane (spre exemplu aranjând utilizatorii în ordine alfabetică). In mod normal, afișarea în urma unei interogări se face în ordinea stabilită de identificatorul ID, pornind de la 1 în sus. Putem însă alege modul de ordonare (sortarea) după oricare coloană din tabel.
Spre exemplu, o ordonare utilă ar putea fi după numele de botez. Asta însemnând în ordine ascendentă (crescătoare, de la A la Z și de la 1 la 10…). Pentru a obține un astfel de rezultat folosim următoarea cerere:
SELECT * FROM contacts ORDER BY prenume ASC
Putem folosi, desigur și ordonarea descendentă, specificând DESC în locul lui ASC .
Valoarea care i se atribuie (ca mai sus) variabilei $num este foarte importantă, nu numai pentru cicluri și captarea erorilor. Un exemplu poate fi scoaterea doar a ultimelor 5 înregistrări adăugate bazei de date. Mai întâi, avem ordonarea naturală, stabilită de ID, (ultima înregistrare având valoarea maximă a ID), dar vom alege ordinea descendentă.
Astfel vom avea înregistrările începând cu cea mai recentă și terminând cu cea mai veche. Mai trebuie doar să numărăm, afișând doar primele 5.
Desigur, înainte de a începe ciclul de cinci, trebuie să ne asigurăm că $num este mai mare decât 5 . Avem deci o secvență de forma:
if ($num<5) {
$to=$num;
}else{
$to=5;
}
$i=0;
while ($i < $to) {
SECVENTA DE COMENZI mysql PENTRU SCOATERE
}
Cu alte cuvinte, dacă avem mai mult de cinci linii în tabel atunci ciclul se va face de la 0 la 5. In caz contrar, dacă sunt mai puțin de 5 linii, ciclul va parcurge exact numărul respectiv de linii.
Actualizarea datelor din baza de date
Atunci când am creat baza de date (cartea de adrese), am inclus un câmp numeric numit id pe care l-am stabilit ca auto_increment și i-am dat rolul de câmp primar. Am discutat cum acesta are rolul de identificator unic pentru fiecare înregistrare din baza de date. Acum facem un pas înainte, folosind acest câmp pentru a selecta anumite înregistrări din baza de date.
Iată cum putem selecta înregistrări din baza de date folosind conținutul unui câmp particular:
SELECT * FROM contacts WHERE field='value'
Atunci, folosind unicitatea câmpului ID putem selecta orice înregistrare din baza de date, folosind:
SELECT * FROM contacts WHERE id='$id'
unde $id este o variabilă conținând numărul unei înregistrări. Spre exemplu, dacă dorim să avem o pagină Web generată dinamic dintr-o bază de date cu un singur script PHP, putem scrie script-ul ca să includă pagini Web distincte ca înregistrări ale bazei de date.
Atunci, folosind câmpul id, putem selecta fiecare pagină individuală plasând-o la soatere. Putem chiar folosi chiar URL-ul paginii pentru a specifica înregistrarea dorită
http://www.centrul_propriu.ro/stiri/items.php?item=5476
iar script-ul PHP să caute înregistrarea care are numărul de ordine (id-ul) care corespunde valorii variabilei $item, care în acest caz este 5476
Folosind această metodă de alegere a înregistrării folosind URL-ul, înregistrarea poate fi extinsă prin generarea dinamică a URL-ului. Pare cam complicat. Vom vedea cum realizăm o pagină de aducere la zi a bazei de date cu adresele. Cu ideea ca utilizatorul să-și poată modifica propriile detalii din înregistrare.
Pentru asta, vom include o nouă coloană cuprinzând o legătură Update . Această legătură conducând la o pagină care să permită utilizatorului să actualizeze înregistrarea. Pentru a selecta înregistrarea din acea pagină vom pune:
?id=$id
Căpătând identificatorul id al înregistrării, secvența aceasta va crea o legătură la fiecare din înregistrări.
Am văzut cum creem o legătură pentru fiecare înregistrare pentru a ne poziționa în scriptul de actualizare. Prin folosirea variabilei $id , legăturile respective pot transmite valoarea corecta a identificatorului ID către script, astfel ca acesta să poată actualiza baza de date.
Vom realiza deci un script de actualizare, care va avea două părți:
Pagina de afișare a actualizării
Prima parte a script-ului de actualizare folosește procedeul de selecție a unei singure înregistrări, așa cum l-am scris în lecția precedentă, adăugând doar câteva elemente HTML pentru a-l face mai util. Mai întâi, ne connectăm la baza de date și selectăm înregistrarea potrivită.
$id=$_GET['id'];
$username="nume_utilizator";
$password="parola";
$database="baza_de_date";
mysql_connect(localhost,$username,$password);
$query=" SELECT * FROM contacts WHERE id='$id'";
$result=mysql_query($query);
$num=mysql_numrows($rezultat);
mysql_close();
$i=0;
while ($i < $num) {
$nume=mysql_result($rezultat,$i,"nume");
$prenume=mysql_result($rezultat,$i,"prenume");
$telefon=mysql_result($rezultat,$i,"telefon");
$mobil=mysql_result($rezultat,$i,"mobil");
$fax=mysql_result($rezultat,$i,"fax");
$email=mysql_result($rezultat,$i,"email");
$web=mysql_result($rezultat,$i,"web");
Zona de cod suplimentar
++$i;
}
'Zona de cod suplimentar' marchează porțiunea din script unde vor apare comenzile de actualizare. Adică formatarea HTML pentru scoatere:
<form action="updated.php" method="post">
<input type="hidden" name="ud_id" value="<? echo "$id"; ?>">
Numele de Familie: <input type="text" value="ud_first" value="<? echo "$nume"?>"><br>
Numele de Botez: <input type="text" value="ud_last" value="<? echo "$prenume"?>"><br>
Numărul de Telefon: <input type="text" value="ud_phone" value="<? echo "$telefon"?>"><br>
Numărul de Mobil: <input type="text" value="ud_mobile" value="<? echo "$mobil"?>"><br>
Numărul de Fax: <input type="text" value="ud_fax" value="<? echo "$fax"?>"><br>
Adresa E-mail: <input type="text" value="ud_email" value="<? echo "$email"?>"><br>
Adresa Web: <input type="text" value="ud_web" value="<? echo "$web"?>"><br>
<input type="Submit" value="Update">
</form>
Așa cum se poate vedea, această secvență construiește (scoate) un formular standard, dar în locul zonelor goale, așa cum apăreau în formularul pentru introducerea datelor, de data asta avem conținutul câmpului respectiv din înregistrarea în cauză (care-i de actualizat). Asta îl face mai adaptat scopului, mai comod de folosit.
Actualizarea bazei de date
Tot ce mai avem de făcut este actualizarea efectivă a bazei de date. Asta este o operație simplă care implică o nouă cerere pentru baza de date:
$query = "UPDATE contacts SET nume = '$ud_first',prenume = '$ud_last',telefon = '$ud_phone',mobil = '$ud_mobile',fax = '$ud_fax',email = '$ud_email',web = '$ud_web' WHERE id = '$ud_id'";
Această cerere spune sistemului de gestiune de baze de date să actualizeze tabela contacts în acele linii în care ID coincide cu valoarea din $ud_id (care, așa cum se poate vedea din formularul anterior, a primit valoarea id a înregistrării pe care o actualizăm), modificând următoarele câmpuri cu valorile specificate (care au fost introduse cu ajutorul formularului).
Această cerere poate fi înglobată într-un script simplu:
$ud_id=$_POST['ud_id'];
$ud_first=$_POST['ud_first'];
$ud_last=$_POST['ud_last'];
$ud_phone=$_POST['ud_phone'];
$ud_mobile=$_POST['ud_mobile'];
$ud_fax=$_POST['ud_fax'];
$ud_email=$_POST['ud_email'];
$ud_web=$_POST['ud_web'];
$username="nume_utilizator";
$password="parola";
$database="baza_de_date";
mysql_connect(localhost,$username,$password);
$query="UPDATE contacts WHERE id='$ud_id' SET first='$ud_first' last='$ud_last' phone='$ud_phone' mobile='$ud_mobile' fax='$ud_fax' email='$ud_email' web='$ud_web'";
mysql_query($query);
echo "Actualizarea s-a făcut";
mysql_close();
Asta va actualiza baza de date transmițând și o confirmare utilizatorului.
Ultima parte a acestui capitol privește modul cum ștergem o înregistrare dim baza de date. Ca și cu pagina de actualizare, vom construi o pagină pentru a șterge una sau mai multe linii din baza de date. Trebuie să-i transmitem poziția (ID-ul) înregistrării, printr-un URL, spre exemplu:
delete.php?id=9
Scriptul care va face asta, numit delete.php, este aproape identic cu cel de actualizare a bazei de date, cu excepția comenzii MySQL (modului în care este construită cererea). In locul comenzii SQL UPDATE , vom folosi:
DELETE FROM contacts WHERE id='$id'
La acest punct este momentul să menționăm și un alt mod de folosire a ciclurilor cu o bază de date. Putem folosi un ciclu pentru a executa un șir de cereri. Spre exemplu, dacă trebuie să schimbăm – extragem toate înregistrările dintr-o bază de date în care apare ca prenume Serban pentru a realiza un Website www.serban.ro:
Partea Standard de Conectare la Baza de Date
$query=" SELECT * FROM contacts WHERE prenume='Serban'";
$rezultat=mysql_query($query);
$num=mysql_numrows($rezultat);
$i=0;
while ($i < $num) {
$id=mysql_result($rezultat,$i,"id");
$query1="UPDATE contacts SET web='http://www.serban.ro' WHERE id='$id'";
mysql_query($query);
++$i;
}
mysql_close();
Pe parcursul acestui capitol am văzut cum să folosim PHP-ul pentru a interacționa cu un sistem de baze de date MySQL (sau SQL) și cum să folosim comenzile uzuale (cele mai necesare). Am exemplificat, cu modul de realizare a unei baze de date de tip carte de adrese (ca sistem de management a contactelor). In această lecție finală, vom vedea câteva "trucuri" MySQL și vom scrie versiunea definitivă (finală) a script-ului construit pe parcursul acestui curs.
Atunci când construim un script complex folosind bazele de date, apare des secvența de conectare la baza de date. De aceea, pentru a simplifica lucrurile, se poate fie să creem un fișier cu numele de utilizator și parola sau chiar un fișier de conectare. Spre exemplu, un fișier "username/password" poate fi construit cu numele:
dbinfo.inc.php
cuprinzând în el:
<?
$username="numele_de_utilizator_al_bazei_de_date";
$password="parola";
$database="nume_baza_de_date";
?>
în care precizăm datele concrete potrivite (numele_de_utilizator_al_bazei_de_date, parola, nume_baza_de_date). Atunci în fișierele php vom folosi, chiar la început, următoarea secvență, care va include scriptul de mai sus:
include("dbinfo.inc.php");
sau, atunci când acesta se află în alt director:
include("/[traseul complet]/dbinfo.inc.php");
Atunci, vom putea folosi în continuare variabilele $username, $password și $database în script-ul nostru, fără a avea nevoie să le definim de fiecare dată. De asemeni, dacă vom modifica cândva aceste informații, spre exemplu trecând pe alt server web, tot ce va fi de schimbat va fi în acest unic fișier.
Aceeași schemă o putem folosi pentru conectarea la baza de date, plasând și comanda de conectare în fișier. Atunci va trebui, însă, să ne asigurăm de închiderea conexiunii, pentru a nu avea probleme cu serverul MySQL.
Se poate realiza și o căutare limitată în baza de date folosind funcția specială din MySQL. Adică prin folosirea funcției LIKE , în forma:
SELECT * FROM nume_tabela WHERE nume_camp LIKE '%$string%'
Asta însemnă că LIKE va spune bazei de date să folosească posibilitățile proprii de căutare. Semnele % au semnificația că orice alte date pot să apară în poziția lor și variabila $string va conține cererea de căutare. Adică putem avea acolo un cuvânt, sau un număr, spre exemplu:
LIKE '%pian%'
ceea ce va conduce la scoaterea liniilor care includ cuvântul pian în câmpul specificat.
Similar, putem renunța la unul din semnele % astfel ca să precizăm poziția șirului de caractere:
LIKE 'pian%'
Astfel vom putea selecta doar liniile în care câmpul specificat începe cu prefixul pian, caz în care, spre exemplu, expresia următoare va fi evitată:
Un pian se află pe scenă.
Interfațarea cu bazele de date folosind Java
Adaptarea la noile cerinte ale tehnologiei informatiei si comunicatiilor impune eforturi sustinute din partea proiectantilor si programatorilor de aplicatii, pentru asimilarea noutatilor si integrarea lor în produsele software rezultate.
Tehnologia Java este una de mare actualitate în dezvoltarea aplicatiilor cu baze de date de tip Internet. Aceasta, deoarece avantajele majore aduse de stocarea siprelucrarea informatiei din bazele de date sau multiplicat prin facilitatile de comunicatiesi facilitatile orientate obiect oferite de platforma Java, prin limbajele Java si Javascript,precum si prin alte numeroase interfete dez-voltate in jurul lor.
Aplicatiile cu baze de date de tip Internet îsi anunta înca din denumire natura dubla, ca urmare a coexistentei celor doua elemente (bazele de date si comunicatiile). Abordarea duala mentionata in titlu, vizeaza o prezenta-re sintetica a celor doua modalitati de dezvoltare software: aplicatii cu baze de date ce includ tehnologii Java si acces din platforma Java la bazele de date.
Utilizarea tehnologiilor Java la realizarea aplicațiilor cu baze de date
Larga utilizare a bazelor de date a necesitat implementarea unor facilitati pentru lucrul în reteaua de calculatoare globala. De aceea, sistemele de gestiune a bazelor de date, în versiunile lor din ultimii ani, permit utilizarea peste Internet a aplicatiilor realizate cu ajutorul lor.
Acest fapt este posibil si datorita încorporarii unor elemente din platforma Java în mediul de lucru specific bazelor de date. Produsele Oracle, multa vreme concentrate asupra dezvoltarii facilitatilor pentru bazele de date relationale, în ultimii ani s-au îmbo-gatit cu multe componente necesare construirii relativ usoare a unor aplicatii robuste în mediu distribuit, ca si pentru comertul elec-tronic.
Vom enumera în continuare câteva produse ale platformei Java implementate în mediul Oracle, pentru care se va regasi si o sintetica prezentare. Astfel, cea mai folosita cale de încarcare a bazelor de date, lucrul cu formulare (forme), de sub Oracle, respectiv Oracle Forms Developer, permite desfasurarea pe Web, prin descarcarea fisierelor de clase Java pe browser-ul clientilor. Aceste fisiere de clase constituie interfata cu utilizatorul pentru modulele aplicatiilor Forms Server si întretin comunicatia între server si browser-ul client.
Applet-urile sunt componente scrise în cod Java, inclus într-un fisier HTML. Ele sunt interpretate la PC-ul gazda de catre browser, gratie faptului ca acesta colaboreaza cu ma-sina virtuala Java. Acestea sunt responsabile cu descarcarea si executia fisierelor de clase Java care creeaza interfata cu utilizatorulpentru aplicatiile Oracle Forms Developer.
La momentul executiei, fisierele de clase Java sunt prelucrate fie de masina virtuala Java(JVM), inclusa în browser-ul Web, fie într-un modul Applet Viewer. Java RuntimeEnvironment (JRE) este o combinatie între JVM si fisierele suport. Oracle JInitiator ofera o alternativa la browser-ul standard JRE, prin îmbunatatirea desfasurarii pe Web a aplicatiilor Oracle Forms. El este oferit sub forma unei adaugiri (plug-in) la Netscape, Internet Explorer.
Servlet-urile denumesc clase (module script) Java, necesare construirii unor pagini Web dinamice, încarcate si mentinute rezidente pe server. Avantajele aduse de aceasta tehnologie constau în faptul ca serverele Web pot sa se conecteze si sa prelucreze informatia în mod dinamic, sa ruleze aplicatii Web si nu doar sa transfere documente statice. Solutia mentine executabilul persistent pe server, între cererile clientilor, eliminând dezavantajele programarii Common Gateway Interface (CGI), unde fiecare cerere a clientului lanseaza un nou proces pe server. Se recomanda utilizarea acestei tehnologii pentru aplicatiile care acceseaza baze de date (serverul realizeaza accesul la date, clientii doar formuleaza cererile de regasire).
Java Bean-urile sunt programe Java independente de platforma, portabile si reutilizabile. Ele ajuta la modificarea aparitiei si comportamentului interfetei cu utilizatorul, prin includerea în aplicatiile create cu Oracle Form Builder. Pentru a include asemenea elemente într-un formular este necesar ca în cadrul sau sa fi fost definite obiecte de tip Bean Area, care permit gazduirea de componente Java Bean în aplicatiile desfasurate pe Web.
În paleta de proprietati a obiectelor Bean Area se gaseste una (Bean Area ImplementationClass) a carei introducere este obligatorie si care va contine numele fisierului cu clasa Java importanta pentru economia aplicatiei.
Întrucât Java este un limbaj case-sensitive, numele fisierului de clase va fi specificat exact, inclusiv calea completa. Dupa specificarea proprietatii Implementation Class, modulul Java Bean va fi vizibil în Bean Area. Acesta initiaza comunicatia cu formularul prin declansarea unui eveniment client (Custom Event), care trimite un nume de eveniment si numele unei liste de parametri continând datele asociate la modulul formular.
Aceasta informatie se obtine cu ajutorul a doua variabile de sistem: una defineste numele evenimentului tratat în Java Bean, cealalta numele listei de parametri care contin datele evenimentului asociat. Ori de cate ori Java Bean comunica cu formularul, se lanseaza un declansator (When-Custom-Item-Event) care trebuie atasat la Bean Area. Prin examinarea variabilelor de sistem în cadrul trigger-ului se poate identifica ce eveniment s-a produs si se poate aplica actiunea corespunzatoare.
De la versiunea Oracle 8i de baza de date, aceasta contine clase si proceduri stocate Java alaturi de cele PL/SQL. De asemenea, permite si dezvoltarea de Enterprise JavaBean (EJB) care, spre deosebire de Java Bean-uri, nu rezolva functii de interfata cu utilizatorul, ci încapsuleaza si distribuie logica Java între mai multe servere, în scopul de a gestiona datele, securitatea tranzactiilor si resurselor.
BC4J (Business Component 4 Java) este un cadru general al aplicatiilor, pentru generarea de logica a afacerilor reutilizabila. Pot fi încapsulate reguli de afaceri în biblioteci de componente Java care se pot reutiliza prin generarea de viziuni bazate pe SQL. De exemplu, cu obiectele Oracle 8i XML se pot construi aplicatii de comert electronic bazate pe mesaje, care implementeaza reguli de afaceri specifice.
Dezvoltarea de proceduri stocate Java, EJB siBC4J poate fi realizata comod cu Oracle JDeveloper, dar sunt necesare cunostinte de programare în Java. Odata cu cresterea utili-zarii Java în industria IT a crescut si numarul de puncte de integrare cu Java pentru tot mai multe aplicatii. Astfel si numarul de biblioteci standard pentru aplicatiile de întreprindere este în dezvoltare.
De la versiunea 2 a lui Oracle Forms 6i a aparut o noua caracteristica, Java Importer, care face mai usoara invocarea logicii aface-rii, scrisa in Java, din aplicatia Forms. Prin aceasta componenta pot fi generate automat pachete si proceduri PL/SQL care permitcrearea si utilizarea obiectelor Java direct în aplicatia Forms, prin intermediul celor trei elemente ale sale:
generatorul (creeaza pa-chetele PL/SQL pentru accesul la clasa speci-ficata)
pachetul ORA_JAVA (furnizeaza un set de functii pentru asistarea lucrului cu pa-chetele selectate)
puntea JavaNativeInterface, care gestioneaza interactiunea cu clasele Java la momentul executiei.
Accesul din platforma Java la bazele de date
Daca în cele de mai sus am prezentat modalitati de desfasurare a aplicatiei cu baze de date pe Internet, sa ne oprim putin si asupra acce-sului de sub platforma Java la bazele de date.
Enterprise Java Bean (EJB) sunt compo-nente de nivel mediu care încapsuleaza pro-cesele de afaceri si ofera servicii la distanta clientilor. Modulele EJB pot fi de tip:
session, orientate pe sarcini (în variantastateless proceseaza o singura cerere, iar în varianta stateful mentine starile);
message driven, mapeaza mesaje, fara sa existe stare;
entity, module mapate pe tabelele bazelor de date, care reprezinta informatii din orice tip de sursa de date si asigura persistenta da-telor cu mecanismele Customer ManagedPersistance (CMP) si Bean ManagedPersistence (BMP).
Dintre avantajele aduse de EJB, promotorii IDE JDeveloper amintesc:
arhitectura de des-fasurare standard
persistenta
gestionarea tranzactiilor (facilitati de Commit/Rollback)
administrarea mai buna a conexiunilor cu un mecanism Connection Pooling, prin care conexiunea este dezactivata la încheierea task-ului pentru care a fost definita.
Java Database Connectivity (JDBC) este un produs tip API Java pentru accesul la orice tip de tabela, asigurând patrunderea aplicatiei Java la orice sursa de date, independent de baza de date, cu conditia sa fie disponibile drivere JDBC corespunzatoare, care sa îndeplineasca urmatoarele functii:
stabilirea conexiunii la baza de date;
transmiterea interogarilor SQL si a instructiunilor de actualizare la sursa de date;
posibilitatea procesarii rezultatelor.
Tehnologia JDBC este realizata prin utilizarea unei biblioteci de clase (java.sql) care permite executarea unei cereri de tip SQL pentru baze de date relationale, din aplicatii scrise în Java. Avantajul utilizarii acestui pachet este ca aplicatiile Java sunt aceleasi, indiferent de baza de date. În acest fel applet-urile pot sa interogheze bazele de date indiferent de tipul lor.
Cele mai importante clase in biblioteca java.sql sunt:
DriverManager, folosita pentru a facilita utilizarea mai multor drivere de baze de date într-o singura aplicatie, fiecare dintre drivere putând fi utilizat pentru conectarea la o sursa diferita de date;
Connection, obiect care specifica cu ce baza de date se face comunicatia;
Statement, o instructiune SQL aplicata bazei de date.
JavaScript este o componenta din setul de instrumente al programatorilor Web. Fiind un limbaj, depinde pentru executie de browser. JavaScript ofera capacitatea de a face ca paginile statice sa devina interactive si maiprompte fata de actiunile utilizatorilor si de intrarile acestora, prin înglobarea unui scriptîn structura HTML existenta.
Tehnologia cuprinde obiecte specifice bazelor de date, cum ar fi:
Database, încapsuleaza toata functionalitatea asociata interactiunii cu o baza de date relationala. Câteva dintre cele mai importante metode care caracterizeaza acest obiect sunt:
beginTranzaction()
endTranzaction()
commitTranzaction()
connect()
cursor()
disconnect()
rollbackTranzaction();
DbPool, reprezinta conexiuni la baza de date;
Connection, refera o conexiune data, atunci când este extrasa dintr-un ansamblu de conexiuni;
ResultSet, stocheaza rezultatul rularii unei proceduri stocate;
Cursor, creat prin apelarea metodelorconnection.cursor sau database.cursor
BLOB, asigura suport pentru lucrul cu obi-ecte binare mari.
Java Server Pages (JSP) este o interfata pentru construirea aspectelor estetice ale pa-ginilor Web (amplasare, aspect), mai putin utila ca sursa si manipulare a datelor dinamice. Dintre caracteristicile sale mentionam:
poate functiona pe o multitudine de servere;
separa logica aplicatiei (în ODBC, JavaBean s.a) de prezentarea acesteia (în JSP);
permite reutilizarea unor componente gene-rate cu alte tehnologii (JavaBean) atât independent, cât si în cadrul unor interfete de dezvoltare a paginilor Web;
este independenta de platforma pe care ruleaza (script-urile fiind bazate pe Java);
se poate utiliza în aplicatii multinivel;
Executia unei pagini JSP este realizata de motorul JSP instalat pe un server de Web, care proceseaza pagina JSP (o pagina HTML cu elemente aditionale) si returneaza o pagi-na HTML/XML.
Java Data Objects (JDO) este un produs API pentru accesul transparent la bazele de date. Programatorul poate scrie cod Java care acceseaza transparent datele, fara sa scrie cod specific SGBD-urilor. Aceasta este o tehnologie complementara celei JDBC. Punctul sau forte este ca standardizeaza obiectele bazei de date si maparile obiectual-relationale pentru limbajul de programare Java, permitând programatorului sa foloseasca clase din limbajul Java în loc sa copieze date aparti-nând diferitor modele de date.
JDO si JDBC sunt abordari complementare. Ambele tehnologii au propriile puncte forte si pot fi utilizate de programatori cu diferite aptitudini. JDO îi permite programatorului sa acceseze baze de date fara a avea cunostinte de SQL.
Soluția software propusă
Aplicația “MySQL Services” își propune să fie o interfață web de administrare a bazelor de date MySQL care depășește granițele de funcționalitate de care uzează deja o varietate de aplicații de administrare pentru toate tipurile de baze de date.
Caracteristica principală și, în aceeași măsură, elementul de noutate adus de această lucrare, este designul aplicației orientat pe principiul BPM, parte integrantă a soluțiilor EAI. Prin arhitectura modulară prezentată în capitolele următoare aplicația se profilează spre implementarea tuturor pașilor procesului de Business Process Management.
Fig. 1 Ciclul de viață în BPM
Această aplicație se conformează tendințelor generale de abstractizare și integrare a aplicațiilor ( soluții Enterprise Application Integration ).
La acest moment obiectivul „MySQL Services” este de a impementa module pentru etapele de Design, Optimizare și Monitorizare ale ciclului de viață BPM pentru soluții bazate pe utlizarea bazelor de date.
Soluții de Business Process Management
Sistemele informatice actuale si aplicatiile integrate la nivelul companiilor se caracterizeaza astazi printr-un nivel tot mai ridicat de eterogenitate. Aplicatii “mostenite” bazate pe tehnologii uzate moral; module si programe care automatizeaza activitatea unor anumite departamente, dar care nu dispun de functii pentru integrarea cu alte solutii din companie; aplicatii disponibile pe sisteme mainframe fara posibilitatea de comunicare cu alte aplicatii – iata numai câteva exemple in care este necesara integrarea diverselor sisteme existente la nivelul firmei.
Solutiile din categoria Business Process Management (BPM) permit integrarea tuturor acestor sisteme extrem de diverse, asigurând in plus functii avansate pentru modelarea si automatizarea fluxurilor de business la nivelul companiei. Solutiile BPM dispun de instrumente vizuale care simplifica substantial modalitatea in care sunt definite si integrate procese de afaceri complexe care presupun accesul la surse de date variate si interoperabilitatea unui numar mare de aplicatii. Prin solutiile de tip BPM procesele de afaceri vor putea fi modelate direct de catre analistii financiari si economici, fara a fi solicitat suportul departamentelor IT.
Aplicatiile incluse in categoria BPM asigura o integrare deplina intre business si IT, cerintele afacerii fiind adaptate mai simplu la schimbarile mediului de business actual. Tinând cont de faptul ca mediul de afaceri actual se caracterizeaza printr-un dinamism tot mai accentuat, utilizarea unei solutii de tip BPM poate asigura un plus de consistenta si posibilitati de aliniere rapida la schimbarile produse.
Elementele de baza ale solutiilor BPM
Integrarea aplicatiilor prin solutiile de tip BPM se bazeaza pe tehnologiile si standardele fundamentale web services si XML. Serviciile Web sunt o modalitate standardizata de distributie a aplicatiilor care foloseste Internetul si tehnologii fundamentale ce stau la baza acestei retele. De asemenea, serviciile Web ofera posibilitatea de interconectare a unei palete vaste de aplicatii disponibile pe diferite platforme si in diverse locatii de pe glob. In acest mod, se poate spune ca serviciile Web s-au constituit intr-un esperando al comunicatiei intre aplicatii, noua tehnologie deschizând larg poarta spre o noua era a informaticii dominata de aplicatii cu un grad de inteligenta ridicat, capabile in luarea deciziilor si in cautarea informatiei pe Internet ca suport pentru hotarâri cât mai judicioase.
XML sau eXtended Markup Language constituie baza tuturor elementelor care sunt ratiunea tehnologiei Web Services. Având in vedere independenta de platforma, XML constituie motorul care face posibil transferul datelor prin intermediul Internetului, constituind totodata fundamentul serviciilor Web.
XML este un fel de plic sau, daca doriti, un container in care informatia din bazele de date este incapsulata si distribuita prin intermediul Internet-ului, având totodata garantia ca datele stocate in aceste fisiere vor fi accesibile pentru orice dispozitiv si pe orice platforma. In trecut, atunci când trebuiau transferate date intre diverse platforme se foloseau simple fisiere text in care datele erau separate prin virgula sau alte caractere speciale, insa odata cu aparitia limbajului XML, aceasta modalitate arhaica de transfer al datelor devine caduca. XML raportat cu celelalte mijloace de transfer al datelor prezinta avantajul simplitatii, structurarii eficiente a informatiei, precum si al portabilitatii informatiei pe orice platforma sau dispozitiv.
Business Process Execution Language (BPEL) este un standard bazat pe XML si web services, care permite modelarea fluxurilor de afaceri si automatizarea acestora. Folosind acest limbaj, fluxurile de afaceri si regulile de business pot fi definite intr-un mod intuitiv, fiind asigurat un nivel ridicat de transparenta in realizarea acestor operatiuni. Tehnologia BPEL simplifica modul de integrare a diverselor aplicatii si procese de afaceri.
Integrarea cu partenerii de afaceri
Tinând cont de faptul ca BPM se bazeaza pe standarde si tehnologii fundamentale care stau la baza Internetului, ele vor putea fi folosite atât pentru automatizarea proceselor interne din cadrul firmei, cât si pentru derularea fluxurilor cu partenerii de afaceri. In acest sens, solutiile de acest tip ofera o flexibilitate deosebita in integrarea si automatizarea unor procese de afaceri care prezinta un nivel ridicat de complexitate si la care participa mai multe companii.
Fluxurile financiare si de afaceri derulate in domeniul financiar-bancar sunt foarte complexe, fiind implicat un numar mare de institutii in derularea acestora. In acest sens, solutiile de tip BPM si de interoperabilitate bazate pe servicii sunt tot mai raspândite in acest domeniu, asigurând derularea mai eficienta a proceselor de afaceri.
Pas cu pas – Implementarea solutiilor de tip BPM
Pentru implementarea solutiilor BPM si integrarea acestora in cadrul infrastructurii IT a companiei este indicat sa parcurgeti urmatoarele etape fundamentale:
1. Analiza informationala – identificati procesele de business si stabiliti corelatiile intre acestea.
2. Analiza de cost – analiza costurilor de proiectare, implementare si mentenanta pentru diverse solutii existente pe piata.
3. Constructia modelelor – folosind instrumentele vizuale incluse in cadrul aplicatiilor de tip BPM modelati procesele de afaceri pentru integrarea lor cu sistemele informatice din cadrul firmei. Modelarea se poate realiza folosind instrumente bazate pe tehnologia UML (Unified Modeling Language) sau BPEL (Business Process Execution Language).
4. Implementarea solutiei – generarea componentelor pe baza modelelor, prin intermediul lor fiind asigurata integrarea propriu-zisa intre diverse aplicatii.
5. Testarea si optimizarea solutiei – aceasta ultima etapa presupune testarea modului in care se deruleaza procesele de afaceri, indreptarea unor erori de programare sau modelare, precum si optimizarea acestor procese.
Ce companii pot apela la solutiile de tip BPM?
Solutiile de tip BPM sunt adresate cu precadere companiilor mari care prezinta un nivel relativ ridicat de complexitate al proceselor de afaceri. De asemenea, este indicata folosirea unor astfel de solutii in companii care prezinta o arhitectura IT&C cu un nivel de eterogenitate ridicat.
Astfel, sunt disponibile sisteme informatice si aplicatii dedicate unor departamente din companie, dar care nu dispun de functii care asigura integrarea cu alte sisteme folosite in cadrul firmei.
In plus, companiile care deruleaza procese de afaceri cu un numar mare de parteneri este necesar sa apeleze la solutii care se incadreaza in aceasta categorie.
Ce solutii de tip BPM pot fi integrate in cadrul companiilor?
Cu toate ca domeniul BPM este relativ nou, exista deja o paleta destul de variata solutii care se inscriu in aceasta categorie. Prin acest articol ne vom focaliza asupra platformelor BPM si a solutiilor oferite de principalii “jucatori” pe piata IT&C.
Microsoft propune BizTalk Server 2004, un server BPM performant de integrare care asigura interoperabilitatea si simplifica procesele de modelare a aplicatiilor. Interconexiunile dintre aplicatii sunt asigurate prin intermediul elementelor de tip adaptor, acestea permitând implementarea unui mecanism sau a unui protocol de comunicare. Modelarea si definirea proceselor de business poate fi realizata direct prin posibilitatile oferite de Visual Studio .NET, fiind insa oferite instrumente grafice care simplifica aceasta operatiune.
IBM propune solutiile WebSphere Business Integration care ofera suportul pentru Business Process Execution Language for Web Services (BPEL4WS), fiind foarte flexibil in constructia regulilor de business care cârmuiesc procesele de afaceri. Sunt disponibile mai multe instrumente vizuale care incorporeaza interfete intuitive si functionalitati de drag&drop, fiind posibila astfel modelarea simpla a fluxurilor informationale si a proceselor de afaceri. De asemenea, WebSphere Business Integration Adapters ajuta clientii sa integreze simplu procesele de business si sa realizeze eficient schimburi de informatii intre diverse aplicatii care alcatuiesc arhitectura informatica a companiei (solutii ERP, HR, CRM, SCM etc.).
Computer Associates (distribuit in România prin DNA) dispune de solutiile CleverPath Aion Business Process Manager si CleverPath Aion Business Rules Expert, care asigura un nivel ridicat de integrare a proceselor de afaceri din cadrul companiilor.
Oracle Integration este o platforma eficienta care asigura integrarea eficienta la nivelul firmei si colaborarea B2B. Oracle BPEL Process Manager asigura modelarea si integrarea proceselor de afaceri, simplificând operatiunile de implementare a unor solutii de acest tip.
Solutiile de tip BPM ajuta companiile sa-si modeleze si integreze mai eficient fluxurile de afaceri, simplificând procesul de integrare cu partenerii de afaceri. Folosind solutiile din aceasta categorie companiile se pot alinia mai rapid la schimbarile produse in mediul de afaceri, contribuind la cresterea eficientei in derularea proceselor de afaceri.
Tehnologii Web aplicabile
Ce este PHP ?
PHP este un limbaj de programare ce rulează pe web server, proiectat special pentru WEB. Intr-o pagină HTML puteți îngloba cod PHP care va fi executat la fiecare vizitare a paginii.
Codul PHP este interpretat pe serverul WEB și generează un cod HTML care va fi văzut de utilizator (clientului browserului) fiindu-i transmis numai cod interpretat ca și HTML).
PHP a fost conceput în anul 1994 și a fost initial munca unui singur om, Rasmus Lerdorf.
A fost adoptat apoi și de alți oameni talentați și a trecut prin trei rescrieri importante pentru a ajunge la produsul clar și matur de astăzi. În octombrie 2002, era în uz de mai mult de nouă milioane de domenii din lumea întreagă, iar acest număr este într-o continuă creștere. Numărul actual al acestora îl puteți vedea la adresa http://www.php.net/usage.php
PHP este un produs Open Source, cu acces la codul sursă. Il puteți folosi, modifica și redistribui, toate acestea în mod gratuit. Inițial, PHP era acronimul de la Personal Home Page, dar a fost modificat pentru a se alinia la conversia de numire recursivă GNU (GNU = Gnu`s Not Unix) și acum este acronimul pentru PHP Hypertext Preprocessor.
Pagina de bază pentru PHP este: http://www.php.net
Pagina pentru Zend (compania ai cărei fondatori au proiectat PHP4) se află la http://www.zend.com
Ce este MySQL ?
MySQL este un sistem de gestiune a bazelor de date, foarte rapid și robust; o bază de date care vă permite să stocați, să cautați, să sortați și să vă regăsiți datele în mod eficient.
Serverul MySQL controlează accesul la datele dumneavoastră pentru a garanta că mai mulți utilizatori pot lucra simultan cu acestea. Deci, MySQL este un server multi-user (mai mulți utilizatori) și multi-thread (mai multe fire de execuție). Utilizeaza SQL (Structured Query Language), limbajul standard de interogare a bazelor de date din întreaga lume.
MySQL este disponibil în mod public din 1996, dar istoria dezvoltarii sale incepe in 1979. A câștigat de mai multe ori Linux Journal Readers` Choice Award (Premiul cititorilor).
MySQL este disponibil sub o licență Open Source, dar dacă este nevoie sunt disponibile și licențe comerciale.
Ce este AJAX ?
Ajax este prescurtarea de la “Asynchronous JavaScript and XML”. Termenul a fost introdus de către Jesse James Garrett în februarie 2005. Nucleul său îl reprezintă obiectul XMLHttpRequest care este folosit pentru a schimba date asincron cu serverul web; nu este o tehnologie, ci termenul se referă la un grup de tehnologii.
Ajax depinde de JavaScript pentru functionare, iar JavaScript este deseori implementat in moduri diferite pe diferite browsere. Din aceasta cauza siturile care folosesc JavaScript trebuie testate in mai multe browsere pentru a verifica sa nu apara probleme de compatibilitate. Sunt multe cazuri in care codul JavaScript trebuie scris de doua ori, o versiune pentru IE, de exemplu, si alta pentru Mozilla.
Astfel de cazuri insa sunt mai rare odata cu aparitia de librarii de abstractizare a JavaScript precum Prototype JavaScript Framework sau Jquery. Aceste librarii abstractizeaza limbajul rezolvand transparent problemele de compatibilitate intre diferite browsere.
Avantaje ale folosirii Ajax:
în primul rând elimină refresh-ul paginii web, ceea ce face ca aplicația web să semene cu una desktop și astfel duce la o îmbunătățire a interefeței utilizator
îmbunătățire a lungimii de bandă
o separare a datelor, funcționalității și a formatări paginii
Dezavantaje
nu rulează pe versiuni vechi ale browserelor
lipsa funcționalității a butoanelor de back și forward (deși mai nou sau găsit work – around uri)
la timpi de răspuns foarte mari utilizatorul are impresia că cererea lui nu este procesată (acest lucru poate fi evitat introducând un preloader)
unele dezavantaje în privința SEO
nu rulează dacă Javascript-ul este oprit de către utilizator (sau browser-ul nu cunoaște limbajul javascript, cum sunt browserele text only)
Un “Hello World” al Ajax-ului
De obicei acest lucru este realizat printr-o aplicație care adună două numere. Adunarea va fi realizată de către un script php care va fi “chemat de către Ajax”
hello.html
Pagina are două input-uri care au asignate două id-uri nr1 respectiv nr2 și un buton de submit care atunci când este apasat se execută funcția calculeaza definita în fișierul ajax.js inclus în head-ul paginii.
Cod:
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=“http://www.w3.org/1999/xhtml”>
<head>
<title>Hello World Ajax</title>
<script type=“text/javascript” src=“js/ajax.js”></script>
</head>
<body>
Nr 1 = <input type=“text” id=“nr1″ />
Nr 2 = <input type=“text” id=“nr2″ />
<br />
<input type=“submit” value=“Calculeaza” onclick=“javascript:calculeaza();” />
<div id=“rezultat” />
</body>
</html>
ajax.js
În acest fișier se creează obiectul XMLHttpRequest care este “inima” Ajax-ului și funcțiile care lucrează cu acesta
Cod:
var xmlHttp = creazaXmlHttp();
/*
Returneaza obiectul XMLHttpRequest creat
*/
function creazaXmlHttp()
{
var xmlHttp;
// pentru IE
if(window.ActiveXObject)
{
try
{
xmlHttp = new ActiveXObject(“Microsoft.XMLHTTP”);
}
catch (e)
{
xmlHttp = false;
}
}
//Pt Mozilla sau alte browsere
else
{
try
{
xmlHttp = new XMLHttpRequest();
}
catch (e)
{
xmlHttp = false;
}
}
if (!
xmlHttp)
alert(“Nu s a putut crea obiectul XMLHttpRequest .”);
else
return xmlHttp;
}
/*
Acesta functie preia numerele introduse in input-uri si le trimite php-ului pentru calculare
*/
function calculeaza()
{
// verificam daca xmlHttp este liber
if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0)
{
//obtinem cele doua valori ale numerelor
var nr1 = document.getElementById(‘nr1′).value;
var nr2 = document.getElementById(‘nr2′).value;
// executam script-ul php de adunare trimitand cele doua numere ca paramentri prin get
xmlHttp.open(“GET”, “php/calculeaza.php?nr1=” + nr1+“&nr2=”+nr2, true);
//definim functia care se va ocupa de manipularea rezultatului primit de la script-ul php
xmlHttp.onreadystatechange = gestioneazaRezultat;
// trimitem cererea catre server
xmlHttp.send(null);
}
}
/*
Acesta este functia de ”callback” care primeste rezultatul de la php
*/
function gestioneazaRezultat()
{
// daca rezultatul este obtinut
if (xmlHttp.readyState == 4)
{
// status = 200 arata faptul ca cerea a fost rezoltata cu success
if (xmlHttp.status == 200)
{
// extragem rezultatul
raspuns = xmlHttp.responseText;
//modificam div-ul rezultat cu rezultatul
document.getElementById(“rezultat”).innerHTML = ‘<b> Suma =’ + raspuns + ‘</b>’;
}
// daca statusul este diferit avem o problema
else
{
alert(“Problema la accesare: ” +xmlHttp.statusText);
}
}
}
calculeaza.php
În acest script pur și simplu se adună ceea ce se primește prin get și este trimis spre procesare
Cod:
<?php
echo $_GET[‘nr1′]+$_GET[‘nr2′];
?>
Adobe FLEX
Adobe Flex este o colectie de tehnologii pentru dezvoltarea de aplicatii web folosind platforma Adobe Flash.
Flex SDK contine un set de componente de baza ale unei interfete grafice, cum ar fi butoane, listbox, arbori, etc. De asemenea Flex reuneste si alte functionalitati cum ar fi web services, drag&drop, efecte de animatie, validare de form-uri.
Un avantaj al aplicatiilor Flex este ca acestea nu necesita reincarcarea paginii la modificarea acesteia. Tehnologii comparabile cu Flex sunt OpenLaszlo, Ajax, XUL, JavaFX si tehnologii Windows Presentation Foundation, precum Silverlight.
Flex 2 SDK contine compilatoare in linie de comanda de MXML si XML si intreaga librarie de obiecte ce ofera functiile interfetei grafice si utilitati pentru acestea. Acest SDK este disponibil FREE si poate fi folosit fara restrictii ca orice pachet open source.
Odata cu aparitia Flex 2, Adobe a lansat si o noua versiune de ActionScript, anume Actionscript 3, dupa ultimele specificatii ECMAScript. Folosirea ActionScript 3 impreuna cu Flex 2 necesita cel putin versiunea 9 de Flash Player runtime. Flash Player 9 incorporeaza o noua masina virtuala, mai robusta, pentru a gazdui rularea ActionScript 3. Adobe Flex 3 este la acest moment in dezvoltare.
LiveCycle Data Services (numit anterior Flex Data Services) este un complement al functionalitatii server side a pachetului Flex SDK si face parte dintr-o familie de produse server based dezvoltate de Adobe. Acesta este o aplicatie Java EE ce adauga urmatoarele functionalitati pachetului Flex:
Remoting – permite aplicatiilor client Flex sa invoce metode Java server objects in mod direct – similar ca functionalitate cu Java RMI (remote method invocation). Exista si o varianta open source de remoting folsoind PHP (AMFPHP).
Messaging – permite unei aplicatii client Flash sa publice evenimente pe un topic definit pe server si sa fie informat de evenimentele trimise de messaging service. Una din utilizarile cele mai frecvente ale acestui flux de date in real-time este obtinerea de informatii financiare sau de system status.
Data management services – ofera un model programatic de management al dataset-urilor downloadate de clientul de Flex. Dupa downloadul de pe server, se reproduc automat schimbarile la cererea aplicatiei. Clientii sunt notificati de fiecare data cand apar modificari pe server.
PDF document generation – pune la dispozitie un API pentru scrierea de documente PDF prin folosirea datelor date de client pe un template stocat pe server.
Flex 2 ofera si suport pentru ColdFusion MX 7 pentru crearea de form-uri. Acest framework poate fi folosit pentru a scrie aplicatii web desi scopul ColdFusion este doar de a crea form-uri.
In concluzie Adobe Flex poate fi folosit pentru:
Definirea unei interfete folosind un set predefinti de componente (forms, butoane, etc)
Aranjarea componentelor in interfata grafica
Folosirea de styles si themes pentru a defini un design
Folosirea unui comportament dinamic al interfetei (de exemplu, o parte din aplicatie interactioneaza cu o alta)
Conectarea la data services.
Compilarea codului sursa intr-o aplicatie SWF ce ruleaza in Flash Player
Ajax vs. Adobe FLEX
Ajax si Adobe Flex sunt tehnologii web pentru crearea de Rich Internet Applications. Pot fi folosite separat sau in combinatie cu alte tehnologii.
Adobe Flex este un produs singular al Adobe in timp ce Ajax este o colectie de tehnici folosite in aplicatii webcare nu sunt specifice unei organizatii.
Cu Ajax avem urmatoarele optiuni posibile de utilizare:
Custom Ajax (dezvoltare de la zero)
Open Source Frameworks (dojo toolkit, yui, prototype)
Commercial Frameworks (backbase, spry)
Ajax si Flex pot fi folosite si impreuna. Exista doua tooluri ce faciliteaza interoperabilitatea: Flex Ajax Bridge si Ajax Data Services.
Din punct de vedere al runtime-ului, Adobe Flex se bazeaza pe Flash 9 browser plug-in, pe care browserul site-ului trebuie sa il aiba instalat. Ajax foloseste ca runtime environment o varietate larga de browsere.
Unele Framework-uri Ajax au un motor JavaScript ce abstractizeaza functionalitatea incat sa elimine problemele legate de diferentele dintre browsere: developer-ii folosesc Engine-ul pt dezvoltarea de aplicatii, iar acesta la randul sau dialogheaza cu browserul, facand astfel diferentele total transparente.
Beneficiile folosirii unui environment de runtime propriu, precum Flash 9 este controlul detinut asupra acestuia, ceea ce face ca acesta sa fie unic independent de browser. Acest lucru face dezvoltarea mult mai usoara si permite adaugarea de imbunatatiri si modificari. Dezavantajul este ca acest plug-in trebuie instalat separat, ceea ce poate fi o problema pentru masini cu drepturi limitatea asupra sistemului de operare.
O critica frecventa a Flash Player este ca nu respecta standardele web, intrucat serverul este folosit doar pentru lansarea unei aplicatii separate, si astfel nemaifolosind niciun fel de standard precum HTML, CSS, JavaScript. Flash ofera totusi suport pentru HTML, CSS si o versiune extinsa de JavaScript (ECMAScript).
Beneficiile folosirii Ajax sunt ca acesta ruleaza fara probleme in majoritatea browserelor web, fara a necesita nicio instalare suplimentara de plug-in-uri. Dezavantajul acestei abordari este ca sunt diferente majore intre diferitele implementari in browsere web ale DOM, JavaScript si CSS, ceea ce poate rezulta in aplicatii Ajax ce functioneaza doar pe anumite browsere.
Modalitatea in care este atacata aceasta problema in Framework-urile Ajax este prin punerea la dispozitie a unui layer de compatibilizare. Alt dezavantaj la Ajax este ca necesita ca JavaScript sa fie enabled in browser.
Performanta unei RIA poate fi masurata prin mai multi indicatori, precum dimensiunea download-ului initial, viteza de functionare a runtime-ului, si veiteza de manipulare a datelor.
Aplicatiile Flex necesita un download initial de minim 125 kb, ce poate dura prea mult pe o conexiune dialup. Programele Ajax pot fi foarte mici ca dimensiune, desi majoritatea framework-urilor impun o dimensiune initiala a download-ului ce poate lua valori in ordinul kilobytes pana la megabytes. Aplicatiile Flex sunt comprimate automat pe cand pentru Ajax este necesar a se folosi un utilitar de arhivare pe server (de obicei GZip).
Performanta aplicatiilor Ajax este in directa legatura cu performanta browser-ului, ce poate varia de la un browser la altul. Adobe optimizeaza Flash Runtime pentru performanta ridicata, avand astfel mai mult control asupra perfomantei aplicatiilor.
Unul dintre beneficiile aduse este posibilitatea Flex de a lucra cu dataset-uri mari pe masina client, in timp ce Ajax are nevoie de optimizari ale codului, in special pentru Internet Explorer. In urma unor optimizari atente ale codului insa, cele mai bune framework-uri Ajax pot lucra cu volume de date mai mari pe client-side decat altele.
Din punct de vedere al Securitatii, si Flex si Ajax folosesc browserul, si sunt in general la fel de eficiente din acest punct de vedere, desi plug-in-ul de Flash poate introduce riscuri suplimentare. Cea mai mare parte a codului Ajax este text clar si astfel este si usor de citit: acest lucru faciliteaza gasirea vulnerabilitatilor de catre potentiali hackeri.
In concluzie, Adobe a incercat sa faca din Flex un tool cat se poate de user friendly. Totusi exista multe critici ale acestei abordari ce blameaza problemele inerente de utilizabilitate ale vizitatorilor ce sunt obijnuiti cu folosirea paginilor web ca interfete pentru aplicatii web.
Iata alte critici aduse solutiei Flash din punctul de vedere al utilizabilitatii:
aplicatiile Flash au un look & feel diferit: cursorul arata diferit, fonturile sunt diferite, linkurile si right-click-urile nu functioneaza conform asteptarilor.
Copy & paste nu functioneaza
butonul Back nu functioneaza mereu precum ne-am astepta
Adeptii Flex spun ca totusi multe din aceste probleme pot fi rezolvate printr-un design adecvat al aplicatiilor.
Atat Flex cat si Ajax ofera suport pentru variate standarde web. Ajax foloseste un runtime bazat pe aceste standarde (browserul) Flex foloseste un runtime proprietar Adobe care ofera suport partial sau total pentru variate standarde web.
Marea diferenta este ca orice standard care devine folosit intr-un web browser este imediat disponibil unei aplicatii Ajax, in timp ce Adobe trebuie ulterior sa implementeze aceste standarde in Flash runtime.
Descrierea funcționalității proiectului
Obiectivul proiectului
Aplicația „MySQL Services”, care face obiectul acestei lucrări, își propune ca obiectiv să permită administrarea bazelor de date MySQL prin intermediul unei interfețe web ergonomice și multifuncționale.
În acest sens, aplicația va fi capabilă, prin intermediul modulului phpMyAdmin, să opereze asupra bazelor de date modificări asupra structurii și conținutului informațional cît și asupra configurației serverului de baze de date.
În plus față de această categorie de funcționalități, aplicația își propune să ofere suport pentru designul bazelor de date prin intermediul modulului Design. În acest modul se pot proiecta baze de date la nivel de crearea acestora, popularea lor cu tabele precum și popularea tabelelor cu date. Acest modul face din aplicația de față o unealtă de modelare și design al bazelor de date.
În ultimă instanță, „MySQL Services” permite utilizatorului monitorizarea activității și a configurațiilor mașinilor fizice (computer, laptop, server), serverelor de baze de date, precum și a bazelor de date în sine într-o relaționare ierarhică. Prin acest modul intitulat „Monitoring”, aplicația face un pas evolutiv în contextul preocupărilor curente în domeniul interfețelor web pentru baze de date, punînd la dispoziția utilizatorului un mijloc de monitorizare a activității întregului său proces de business ce depinde sau relaționează cu baze de date.
Ca și obiectiv suplimentar, modulul Design ar putea, pe baza design-ului creat de utilizator, să genereze cod SQL pentru crearea bazei de date proiectate.
Prin toate aceste caracteristici lucrarea de față propune o aplicație care să se apropie de un concept încă neexplorat pe aria gestionării și administrării bazelor de date, și anume conceptul de soluție integrată.
În contextul soluțiilor integrate EAI (Enterprise Application Integration), „MySQL Services” se încadrează în categoria aplicațiilor de BPM (Business Process Management) al căror proces îl implementează în întregime ca și arhitectură, și parțial ca și implementare.
Interfața web
Interfața pusă la dispoziție utilizatorului este o interfață web ergonomică și facil de utilizat. Liniile de bază au fost trase ținînd cont de cele trei module pricipale care alcătuiesc aplicația și de nevoia de a avea o planșă de design pe care utilizatorul să o poată folosi în mod cît mai eficace.
Fig. 2 Interfața web – Pagina Home
Pagina principală a aplicației (Fig.2) prezintă pagina principală în viziunea implementării unei suprafețe de lucru ergonomice și spațioase. Întreaga zonă mediană este rezervată pentru spațiu de lucru iar elementele principale sunt clar delimitate și punctate prin prezența celor trei butoane ce dau acces la modulele de bază.
Fiecare modul în parte dispune de spațiul median într-un mod diferit încercînd să creeze un spațiu de lucru atractic și eficient pentru activitățile ce sunt menite a se desfășura în fiecare dintre ele.
Fig. 3 Interfața web – Pagina de Design
Modulul Design prezintă o planșă de lucru exinsă pe întreaga zonă mediană ce pune la dispoziție spațiu pentru o bară de butoane (stînga), diferite tabele și alte elemente de control puse la dispoziția utilizatorului.
Fig. 4 Interfața web – Pagina de Monitoring
Pagina modulului de monitorizare pune și ea l adispoziția utilizatorului o reprezentare atractivă și organizată a sistemelor și subansamblelor pe care le monitorizează și despre care pue la dispoziție informații.
Există trei tipuri de obiecte ce pot apărea în planșa de monitoring:
Mașini fizice
Web Servers
Servere de Baze de date
Fig. 5 Interfața web – Pagina Services
Modulul phpMyAdmin face integrarea între interfața phpMyAdmin și planșa de lucru într-un mod în care utilizatorul să aibe sentimentul real că acest subansamblu este în fapt parte integrantă a aplicației MySQL Services.
PhpMyAdmin pune în sine a dispoziția utilizatorului o gamă întreagă de elemente de control și display pe care utilizatorul le poate folosi direct din plașa de lucru.
Modulele de bază ale proiectului
Aplicația „MySQL Services” se constituie din trei module principale ce urmăresc implementarea cîte unei etape din ciclul de viață BPM. Acestea sunt:
Modulul phpMyAdmin
Modulul Design
Modulul Monitoring
Aceste module acoperă etapele de Optimizare, Design și respectiv Monitorizare din ciclul de viață BPM al soluțiilor integrate EAI.
Cu ajutorul modulului phpMyAdmin se pot face orice fel de operații de administrare asupra bazelor de date MySQL. Aplicația open-source phpMyAdmin a fost integrată cu MySQL Services pentru a-i oferi acesteia din urmă tool-urile necesare pentru administrarea tuturor aspectelor bazelor de date, pînă la cele mai detaliate, tehnice, legate de serverul de baze de date, privilegii, etc.
În modulul de Design, se pune la dispoziția utilizatorului o Planșă de Design în care utilizatorul poate în mod grafic și facil să-și proiecteze baze de date pentru orice fel de scopuri. Acest dashboard pune la dispoziție un set de tool-uri grafice pentru stabilirea tuturor detaliilor necesare în etapa de design și modelare a unei baze de date.
Modulul Monitoring adaugă la MySQL Services posibilitatea monitorizării activității și configurației serverelor fizice (computer, laptop, etc) precum și a serverelor web și de baze de date. Dintr-o singură planșă utilizatorul are o privire de ansamblu asupra întregului proces de business pe care l-a implementat, perspectiva coloanei vertebrale de mașini, servere web și baze de date așezate în mod ierarhic de care acesta dispune.
În capitolele ce urmează voi detalia cîteva din aspectele grafice și tool-urile puse la dispoziție de fiecare modul.
Modulul phpMyAdmin
Modulul phpMyAdmin este diferit de toate celelalte prin faptul că este un pachet de sine stătător cu propria interfață și structură. Din fericire, phpMyAdmin are totuși o arhitectură generală similară cu MySQL Services, ceea ce face integrarea lor să fie posibilă fără a părea deplasată.
Fig. 6 Elementele interfeței phpMyAdmin
phpMyAdmin suportă în mod current o multitudine de operații printre care vom enumera pe cele mai importante:
creare și ștergere baze de date
creare, copiere, ștergere și modificări tabele
ștergere, editare și adăugare câmpuri
executare orice frază SQL, chiar și interogări batch (loturi)
management chei pe câmpuri
încărcare fișiere de tip text în tabele
creare și citire dump-uri ale tabelelor
export de date în format multiplu (CSV, XML, PDF, OpenDocument, Word, Excel)
management utilizatori și privilegii
administrare servere multiple.
Aplicația este extrem de prietenoasă, comparativ cu aplicația similară pgMyAdmin – ce face managementul bazelor de date PostGreSQL).
Printre avantajele phpMyAdmin se numără:
Se poate accesa ușor de pe orice calculator
Prezintă un set robust de caracteristici
Oferă export și import SQL cu un număr rezonabil de opțiuni
Suportă operații ușor de accesat la nivel de tabelă cum ar fi redenumire, mutare date
Unelte simple pentru copiere dintr-o tabelă în alta sau dintr-o bază de date în alta
Set complet de operații legate de interogare (mergând până la stocarea și accesarea lor ulterioară)
Modulul de Design
Acest modul pune la dispoziția utilizatorului o planșă de design extinsă cu grupuri de controale și informații și date utile. Să urmărim în continuare desfășurarea a cîteva din operațiile uzuale pe care va fi nevoit un designer să le urmărească în folosirea acestui modul.
Inițial nu avem la dispoziție baze de date după cum este indicat de listbox-ul „Use Database”. Să începem atunci prin a crea o nouă bază de date.
Fig. 7 Pași de Design – Starea inițială
La apăsarea butonului „New Database” se va afișa un formular ce va cere datele minimale necesare pentru a defini o bază de date, în speță numele dorit pentru aceasta. După apăsarea butonului „Ok”, listbox-ul „Use database” va fi populat cu noua înregistrare.
Fig. 8 Pași de Design – Crerea unei baze de date
Se poate vedea că în acest moment avem controlul și asupra modelării de tabele, după cum o indică combobox-ul „Tables”.
Să profităm de acest lucru pentru a crea o tabelă nouă în baza de date pe care tocmai am creat-o.
Fig. 9 Pași de Design – Crearea unei tabele
Se cer, ca și în cazul creerii bazei de date, parametrii minim necesari pentru definirea tabelei noi, iar după apăsarea butonului Ok Tabela devine vizibilă pe planșa de lucru. În combobox-ul „Tables” putem observa că au apărut de fapt două înregistrări, anume tabel nou creată și opțiunea „All”.
Fig. 10 Pași de Design – Planșă de lucru populată cu tabele
Ideea este că pe planșa de lucru se pot afișa una sau mai mult tabele, după dorința utilizatorului. Prin alegerea opțiunii „All”se vor afișa toate tabelele bazei de date curente.
Din acest moment urmează configurarea tabelei în ceea ce ține de numele coloanelor, tipurle de date ale acestora, definire de chei primare și străine, etc. Se poate observa că, la creere, se formează implicit o coloană cu numele id și tip de date INTEGER în scopul folosirii acesteia ca și cheie primară. Este la latitudinea utilizatorului însă dacă o va păstra sau o va modifica.
Modulul de Monitorizare
În pagina modulului de Monitoring cunt afișate de o manieră ierarhiă mașinile fizice ce au ca descendenți unul sau mai multe Web servere sau Servere de baze de date.
Fig. 11 Planșa modulului de Monitoring
Ficare entitate are afișate informații specifice pe care utilizatorul le poate analiza, în fucție de tipul de obiect și caracteristicile acestuia.
Fig. 12 Obiectele monitorizate
Descrierea implementării proiectului
Extensia MySQLi
Clasele ierarhice implementate în această librărie sunt următoarele:
mysqli – reprezintă o conexiune între PHP și o bază de date MySQL
mysqli_stmt – prepared statement
mysqli_result – reprezintă rezultatul unei interogări a bazei de date
Clasa MYSQLi
Constructor
mysqli – construieste un nou obiect mysqli
Metode
autocommit – setează modalitatea de commit automat al tranzacțiilor
change_user – schimba utilizatorul curent
character_set_name – întoarce setul de caractere folosit de baza de date
close – închide o conexiune
commit – face commit pe tranzacțiile actuale
connect – stabilește conexiune la serverul MySql
debug – operații de debug
dump_debug_info – face dumpul informatiilor de debug
get_client_info – se obțineversiunea clientului MySql
get_host_info – întoarce tipul de conexiune folosit
get_server_info – întoarce versiunea serverului MySQL
get_server_version – întoarce versiunea serverului MySQL
init – inițialilzează obiectul mysqli
info – întoarce informații despre cea mai recentă interogare a bazei de date
kill – trimite semnal de kill unui thread mysql
multi_query – interogare multiplă
more_results – verifică dacă mai sunt rezultate obținute în urma unei interogări multiple
next_result – întoarce ultimul rezultat dinurma unei interogări multiple
options – setare opțiuni
ping – face ping pe o conexiune la server și se reconectează automat
prepare – pregătirea unei interogări
query – execută interogare a bazeide date
rollback – face rollback pe tranzacția actuală
select_db – alege baza de date default
ssl_set – setări parametri SSL
stat – starea sistemului
stmt_init- initializează un statement pentru folosirea împreună cu mysqli_stmt_prepare
store_result – intoarce rezultatul ultimei interogări
use_result – intoarce rezultatul ultimei interogări fără buffering
Proprietăți
affected_rows – întoarce numărul de rînduri afectate de ultima operație
client_info – întoarce versiunea clientului mysql sub formă de string
client_version – întoarce versiunea clientului mysql sub formă de număr întreg
errno – codul de eroare în urma ultimei operații
error – mesajul de eroare în urma ultimei operații
field_count – numărul de coloane al rezultatului ultimei interogări
host_info – întoarce un string reprezentînd tipul conexiunii
info – informații despre cea mai recentă interogare
insert_id – id-ul autogenerat pentruultima interogare
protocol_version – versiunea protocolului MySql
server_info – întoarce versiunea serverului mysql sub formă de string
server_version – întoarce versiunea clientului mysql sub formă de nr întreg
sqlstate – codul de eroare SQLSTATE corespunzător ultimei erori
thread_id – id-ul threadului conexiunii curente
warning_count – numărul de warning-uri generate în urma ultimei operații
Clasa MYSQLi_STMT
Metode
bind_param – asignează variabile statement-ului curent ca și parametri
bind_result – asignează variabile statement-ului curent ca și variabile de ieșire
close – închide statement-ul
data_seek – avansează pointerul către un rînd la alegere din rezultat
execute – execută statement-ul
fetch – întoarce rezultatul în variabilele de ieșire asignate
free_result – eliberează memoria ocupată de un statement specificat prin handle-ul său
prepare – pregătește o interogare SQL
reset – resetează statement-ul pregătit
send_long_data – trimitere de date pe bucăți
store_result – stochează în buffer rezultatul
Proprietăți
affected_rows – numărul de rînduri afectate
errno – cod eroare în urma ultimei operații
error – mesaj eroare în urma ultimei operații
field_count – numărul de coloane din rezultat
id – identificatorul stement-ului
insert_id – valoarea autogenerată a coloanei cu atributul AUTO_INCREMENT
num_rows – numărul de rînduri din rezultat
param_count – numărul de parametri ai statement-ului
sqlstate – string conținînd codul de eroare SQLSTATE în urma ultimei operații
Clasa MYSQLi_RESULT
Metode:
close – finalizează setul de rezultate
data_seek – mută pointerul intern în rezultat
fetch_array – întoarce rezultatul sub forma unei matrice cu index numeric sau asociativ sau mixt
fetch_assoc – întoarce rezultatul sub forma unei matrice cu index asociativ
fetch_field – întoarce valoarea unei coloane din rezultat
fetch_fields – întoarce valoarea tuturor coloanelor din rezultat
fetch_field_direct – întoarce valoarea unei coloane specificate din rezultat
fetch_object – întoarce un rînd din rezultat sub formă de obiect
fetch_row – întoarce un rînd din rezultat sub forma unui vector
field_seek – mută pointerul rezultat la offset-ul dorit în cîmpurile rezultatului
free_result – eliberează memoria alocată pentru rezultat
Proprietăți:
current_field – offset-ul field pointer-ului curent
field_count – numărul de cîmpuri din rezultat
lengths – întoarce o matrice în care sunt specificate lungimile coloanelor
num_rows – numărul de rînduri din rezultat
type – întoarce tipul de rezultat: MYSQLI_STORE_RESULT sau MYSQLI_USE_RESULT
Integrarea phpMyAdmin
Mulțumită acestui modul, aplicația va fi capabilă să opereze asupra bazelor de date modificări asupra structurii și conținutului informațional cît și asupra configurației serverului de baze de date.
Una dintre cele mai populare aplicații de management MySql, phpMyAdmin a devenit din ce în ce mai folosit, ajungând în prezent la versiunea 2.11.6. Arhitectura versiunii curente ce este bazată tot pe PHP, ca și aplicația de față permite integrarea facilă cu planșa de lucru a paginii de servicii. Toe\t ce este necesar este plasarea unui iframe în pagina maă pentru a pune la dispoziția utilizatorului toate beneficiile phpMyAdmin.
Dezavantaje ale phpMyAdmin sunt:
folosește frame-uri pentru afișare, ar fi mai indicat ajax sau chiar iframe-uri
Interfața utilizator este mai lentă decât o aplicație desktop (poate varia funcție de conexiunea la internet)
Este expusă găurilor de securitate datorate în principal popularității și faptului că este open-source
Nu poate face “editări rapide” cum ar face alte aplicatii desktop (limitarea platformei ~ aplicație web)
Puterea și versatilitatea phpMyAdmin o plasează în fruntea aplicațiilor de management MySql, concurând până și cu o aplicație desktop.
În contextul aplicației de față, integrarea phpMyAdmin face posibilă o administrare completă a bazelor de date incluzînd detaliile de configurare și parametrare a bazelor de date. Datorită acestor caracteristici, phpMyAdmin este responsabil, în cadrul ciclului de viață BPM pe care MySQL Services își propune să îl urmeze, de etapa de Optimizare.
Implementarea modulului de Design
În acest modul se pot proiecta baze de date la nivel de crearea acestora, popularea lor cu tabele precum și popularea tabelelor cu date. Acest modul face din aplicația de față o unealtă de modelare și design al bazelor de date.
La baza implementării acestui modul stă limbajul Javascript, care este folosit extensiv pentru generarea tabelelor și afișarea acestora în mod dinamic. De asemenea, pentru generarea de cod SQL în funcție de design, modulul se folosește de tehnologia Ajax împreună cu PHP. Pentru conectarea la bazele de date și alte operații cu aceasta este folosită extensia MySQLi.
Diferitele obiecte de pe planșa de design sunt reprezentate intern prin clase Javascript responsabile de păstrarea tuturor detaliilor de imlementare și configurare alese de utilizator în modelarea bazei de date.
Implementarea modulului de Monitorizare
În ultimă instanță, „MySQL Services” permite utilizatorului monitorizarea activității și a configurațiilor mașinilor fizice (computer, laptop, server), serverelor de baze de date, precum și a bazelor de date în sine într-o relaționare ierarhică. Prin acest modul intitulat „Monitoring”, aplicația face un pas evolutiv în contextul preocupărilor curente în domeniul interfețelor web pentru baze de date, punînd la dispoziția utilizatorului un mijloc de monitorizare a activității întregului său proces de business ce depinde sau relaționează cu baze de date.
Din punct de vedere al implementării acestei funcționalități, limbajle ce au stat la baza realizării modulului sunt Javascript și PHP pentru generarea conținutului în mod dinamic și preluarea de informații despre sistem.
Codul modulului gazduiește în acest scop cîteva obiecte definite în limbaj Javascript pentru stocarea datelor de conectare la sistemele vizate.
Direcții de dezvoltare a aplicației
Dezvoltarea modulului Monitorizare
Necesitatea dezvoltării modulului de monitorizare se descrie în sensul dezvoltării acestuia spre un tool specifica activităților de BAM (Business Activity Monitoring) ce fac parte integrantă din aceeași soluție EAI.
În acest sens, o posibilă evoluție ar fi integrarea de cod Java JSP sub form aunui Applet cu funcționalități de afișare a unui graf orientat care să reprezinte dependințele dintre obiecte precum și afișarea în timp real al procesului în care acestea se află prin afișare cursului informației prin sistem.
Îmbunătățirea integrării modulului phpMyAdmin
La acest moment modulul phpMyAdmin este responsabil de etapa de Optimizare din ciclul de viață al BPM. Este însă clar faptul că în esență acest plugin dispune de mult mai multe funcționalități ce nu sunt fructificate suficient de aplicația MySQL Services.
O posibilă și utilă evoluție a integrării acestui modul cu celelalte două ar duce, pe lîngă creșterea gradului de coeziune al aplicației, la punerea dla dispoziția utilizatorului a mai multor tool-uri ducînd și la utilizarea cît mai eficientă a phpMyAdmin.
Dezvoltarea modulului Design
În cadrul modulului design se cere creșterea suportului pentru diferite operații cu tabelele și bazele de date și a generatorului de cod. Se simte necesar un modul separat de Deployment, care să se ocupe cu plasarea bazei de date modelată pe serverele ce sunt la disoziția utilizatorului.
Poate că o integrare mai apropiată cu modulul phpMyAdmin ar face aceste lucruri posibil fără foarte multe eforturi.
BIBLIOGRAFIE
http://www.cnet.ro/2006/09/28/unelte-mysql-ii-phpmyadmin/
Cursurile de Interfețe evoluate din cadrul UPB
Cursurile de Baze de Date din cadrul UPB
Integrarea fluxurilor de afaceri prin solutii de Business Process Management, Autor: Silviu Cojocaru, http://www.computerworld.ro/?page=node&id=4601
Enciclopedia Wikipedia, http://en.wikipedia.org/
Integration of supplier-business-clients-partners chain on e-business scale, Autor: Conf.dr. Luminița HURBEAN, Catedra de Informatică Economică, Universitatea de Vest din Timișoara
Blog PAM Design, http://www.pamdesign.ro/blog/faq/ce-este-ajax/
Curs PHP/MySQL, http://www.itim-cj.ro/~jalobean/Cursuri/phpmysql/index.html
MySQLi tutorial, http://www.phpfever.com/mysqli-tutorial.html
Situl oficial PHP, http://www.php.net
Situl oficial MySQL, http://www.mysql.com
ANEXA I – Fragmente de cod
index.html
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=iso-8859-1” />
<title>MySql Services</title>
<link href=”style.css” rel=”stylesheet” type=”text/css” />
<link href=”menu.css” rel=”stylesheet” type=”text/css” />
<script type=”text/javascript” src=”page.js”></script>
<script type=”text/javascript” src=”design.js”></script>
</head>
<body>
<div id=”topPanel”>
<ul>
<li><a href=”#” onclick=”show_log_page()”>Log</a></li>
<li><a href=”#” onclick=”show_print_page()”>Print</a></li>
<li><a href=”#” onclick=”show_help_page()”>Help</a></li>
<li><a href=”#” onclick=”show_work_page()”>Work</a></li>
<li class=”active”>Home</li>
</ul>
<a href=”index.html”>
<img src=”images/logo.gif” title=”MySQL Services” alt=”MySQL Services” style=”width:230px; height:80px; border:none;” />
</a>
<div id=”headerPanelLeft”>
<h2>design</h2>
<p>Data Base Design Dashboard</p>
<a href=”#” onclick=”show_design_dashboard()”> </a>
</div>
<div id=”headerPanelCenter”>
<h2>monitor</h2>
<p>Monitor your machines/servers/databases</p>
<a href=”#” onclick=”show_monitoring_dashboard()”> </a>
</div>
<div id=”headerPanelRight”>
<h2>services</h2>
<p>Administrate your databases</p>
<a href=”#” onclick=”show_services_dashboard()”> </a>
</div>
</div>
<div id=”bodyPanel”>
<h2>About MySQL Services</h2><br /><br />
<p>MySQL Services puts at your disposal the first Business Process Modeling tool for the Data Base sector. It is a pioneering tool of EAI concepts that allows you to use it for your business as much as for personal interest.</p>
<br /><br />
<p class=”dotline”><img src=”images/blank.gif” alt=”” width=”1” height=”1” /></p>
<p class=”capstext”>With MySQL Serices you can Design your own database, Monitor the activity of your database(s) as well as its web servers and database servers. You can also use this tool to login to any of your databases using phpMyAdmin and have instant access to all aspects of database administration.</p>
<p class=”dotline”><img src=”images/blank.gif” alt=”” width=”1” height=”1” /></p>
<p class=”more”><a href=”#”>More</a></p>
</div>
<div id=”footerPanel”>
<div id=”footerbodyPanel”>
<ul>
<li><a href=”index.html”>Home </a>| </li>
<li><a href=”#” onclick=”show_work_page()”>Work</a> | </li>
<li><a href=”#” onclick=”show_help_page()”>Help </a>| </li>
<li><a href=”#” onclick=”show_pint_page()”>Print</a> | </li>
<li><a href=”#” onclick=”show_log_page()”>Log</a> </li>
</ul>
<p class=”copyright”>© Ciprian Dobre, 2008</p>
<ul class=”templateworld”>
<li>Design By:</li>
<li><a href=”http://www.templateworld.com” target=”_blank”>Template World</a></li>
</ul>
<div id=”footerhtmlPanel”><a href=”http://validator.w3.org/check?uri=referer” target=”_blank”>html</a></div>
<div id=”footercssPanel”><a href=”http://jigsaw.w3.org/css-validator/check/referer” target=”_blank”>css</a></div>
</div>
</div>
</body>
</html>
style.css
/* CSS Document */
body{background:#fff; color:#0F0F0F; font:15px/20px Arial, Helvetica, sans-serif; margin:32px 0 0; padding:0;}
div, ul, h1, h2, h3, li, p, img{margin:0; padding:0;}
ul{list-style-type:none;}
/* TOP PANEL*/
#topPanel{width:762px; height:373px; position:relative; margin:0 auto; padding:0;}
#topPanel img{width:230px; height:80px; z-index:1; padding:0; position:absolute; margin:0 0 0 21px;}
/* MENU PANEL*/
#topPanel ul{display:block; width:732px; height:36px; position:absolute; top:0; right:0; margin:11px 0 0; padding:0 29px 0 0; border-bottom:1px solid #AEAEAE;}
#topPanel ul li{float:right; font:12px/36px "Trebuchet MS",Arial, Helvetica, sans-serif; font-weight:bold;}
#topPanel ul li a{width:74px; height:36px; display:block; padding:0; color:#555; background:#fff; text-decoration:none; text-align:center; margin:0 1px 0 0; top:0px; left:0px;}
#topPanel ul li a:hover{width:74px; height:36px; text-decoration:none; background:url(images/button.gif) no-repeat 0 0 #AEAEAE; color:#fff;}
#topPanel ul li.active{width:74px; display:block; height:36px; background:url(images/button.gif) no-repeat 0 0 #AEAEAE; color:#fff; text-align:center; margin:0 1px 0 0;}
/* HEADER PANEL*/
#topPanel #headerPanelLeft{width:246px; height:263px; position:absolute; top:0; left:0; margin:110px 0 0; padding:0px; background:url(images/orange-normal.jpg) no-repeat 0 0 #FC5F00; color:#fff;}
#topPanel #headerPanelLeft a{width:246px; height:263px; display:block; text-decoration:none; }
#topPanel #headerPanelLeft a:hover{width:246px; height:263px; background:url(images/orange-hover.jpg) no-repeat 0 0 #FC5F00; color:#fff; text-decoration:none;}
#topPanel #headerPanelLeft h2{display:block; width:90px; height:47px; margin:54px 0 0 120px; font:28px/28px "Trebuchet MS",Arial, Helvetica, sans-serif; font-weight:bold; text-transform:uppercase; position:absolute; top:0px; left:0px; z-index:1;}
#topPanel #headerPanelLeft p{width:163px; display:block; font:12px/18px Arial, Helvetica, sans-serif; font-weight:bold; position:absolute; top:0px; left:0px; z-index:1; padding:0; margin:105px 50px 0 38px;}
#topPanel #headerPanelCenter{width:246px; height:263px; position:absolute; top:0; left:258px; margin:110px 0 0; padding:0px; background:url(images/green-normal.jpg) no-repeat 0 0 #FC5F00; color:#fff;}
#topPanel #headerPanelCenter a{width:246px; height:263px; display:block; text-decoration:none; }
#topPanel #headerPanelCenter a:hover{width:246px; height:263px; background:url(images/green-hover.jpg) no-repeat 0 0 #FC5F00; color:#fff; text-decoration:none;}
#topPanel #headerPanelCenter h2{display:block; width:90px; height:47px; background:none; margin:54px 0 0 103px; font:28px/28px "Trebuchet MS",Arial, Helvetica, sans-serif; font-weight:bold; text-transform:uppercase; padding:0; position:absolute; z-index:1;}
#topPanel #headerPanelCenter p{width:163px; display:block; font:12px/18px Arial, Helvetica, sans-serif; font-weight:bold; position:absolute; top:0px; left:0px; z-index:1; padding:0; margin:105px 50px 0 38px;}
#topPanel #headerPanelRight{width:246px; height:263px; position:absolute; top:0; right:0; margin:110px 0 0; padding:0px; background:url(images/blue-normal.jpg) no-repeat 0 0 #FC5F00; color:#fff;}
#topPanel #headerPanelRight a{width:246px; height:263px; display:block; text-decoration:none; }
#topPanel #headerPanelRight a:hover{width:246px; height:263px; background:url(images/blue-hover.jpg) no-repeat 0 0 #FC5F00; color:#fff; text-decoration:none;}
#topPanel #headerPanelRight h2{display:block; width:90px; height:47px; background:none; margin:54px 0 0 93px; font:28px/28px "Trebuchet MS",Arial, Helvetica, sans-serif; font-weight:bold; text-transform:uppercase; padding:0; position:absolute; z-index:1;}
#topPanel #headerPanelRight p{width:163px; display:block; font:12px/18px Arial, Helvetica, sans-serif; font-weight:bold; position:absolute; top:0px; left:0px; z-index:1; padding:0; margin:105px 50px 0 38px;}
/*TOP PANEL*/
/* BODY PANEL*/
#bodyPanel{width:762px; height:500px; position:relative; margin:0 auto; padding:0;}
#bodyPanel h2{ background:#fff; display:block; width:250px; height:50px; margin:0; font:30px/30px Georgia, "Times New Roman", Times, serif; font-weight:normal; padding:4px 0 0 202px; color:#FF7113;}
#bodyPanel p{background:url(images/symbol.jpg) 0 0 no-repeat #fff; margin:0 0 0 54px; padding:0 42px 35px 150px; color:#0F0F0F;}
#bodyPanel p span{font-weight:bold;}
#bodyPanel p.dotline{background:url(images/dot-line.gif) 0 0 repeat-x #fff; padding:0; margin:0 40px 0 25px; color:#000;}
#bodyPanel p.capstext{background: url(images/name.gif) bottom right no-repeat #fff; font:18px/24px Georgia, "Times New Roman", Times, serif; font-style:italic; color:#555555; padding:2px 10px 0 25px ; margin:0 35px 10px 0; }
#bodyPanel p.more{height:26px; padding:0; background:none; margin:0;}
#bodyPanel p.more a{width:76px; height:26px; display:block; margin:314px 20px 19px 618px; background:url(images/more.gif) 0 0 no-repeat #fff; color:#555; text-decoration:none; font:15px/26px "Trebuchet MS",Arial, Helvetica, sans-serif; padding:0 0 0 10px; text-transform:uppercase; position:absolute; top:0px; right:0px;}
#bodyPanel p.more a:hover{background:url(images/more.gif) 0 0 no-repeat #fff; color:#216EBD; text-decoration:none;}
#bodyPanel h3{background:#fff; display:block; width:250px; height:34px; margin:34px 0 12px 0; font:30px/30px Georgia, "Times New Roman", Times, serif; font-weight:normal; padding:0 0 0 20px; color:#FF7113;}
#bodyPanel #testimonial{width:283px; height:162px; display:block; background:url(images/testimonial-bg.gif) 0 0 no-repeat #FFF6DB; padding:32px 33px 0 148px; margin:0 0 0 20px; color:#786321;}
#bodyPanel #testimonial p{background:none; margin:0; padding:0 0 5px 0;}
#bodyPanel #testimonial p span{color:#786321 !Important; background:#FFFAED !Important;}
#bodyPanel p.moretwo{height:26px; padding:0; background:none; margin:0;}
#bodyPanel p.moretwo a{width:76px; height:26px; display:block; margin:0px 0px 0px 196px; background:url(images/more2.gif) 0 0 no-repeat #FFF5D6; color:#555; text-decoration:none; font:15px/26px "Trebuchet MS",Arial, Helvetica, sans-serif; text-transform:uppercase; padding:0 0 0 10px; top:0px; right:0px;}
#bodyPanel p.moretwo a:hover{background:url(images/more2.gif) 0 0 no-repeat #FFF5D6; color:#216EBD; text-decoration:none;}
#bodyPanel h4{ background:#fff; width:250px; height:30px; position:absolute; top:361px; right:5px; margin:0; font:30px/30px Georgia, "Times New Roman", Times, serif; font-weight:normal; padding:0px; color:#FF7113;}
/* FOOTER PANEL*/
#footerPanel{width:100%; background:#DCDCDC; color:#4C4C4C; font-size:12px;}
#footerbodyPanel{width:762px;height:133px; position:relative; margin:0 auto; padding:0;}
#footerPanel ul{width:320px; display:block; position:absolute; right:10px; top:33px; }
#footerPanel li{float:left; font:12px/15px Arial, Helvetica, sans-serif; font-weight:normal;}
#footerPanel ul li a{padding:0 6px; color:#4C4C4C; background:#DCDCDC; text-decoration:none;}
#footerPanel ul li a:hover{text-decoration:underline;}
#footerPanel ul li a.padl{padding:0 0 0 6px;}
#footerPanel p.copyright{background:#DCDCDC; display:block; position:absolute; top:54px; right:45px; color:#A64200;}
#footerPanel ul.templateworld{width:158px; background:#DCDCDC; color:#4C4C4C; display:block; position:absolute; top:74px; right:40px;}
#footerPanel ul.templateworld li a{background:#DCDCDC; display:block; color:#4C4C4C; text-decoration:none;}
#footerPanel ul.templateworld li a:hover{text-decoration:underline;}
#footerhtmlPanel{ width:86px; height:31px; display:block; position:absolute; top:34px; left:29px; margin:0; padding:0;}
#footerhtmlPanel a{ width:86px; height:31px; display:block; background:url(images/html-img.gif) no-repeat 0 0 #DCDCDC; text-decoration:none; font:14px/31px "Trebuchet MS",Arial, Helvetica, sans-serif; color:#2F2F2F; text-transform:uppercase; padding:0 0 0 10px; position:absolute; top:0px; right:0px;}
#footerhtmlPanel a:hover{background:url(images/html-img.gif) no-repeat 0 0 #DCDCDC; color:#216EBD; text-decoration:none; }
#footercssPanel{ width:86px; height:31px; display:block; position:absolute; top:34px; left:115px; margin:0; padding:0;}
#footercssPanel a{ width:86px; height:31px; display:block; background:url(images/css-img.gif) no-repeat 0 0 #DCDCDC; text-decoration:none; font:14px/31px "Trebuchet MS",Arial, Helvetica, sans-serif; color:#2F2F2F; text-transform:uppercase; padding:0 0 0 10px; position:absolute; top:0px; right:0px;}
#footercssPanel a:hover{background:url(images/css-img.gif) no-repeat 0 0 #DCDCDC; color:#216EBD; text-decoration:none; }
page.js
// <script type="text/javascript">
function show_design_dashboard ()
{
document.getElementById("bodyPanel").innerHTML = " \
<table id='design_dashboard' cellpadding='5px' style='text-align: left; vertical-align:top; margin:10px;'> \
<tr id='header'> \
<td>Use Database</td> \
<td> \
<select id='dblist' disabled='true' onchange='display_db(this.value)'> \
<option>No Database Available</option> \
</select> \
</td> \
</tr> \
<tr id='container'></tr> \
</table> \
<div class='menu'> \
<ul> \
<li><a href='#1' onclick='show_new_database_form()' title='Design a new database'>New Database</a></li> \
<li id='databaseform'></li> \
<li><a href='#2' onclick='show_new_table_form()' title='Design a new table'>New Table</a></li> \
<li id='tableform'></li> \
</ul> \
</div>";
}
function show_new_database_form()
{
var form = document.getElementById("databaseform");
form.innerHTML = " <label>Name </label><input type='text' id='dbname' /><br /> \
<input type='button' value='Ok' onclick='design_new_database(); this.parentNode.innerHTML=\"\"' /> \
<input type='button' value='Cancel' onclick='this.parentNode.innerHTML=\"\"' />";
}
function show_new_table_form()
{
if (document.getElementById("dblist").disabled)
{
alert("No database available. Create a database first.");
return;
}
var dblist = document.getElementById("dblist").cloneNode(true);
dblist.id = "formdblist";
var form = document.getElementById("tableform");
form.innerHTML = "<label>Name </label><input type='text' id='tblname' /><br /> \
<label>DB </label>";
form.appendChild(dblist);
form.innerHTML += "<br /> \
<label>Rows </label><input type='text' value='1' id='tblrows' /><br /> \
<label>Cols </label><input type='text' value='1' id='tblcols' /><br /> \
<input type='button' value='Ok' onclick='design_new_table(); this.parentNode.innerHTML=\"\"' /> \
<input type='button' value='Cancel' onclick='this.parentNode.innerHTML=\"\"'/>";
}
function show_monitoring_dashboard ()
{
document.getElementById("bodyPanel").innerHTML = "<iframe style='width:100%; height:400px;' src='monitoring_dashboard.php'></iframe>";
}
function show_services_dashboard ()
{
document.getElementById("bodyPanel").innerHTML = "<iframe style='width:100%; height:700px;' src='phpMyAdmin/index.php'></iframe>";
}
var timer = null;
function showMenu(x, y, menuId)
{
if (document.getElementById(menuId))
{
document.getElementById(menuId).style.visibility = 'visible';
if (timer) clearTimeout(timer);
timer = null;
return
}
contents = document.getElementById("bodyPanel");
var Container = document.createElement('div');
contents.appendChild(Container);
Container.id = menuId;
Container.className = 'dropDownMenu';
Container.style.left = (x – 10) + 'px';
Container.style.top = (y – 10) + 'px';
Container.addEventListener('mouseout', mouseOutMenu, false);
Container.addEventListener('mouseover', mouseOverMenu, false);
var Menu = document.createElement('ul');
Container.appendChild(Menu);
var removeBtn = document.createElement('li');
removeBtn.innerHTML = "<a href='#1' onclick=\"removeColumn('" + menuId.substr(5) + "')\">Remove</a>";
var renameBtn = document.createElement('li');
renameBtn.innerHTML = "<a href='#1' onclick=\"renameColumn('" + menuId.substr(5) + "')\">Rename</a>";;
var sortBtn = document.createElement('li');
sortBtn.innerHTML = "<a href='#1' onclick=\"sortTable('" + menuId.substr(5) + "')\">Sort</a>";;
Menu.appendChild(removeBtn);
Menu.appendChild(renameBtn);
Menu.appendChild(sortBtn);
}
function mouseOverMenu()
{
this.style.visibility = 'visible';
if (timer) clearTimeout(timer);
timer = null;
}
function mouseOutMenu()
{
if (timer)
{
clearTimeout(timer);
}
timer = setTimeout("document.getElementById('" + this.id + "').style.visibility = 'hidden'", 1000);
}
monitoring_dashboard.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>MySql Services – Monitoring Dashboard</title>
<!–script type="text/javascript" src="dashboard.js" /–>
<style>
ul {width:200px; display:block; list-style-image: url(images/symbol2.gif);}
ul li{font:12px/25px Arial, Helvetica, sans-serif; font-weight:normal; padding-left: 10px;}
ul span{ background:url(images/dot-line.gif) repeat-x 0 100%; height:25px; display:block;}
.box{width:400px; height:183px; display:block; background-image:url(images/box-bg.jpg); padding:10px 10px 10px 10px;}
</style>
</head>
<body>
<table>
<tr>
<td>
<table class="box" border="0" cellpadding="5px">
<tr>
<td><img align="center" src="images/workstation.gif" /></td>
<td rowspan="2">
<p><b><span>INFO</span></b></p>
<p>
<?php
$link = mysqli_connect("localhost", "root", "root", "licentarb");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* print host information */
printf("Host info: %s\n", mysqli_get_host_info($link));
/* close connection */
mysqli_close($link);
?>
</p>
</td>
</tr>
<tr>
<td><center>Columbus Server</center></td>
</tr>
</table>
</td>
<td>
<table class="box" border="0" cellpadding="5px">
<tr>
<td><img align="center" src="images/webapplication.gif" /></td>
<td rowspan="2">
<p><b><span>INFO</span></b></p>
<p>
<?php
$link = mysqli_connect("localhost", "root", "root");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* print protocol version */
printf("Protocol version: %d\n", mysqli_get_proto_info($link));
echo "<br />";
printf("Server version: %s\n", mysqli_get_server_info($link));
/* close connection */
mysqli_close($link);
?>
</p>
</td>
</tr>
<tr>
<td><center>Columbus Web Server</center></td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
</td>
<td>
<table class="box" border="0" cellpadding="5px">
<tr>
<td><img align="center" src="images/database.gif" /></td>
<td rowspan="2">
<p><b><span>INFO</span></b></p>
<p> <?php printf("Client library version: %s\n", mysqli_get_client_info()); ?> </p>
</td>
</tr>
<tr>
<td><center>Columbus MySql Database</center></td>
</tr>
</table>
</td>
</table>
</body>
</html>
design.js
// <script type="text/javascript">
// Objects
function DataBase (name, type, host, port, tables)
{
//definition
this.name = name;
this.host = host;
this.type = type;
this.port = port;
//data
this.tables = tables;
}
function Table (name, cells, cols)
{
//definition
this.name = name;
this.cols = cols;
//data
this.cells = cells;
}
function Column (name, dataType, isPK, isFK, ref)
{
//definition
this.name = name;
this.dataType = dataType;
this.isPK = isPK;
this.isFK = isFK;
this.ref = ref;
}
// Globals
var dbs = new Array ();
// Functions
function design_new_database()
{
//validation
var dbname = document.getElementById("dbname");
if (dbname == null) return;
if (dbname.value.length == 0) {alert("Database '"+dbname.value+"' could not be created. Invalid database name."); return;}
var i;
for (i = 0; i < dbs.length; i++)
{
if (dbs[i].name == dbname)
{
alert("Database '"+dbname.value+"' could not be created. A database with this name already exists.");
return;
}
}
//database creation
dbs.push(new DataBase(dbname.value, null, null, null, new Array()));
var dblist = document.getElementById("dblist");
if (dblist.disabled)
{
dblist.options[0] = new Option (dbname.value);
dblist.disabled = false;
display_db(dbname.value);
}
else
{
dblist.add(new Option(dbname.value), null);
}
}
function display_db(dbname)
{
var i;
var db;
for (i = 0; i < dbs.length; i++)
{
if (dbname == dbs[i].name)
{
db = dbs[i];
break;
}
}
var tbllist = document.getElementById("tbllist");
if (!tbllist)
{
document.getElementById("header").innerHTML += " \
<td>Tables: </td> \
<td> \
<select id='tbllist' multiple='true' onchange='display_tables(this.options, \"" + db.name + "\")'> \
</select> \
</td>";
tbllist = document.getElementById("tbllist");
}
tbllist.innerHTML = "";
if (db.tables.length == 0)
{
tbllist.disabled = true;
tbllist.add(new Option ("No Tables Available"), null);
}
else
{
tbllist.disabled = false;
tbllist.add(new Option("All"), null);
tbllist.options[0].selected = true;
display_tables(tbllist.options, db.name);
}
for (i = 0; i < db.tables.length; i++)
{
tbllist.add(new Option(db.tables[i].name), null);
}
}
function design_new_table()
{
//validation
var tblname = document.getElementById("tblname").value;
var rows = document.getElementById("tblrows").value;
var cols = document.getElementById("tblcols").value;
var dbname = document.getElementById("formdblist").value;
if (tblname.length == 0 || rows.length == 0 || cols.length == 0 || dbname.length == 0)
{
alert("Table '"+tblname+"'could not be created. Please fill in all fields.");
return;
}
var nrRows = parseInt(rows, 10);
var nrCols = parseInt(cols, 10);
if (isNaN(nrRows) || isNaN(nrCols) || nrCols == 0)
{
alert("Table '"+tblname+"'could not be created. Invalid row or column number.");
return;
}
var i;
var idx;
for (i = 0; i < dbs.length; i++)
{
if (dbs[i].name == dbname)
{
var j;
for (j = 0; j < dbs[i].tables.length; j++)
{
if (dbs[i].tables[j].name == tblname)
{
alert("Table '"+tblname+"'could not be created. A table with that name already exists in the selected database.");
return;
}
}
idx = i;
break;
}
}
//table creation
var colArr = new Array();
colArr[0] = new Column ("id", "INTEGER", true, false, null);
for (i = 1; i < nrCols; i++)
{
colArr.push(new Column("column_" + i));
}
var cellArr = new Array();
for (i = 0; i < nrRows; i++)
{
cellArr.push(new Array(nrCols));
}
dbs[idx].tables.push(new Table (tblname, cellArr, colArr));
if (document.getElementById("dblist").value == dbs[idx].name)
{
display_db(dbs[idx].name);
}
}
function display_tables (list, dbname)
{
container = document.getElementById("container");
container.innerHTML = "";
var i;
var db;
for (i = 0; i < dbs.length; i++)
{
if (dbname == dbs[i].name)
{
db = dbs[i];
break;
}
}
if (list[0].value == "All")
{
alert('a');
list = db.tables;
}
else
{
var newList = new Array();
for (i = 0; i < list.length; i++)
{
if (!list[i].selected) continue;
var j;
var tbl;
for (j = 0; j < db.tables.length; j++)
{
if (list[i].value == db.tables[j].name)
{
tbl = db.tables[j];
break;
}
}
newList.push(tbl);
}
list = newList;
}
for (i = 0; i < list.length; i++)
{
display_table(list[i]);
}
}
function display_table (tbl)
{
container = document.getElementById("container");
container.innerHTML += "<td><table style='border-collapse: collapse; border: thin solid;' id='tbl_" + tbl.name + "'></table></td>";
var tblElem = document.getElementById ("tbl_" + tbl.name);
var caption = tblElem.createCaption();
caption.style.bgColor="LightCyan";
caption.innerHTML = "<a href='#' style='font-variant:small-caps;' onclick='showMenu(event.clientX, event.clientY, \"menu_" + tbl.name + "\")'>" + tbl.name + "</a>";
var header = tblElem.insertRow(0);
var i;
for (i = 0; i < tbl.cols.length; i++)
{
header.innerHTML += "<th style='background-color:LightBlue; text-align:center;'> \
<a href='#' style='color:blue;' onclick=''>" + tbl.cols[i].name + "</a> \
<br /><a href='#' style='font-size:xx-small;' onclick=''>" + tbl.cols[i].dataType + "</a> \
</th>";
}
var j;
for (i = 0; i < tbl.cells.length; i++)
{
var row = tblElem.insertRow(i + 1);
for (j = 0; j < tbl.cells[i].length; j++)
{
row.innerHTML += "<td> \
<input type='text' value='' name='" + tbl.cols[j].name + "' /> \
</td>";
}
}
}
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Interfata Web Pentru Administrarea Bazelor de Date (ID: 148919)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
