Aplicație Pentru Servicii Bancare Internet Banking

UNIVERSITATEA DIN PITEȘTI

Facultatea de Electronică, Comunicații și Calculatoare

Specializarea: Calculatoare

APLICAȚIE PENTRU SERVICII BANCARE-INTERNET BANKING

Pitești

2015

INTRODUCERE

Serviciile bancare la distanța având denumirea de remote banking sunt reprezentative în noua economie deoarece constituie unul din produsele tipice ale acestei economii.

Cu trecerea timpului investițiile in această nouă tehnologie a fost mai apăsată și a generat un randament crescător în care băncile și producătorii de tehnologii au început să stimuleze reciproc tot mai mult procesul de dezvoltare.

Creșterea continuă a numarului de servicii bancare și dorința de a satisface cât și cele mai sofisticate cereri a dus la dorința fidelizării continue și aprige a cât mai multi clienti acest lucru impunând o cerere continuă pentru tehnologii noi.

Tema acestei lucrări de diploma este “APLICAȚIE PENTRU SERVICII BANCARE -INTERNET BANKING “

Lucrarea este structurată în 5 capitole, concluzii, bibliografie și anexe, tratează implementarea unei pagini web cu bază de date relațională pentru realizarea unei aplicații software ce vă permite să faceți transferuri sigure și rapide, să vă verificați soldurile conturilor și totodată să monitorizați toate detaliile tranzacțiilor.

Capitolul 1 sunt prezentate particularitățiile serviciilor bancare electronice

Capitolul 2 conține prezentarea aplicației de internet banking

Capitolul 3 conține descrierea aplicației și analiza componentelor folosite în serviciului de internet banking

Capitolul 4 conține implementarea aplicației a bazei de date și a fisierului principal
Capitolul 5 conține problemele întâmpinate pe parcursul găsirii modului de implementare aplicației, precum și direcții de dezvoltare ulterioare

CAPITOLUL 1

Particularitățiile serviciilor bancare electronice

Serviciile bancare la distanță, denumite generic “remote banking”sunt considerate reprezantative pentru noua economie,deoarece constituie unul dintre produsele tipice ale acesteia.La început ,infrastructura informațională a fost considerată de bancile dezvoltate din lume ca o simplă posibilitate de creare a unor noi canale electronice de distribuție a produselor existente.Din acest motiv, serviciile bancare la distanță au primit denumirea de servicii electronice sau e-banking.

Cu timpul, investitiile în tehnologie au fost tot mai mari, concomitent cu procesul de invoare a produselor bancare,ceea ce a generat un fenomen de randament crescator: băncile și producatorii de tehnologii informaționale au început să se stimuleze reciproc tot mai mult în procesul de dezvoltare și în crearea de profit.Creșterea gamei de servicii bancare electronice a condus la extinderea bazei de clienți,iar satisfacerea cererilor tot mai sofisticate și fidelizarea acestora a impus o cerere continuă pentru tehnologii noi.

Sectorul serviciilor bancare presupune o abordare specifică a cercetării nevoilor clienților și stabilirii portofoliului de servicii ce vor fi oferite de bancă

Aceasta se datorează existenței unor particularități ale serviciilor bancare:

• cererea de servicii bancare este eterogenă și de aceea, instituția bancară trebuie să analizeze nevoile fiecărei categorii de clienți și să se adapteze acestora prin serviciile pe care le oferă;

• atomicitatea cererii de servicii bancare (clientela numeroasă și dispersată) îngreunează relațiile cu clienții, aceștia dorind tot mai mult servicii personalizate;

• serviciile bancare au un ciclu de viață lung, nefiind supuse uzurii fizice (au caracter nematerial) și morale. Procesul de îmbătrânire este lent. Uneori, se întâlnesc în practică produse/servicii bancare la fel de vechi ca și banca.

• serviciile bancare nu pot fi protejate prin brevete și ca urmare, imediat după lansarea pe piață a unui nou serviciu creat de o bancă, acesta poate fi preluat de alte bănci. Fiind foarte asemănătoare, serviciile bancare pot fi diferențiate doar prin punerea în evidență a unor calități intrinseci, precum și prin folosirea unor denumiri diferite. De exemplu, certificatele de depozit sau cardurile emise de bănci diferite sunt similare în ceea ce privește conținutul, diferențiindu-se doar ca formă (culori diferite, organizarea diferită a cuprinsului etc.);

• serviciile bancare sunt condiționate de reglementările bancare și fiscale. În cazul în care nu există o bază legală, nu pot fi promovate noi produse/servicii bancare. De exemplu, până la apariția bazei legale, în România nu a fost posibilă punerea în practică a leasingului;

• serviciile bancare implică angajarea clienților în derularea operațiunilor. Este un tip de autoservire (self-service), dar și de colaborare pentru că, în scopul utilizării unor produse, beneficiarul trebuie să întocmească o documentație proprie. Se realizează și o colaborare de concepție, însă beneficiarul creditului trebuie să se limiteze la cadrul normat (formularistic) stabilit de bancă. De asemenea, serviciul self bank oferă clienților posibilitatea de a-și gestiona singuri situația financiară, permițând efectuarea operațiunilor bancare proprii fără restricții (plata facturilor, realizarea transferurilor bancare, retragerea sau depunerea de numerar, obținerea extraselor de cont etc.).

In anul 2005 printr-un proiect amplu finantat de catre Uniunea Europeana împreună cu comunitatea bancara din Romania a fost realizat un sistem modern, performant la nivelul proiectelor din Uniunea Europeana, acest proiect fiind realizat prin programul PHARE acesta luând numele de SEP ( Sistem electronic de plați ).

Sistemul electronic de plăți

SEP a fost structurat ca un sistem modular cu trei componente integrate prin interfețe automate:

-Sistemul RTGS: sistemul cu decontare brută în timp real (sistemul plaților de mare valoare);

-Sistemul ACH: casa de compensație automată (sistemul plaților de mică valoare);

-Sistemul GSRS: sistemul de înregistrare și decontare a operațiunilor cu titluri de stat.

Utilizarea SEP are urmatoarele avantaje:

Timpul scăzut pentru procesarea ordinelor de plată, aceasta putând a fi realizată la un interval de maxim câteva secunde.

Securitatea datelor a fost realizată folosind o infrastructură bazată pe chei publice ce a dus la creșterea nivelului de securitate.

Reducerea numărului de erori umane în realizarea ordinelor de plata, aceasta putând fi realizată oricând în cazul unei situații de neatenție.

Reducerea comisioanelor și cea al costurilor ( datorită sistemului informatic numărul de angajați a fost redus și prin acesta a scăzut numărul erorilor umane)

Instrumente de plată electronice

Instrumentele de plată în SEP sunt asemănatoare cu cele pe suport hârtie , dar ele sunt adaptate transmisiilor electronice și au posibilitatea de a trimite bani de la plătitor către beneficiar.

Instrumentele de plătă valide în zilele noastre sunt ordinul electronic de plată si E-check-ul ( cecul electronic).

Ordinul de plată electronic este asemănător ordinului de plată pe suport hârtie doar că odată cu introducerea acestuia în sistemul de plăți se dematerializează. Circuitul acesteia este același cu cel de pe suport hârtie doar că ordinul electronic de plată este mult mai rapid datorită posiblitățiilor tehnologice de procesare automată și de transfer el realizându-se în timp real.

Cecul electronic ( e-check) este un sistem sub forma unui mesaj electronic si prezintă aceleași funcții ca cecul pe suport hârtie.

Prezentarea serviciilor bancare electronice

Tipurile de servicii electronice bancare principale

Serviciile bancare la distanță au 4 categorii importante printre care enumerăm: home, electronic, internet respectiv mobile banking.Realizarea serviciilor presupune posibilitatea de a conecta utilizatorul cu rețeaua băncii cu ajutorul unui nume(utilizator) și a unei parole și recunoașterea tranzacției.

Serviciul home bank numit și bancă la domiciliu este adresat persoanelor ce doresc obținerea anumitor informații legate de conturile ce le dețin cu ajutorul unui apel telefonic, această informație fiind dată de către un sistem vocal automat.

Serviciul electronic banking este adresat firmelor datorită posibilitățiilor de a procesa un număr cât mai mare de tranzacții și este folosită datorită posibilității conectării acestei aplicații la diferite alte aplicații software folosite în bancă.

Serviciul internet banking cuprinde o interfață grafică ce nu mai necesită folosirea anumitor software-uri preinstalate pentru a le folosii. Acesta necesită un browser ( interfața grafică) pentru accesarea acestuia și permite accesul la serverul bancii prin acestă interfață.

Serviciul de Internet Banking a fost dezvoltat pentru executarea plăților financiare naționale, internaționale precum și pentru menținerea unei evidențe a fondurilor disponibile în conturile dumneavoastră.

De asemenea, Internet Banking vă permite să efectuați transferuri între conturile dumneavoastră, să vizualizați informații privind depozitele la termen, credite, și carduri. Internet Banking vă permite să monitorizați tranzacțiile efectuate de către utilizatori, începând cu momentul înițierii plăților până la execuție.

Serviciul mobile banking este un serviciu de viitor ce a aparut odată cu extinderea tehnologiei WPA ( wireless protocol application ) .

Securitatea operațiilor prin internet

Securitatea electronică este definită de unii experți ca “acele politici,recomandări, acțiuni necesare minimizării riscului aferent efectuării tranzacțiilor electronice ,risc ce se referă la breșe în sistem ,intruziuni sau furt”,iar alții ca “orice mijloc,tehnică sau proces utilizat pentru a proteja volumul de informații al unui sistem”. 

În sistemul electronic de plăți autentificarea și non-repudierea reprezintă etapele cele mai importante și de regulă se folosesc echipamente performante de securitate.

Cele mai cunoscute modalități de autentificare într-un SEP sunt urmatoarele :

Parolele sau pin-ul : este ceea mai cunoscută și ceea mai des întâlnită modalitate de autentificare dar și în același timp ceea mai vulnerabilă dintre toate tehniciile de autentificare. Eficacitatea acesteia depinde de : lungimea parolei, confidențialitatea ei și sistemul de control al parolei.

Token : este o autentificare mai puternică decât parola deoarece este bazat pe o autentificare bifactorială ce de regulă conține un cod personal și o parolă ce sunt stocate într-o memorie.

Amprenta : această metodă de autentificare captează imaginea amprentei în alb-negru care apoi este procesat pentru a extrage anumite informații.Acestea sunt apoi trimise pentru șablon, această metodă este una performantă și nu prezintă riscuri majore datorită unicitații amprentei și prezintă o identificare precisă a persoanei autentificate.

Irisul : implică recunoașterea a 266 de trăsături ce sunt detectabile apoi converite într-un cod digital ce are ca denumite Codul Irisului ( CI ).

Autentificarea vocală: este o metodă de autentificare ce are la bază calitățile distincte din vocea fiecărei persoane.

Semnatură : această metodă se folosește de viteză, presiunea aplicată în realizarea semnăturii și alți factori relativi ce duc către o autentificare de success a utilizatorului.

CAPITOLUL 2

Prezentarea generală aplicației de internet banking

Aplicația a avut la bază nevoia și dorința cât mai ușoară de a accesa informațiile legate de conturile ale unei persoane ce le deține în cadrul unei bănci fară nevoia acesteia de a se transporta către bancă. Aceste informații sunt realizate printr-o interfață grafică ce prezintă toate detaliile conturilor deținute de către utilizator. Interfața grafică reprezintă orice fereastră de tip browser.

Accesul la aplicația Internet Banking este permisă de la orice computer conectat la internet. Pentru navigare este necesar sa aveți instalată una dintre următoarele aplicații:

Internet Explorer

Firefox

Google Chrome

Safari

Opera

Recomandări pentru protecția calculatorul în timpul utilizării Internet Banking-ului.

Nu divulgați datele cu caracter personal (datele de acces la internet-banking, detaliile de card, PIN-ul dumneavoastră etc).

Verificati site-ul de Internet Banking înainte de a vă loga. In primul rând, verificați că

adresa din browser coincide cu cea a serviciului de Internet Banking.

Nu utilizați calculatorul din locuri publice (internet cafe), nu stocați datele de acces pe calculatoare străine, nu lăsați computerul nesupravegheat sau deblocat pe pagina de Internet Banking. Protejați-vă calculatorul folosind programe de securitate dedicate (firewall, antivirus)

Analiza componentelor folosite în serviciului de internet banking

Aplicația a fost realizată cu ajutorul următoarelor tehnologii : Php, Mysql, Html, CSS, Javascript, Smarty, Xampp Server

Php

PHP reprezintă un limbaj de programare ce permite modificarea paginilor web înainte ca acestea să fie transmise de server către browserele utilizatorilor.

Este un limbaj de scripting inserat in html pentru partea de server.

<html>

<head>

<title>Example</title>

</head>

<body>

<?php

echo “Hi, I’m a PHP!”;

?>

</body>

</html>

PHP poate genera conținut HTML pe baza unor fișiere existente sau pornind de la zero, poate să afișeze o imagine sau orice alt conținut accesibil prin web, sau să redirecționeze utilizatorul către alte pagini. În cadrul acestui proces, PHP poate consulta baze de date, fișiere externe sau alte resurse, poate trimite email-uri sau executa comenzi ale sistemului de operare. Întrucat procesarea se realizează la nivelul serverului web, înainte ca paginile web să ajungă în browser, PHP este considerat un limbaj de programare server-side.

PHP (acronim recursiv pentru PHP: Hypertext Preprocessor) este un limbaj de scripting de uz general, cu cod-sursă deschis (open source), utilizat pe scară largă, și care este potrivit în special pentru dezvoltarea aplicațiilor web și poate fi integrat în HTML.

Ceea ce face PHP să difere de un JavaScript de partea clientului este că codul său este executat pe server, generând HTML care este apoi trimis către client. Clientul va primi rezultatele rulării acelui script, fără a putea cunoaște codul-sursă ce stă la bază. Dumneavoastră chiar puteți să configurați web server-ul să proceseze toate fișierele HTML cu PHP, și atunci într-adevăr nu va fi nici o modalitate ca utilizatorii să afle ce aveți ascuns în mânecă.

Cel mai bun lucru la PHP este simplitatea extremă pentru un începător, dar totodată existența multor facilități avansate pentru un programator profesionist. Să nu vă fie teamă să citiți lista lungă a facilităților PHP. Puteți să vă implicați în scurt timp și să începeți a scrie scripturi simple peste câteva ore.

Orice PHP este axat în principal pe scripting de partea server-ului, deci puteți realiza cu el orice poate realiza un alt program CGI, cum ar fi colectarea datelor din forme, generarea conținutului dinamic al paginilor sau trimiterea și primirea cookies. Dar PHP poate face mult mai multe.

Sunt trei domenii principale, unde scripturile PHP sunt utilizate, scripting de partea serverului. Acesta este cel mai tradițional și de bază domeniu al PHP. Aveți nevoie de trei lucruri pentru ca aceasta să funcționeze. Analizatorul PHP (în calitate de CGI, sau modul pentru server), un server web și un navigator web. Trebuie să rulați serverul web cu o instalare PHP conectată la el. Puteți accesa ieșirile programului PHP cu navigatorul web, vizualizând pagina PHP prin server. Toate acestea pot rula pe computerul dumneavoastră de acasă, dacă doar experimentați cu programarea în PHP. Scripting în linia de comandă. Puteți să faceți un script PHP să ruleze fără un server și navigator web. Aveți nevoie doar de analizatorul PHP pentru a-l utiliza în acest mod. Acest mod de utilizare este ideal pentru script-uri executate în mod regulat cu cron (pe *nix sau Linux) sau cu Task Scheduler (pe Windows). Aceste script-uri pot fi utilizate de asemenea pentru lucrări simple de procesare a textelor.

PHP poate fi utilizat pe toate sistemele de operare majore, inclusiv Linux, multe variante Unix (inclusiv HP-UX, Solaris și OpenBSD), Microsoft Windows, Mac OS X, RISC OS și probabil altele. PHP de asemenea susține majoritatea server-elor web existente în prezent. Acestea includ Apache, IIS, și multe altele. De asemenea se includ și serverele ce pot utiliza binarul PHP FastCGI, cum ar fi lighttpd și nginx. PHP funcționează ca modul sau ca procesor CGI.

Cu PHP nu sunteți limitat doar la afișarea HTML. Posibilitățile PHP permit de a afișa imagini, fișiere PDF și chiar filme Flash (utilizând libswf și Ming) generate "din zbor". Puteți de asemenea cu ușurință să afișați orice text, cum ar fi XHTML sau alt fișier XML. PHP poate genera automat aceste fișiere și le poate salva în sistemul de fișiere, în loc să le afișeze, formând astfel un sistem de cache al conținutului dinamic de partea server-ului.

Una dintre cele mai puternice și semnificative facilități ale PHP este susținerea unui larg domeniu de baze de date. Scrierea unei pagini web ce accesează o bază de date este incredibil de simplă utilizând una din extensiile de lucru cu baze de date (de ex. pentru mysql), sau utilizând un nivel de abstractizare precum PDO, sau conectarea la orice bază de date ce susține standardul "Open Database Connection" cu ajutorul extensiei ODBC. Alte baze de date pot utiliza cURL sau socket-uri, cum ar fi CouchDB.

Există multe alte extensii interesante aranjate atât în ordine alfabetică cât și după categorii. De asemenea există extensii PECL suplimentare care pot fi, sau pot să nu fie documentate în cadrul manualului PHP.

După cum puteți vedea, această pagină nu este suficientă pentru a evidenția toate facilitățile și beneficiile oferite de PHP.

Codul PHP trebuie inclus în fișiere cu extensia .php ce vor fi deservite utilizatorilor finali și trebuie delimitat de restul conținutului prin tagul de început <?php si tagul de sfarsit ?>. Practic tot ce se află în interiorul acestor etichete va fi interpretat ca fiind cod-sursa PHP (cod ce va fi executat de interpretorul PHP). Textul din afara celor 2 taguri este lăsat neschimbat, fiind ulterior interpretat de browser. Se pot folosi si alte etichete in funcție de configurația serverului web, dar acestea nu sunt recomandate.

Codul PHP este format din instrucțiuni – comenzi date către interpretor, în urma cărora se execută ceva. Așa cum s-a mai spus, PHP este folosit în principal pentru a genera cod HTML, așa că de cele mai multe ori instrucțiunile folosite sunt cele de afișare. În aplicații mai complexe se pot însă folosi și instrucțiuni de conectare la bazele de date, de citire/scriere/manipulare fișiere, intrucțiuni de trimitere email-uri si altele. Instrucțiunile se pot grupa in blocuri delimitate de acolade { }. Aceste blocuri, numite si "instrucțiuni complexe" se comportă ca si cum ar fi o singură instrucțiune (vezi mai jos exemple de blocuri).

Toate instrucțiunile (în afară de blocuri) trebuie să fie terminate cu punct si virgula ( ; ). Lipsa acestuia generează o eroare.

Prezentarea instrucțiunilor

În acest capitol se vor prezenta instrucțiunile utilizate în acest proiect.

Instructiunea if – else

If (expr)

Statemnet

Instructiunea while

Instrucțiunea while permite programarea ciclurilor cu test

While (expr)

Statement

Instrucțiunea for

Instrucțiunea for are o definitie care îi extinde mult domeniul de aplicare. Ea ofera cea mai compactă metoda de programare a ciclurilor cu test inițial, motiv pentru care este cel mai des folosita.

For(expr1; expr2; expr3)

Statement

Această formă reprezintă de fapt forma compactizată a unui ciclu while. Efectul este similar cu al secvenței:

Expresie 1;

While(expresie2)

{

Instrucțiune

Expresie3;

}

Instrucțiunea break

Instrucțiunea break se utilizează numai în două contexte:

în instrucțiunea swich, pentru a marca încheierea secvenței de instrucțiuni asociate unui selector case și ieșirea din instrucțiunea switch.

în înstrucțiunile de ciclare, pentru a determina ieșirea forțată dintr-un cilu while, do-while sau for, indiferent de valoarea condiției de ciclare.

Afișarea textului in php in fișiere cu extensia .php ce vor fi deservite utilizatorilor finali și trebuie delimitat de restul conținutului prin tagul de inceput <?php si tagul de sfârșit ?>. Practic tot ce se află in interiorul acestor etichete va fi interpretat ca fiind cod-sursa PHP (cod ce va fi executat de interpretorul PHP). Textul din afara celor 2 taguri este lăsat neschimbat, fiind ulterior interpretat de browser. Se pot folosi și alte etichete in funcție de configurația serverului web, dar acestea nu sunt recomandate.

Rezultatul unui script PHP este de cele mai multe ori un text simplu in format HTML. Cu alte cuvinte, în majoritatea cazurilor PHP returnează o pagină HTML ce va fi afișată în browser. La început, acest lucru poate genera confuzii, întrucat sursa HTML este diferită de ceea ce se afișează efectiv in browser.

Ce înseamnă server?

Toata lumea știe, probabil, ce înseamnă Internet: acea colecție uriașă de echipamente legate între ele în scopul schimbului de informații sau al furnizării de servicii. Dacă ar fi să simplificăm mult ideea de internet, am putea considera că acesta este o rețea de calculatoare în care fiecare nod (calculator) gazduiește informații sau servicii ce pot fi accesate de publicul larg. Aceste calculatoare din internet poartă numele de servere.

În sens larg, un server este un dispozitiv (combinație de hardware si software) care oferă servicii și/sau informații utilizatorilor (clienților).

Odată cu noțiunea de server apare și cea de arhitectură client-server, care se referă la un ansamblu format dintr-un dispozitiv server (furnizor de informații) și un dispozitiv (calculator) client, conectate prin intermediul unei rețele și care fac schimb de informații. Cel mai comun exemplu al acestui ansamblu este dat de funcționalitatea de partajare a fișierelor în retea (File Sharing). Spre exemplu, un calculator conține un folder partajat (share-uit) și un alt calculator copiază folderul prin rețea. În această situație, calculatorul care oferă folderul are funcția de server iar cel care preia folderul – pe cea de client. Rolul de client/server nu este statornic în acest scenariu, oricare din cele două calculatoare putând oricând să dețină oricare din funcții. Așadar noțiunea de server se aplică în momentul în care dispozitivul din rețea (calculatorul) oferă informații sau servicii.

Un tip particular de server, este server-ul web. Un server web este un sistem care gazduiește și oferă pagini web prin intermediul unei rețele. De cele mai multe ori, termenul de server web desemnează o aplicație, un program care rulează pe calculatorul-server și care este responsabil cu primirea cerințelor de la utilizatori și transferarea paginilor web către ei.

Paginile stocate pe un calculator-server și oferite publicului larg sunt grupate sub denumirea generică de site. Un site (denumit și website) este, așadar, o colecție de pagini web, interconectate, stocate pe un server web.

În momentul în care un server web primește o cerință de la un utilizator pentru o pagină, se verifică mai întâi existența acesteia. Dacă pagina există fizic pe server atunci este transmisă către utilizator. Paginile returnate de un server web sunt de obicei în format HTML. Navigatoarele web (browserele) sunt capabile să interpreteze codul HTML și să afișeze informațiile într-un mod ușor de citit.

MySQL

MySQL este un sistem de gestiune a bazelor de date, produs de compania suedeză MySQL AB, fiind, la ora actuală, cel mai popular sistem de acest fel. MySQL este utilizat pe scară largă fiind, probabil, cea mai folosită bază de date din lume, cu un număr de instalări estimat la 20 de milioane, aceasta a exercitat o presiune uriașă asupra Oracle, datorită abordării sale cu surse deschise, fiind potențial gratuit pentru multe scopuri și chiar contra cost pentru diferite licențe sau oferte premium. 

SQL permite atât accesul la conținutul bazelor de date, cât și la structura acestoraMySQL este disponibil în mod public din 1996, dar istoria dezvoltării sale începe încă din 1979. MySQL poate fi folosit atât pe platforme Windows, cât și Unix, iar codului sursă i se pot aduce modificări și poate fi redistribuit gratuit.

Serverul de baze de date al MySQL a fost în mod tradițional un produs dezvoltat și menținut de o singură companie, nu un proiect al comunității, depinzând de voluntari sau de furnizori multiplii (precum Linux). De fiecare dată când cineva dezvolta îmbunătățiri importante, compania din spatele MySQL se asigura (printr-o delegare a drepturilor de autor) că are dreptul să folosească acele îmbunătățiri nu doar sub GPL (General Public License), ci și sub alte licențe.

Această abordare a permis MySQL să-și implementeze modelul de afaceri de mare succes bazat pe licența dublă. Cei care au dorit să încorporeze codul MySQL în alte proiecte sub GPL au fost liberi să o facă. Cei care au dorit să-l încorporeze sau să îi aducă îmbunătățiri în produse cu sursele închise, fără a fi nevoiți să-și publice întregul produs derivat sub termenii GPL (ceea ce, practic, i-ar priva de mai multe oportunități comerciale) puteau cumpăra, opțional, o licență comercială (program identic, dar cu drepturi și obligații diferite).

Nu doar afacerea bazată pe licența dublă a depins de principiul acesta, ci și creșterea rapidă a afacerii bazată pe abonarea la „MySQL Enterprise”. Aceasta este compusă din trei tipuri de componente: MySQL (oricum disponibil sub GPL), servicii (care se pot cumpăra și separat, inclusiv de la părți terțe) și instrumente.

MySQL a fost dezvoltat inițial de MySQL AB și, în ultimii șapte ani, de Sun Microsystems, compania cu cele mai mari contribuții la programe libere (limbajul Java, suita de birou OpenOffice.org, sistemul OpenSolaris, sistemul de virtualizare VirtualBox, sistemul GNU, nucleul Linux). 

Fondatorul MySQL, Monty Widenius, cerea, la începutul anului 2010, susținerea comunității open source în fața planului Oracle de a limita suportul MySQL. Widenius era supărat că Oracle a contactat sute de clienți mari care au trimis Comisiei Europene scrisori prin care cereau aprobarea necondiționată a tranzacției. Oracle ar fi promis clienților săi că va finanța dezvoltarea MySQL cu mai mulți bani decât ar fi făcut-o Sun și că, dacă va abandona vreodată sistemul, va apărea o nouă linie de dezvoltare care va continua această activitate.

Succesul MySQL a depins întodeauna de compania din spatele său, care a dezvoltat, a vândut și a promovat MySQL. Compania (inițial MySQL AB, apoi Sun) a deținut întotdeauna importantele drepturi de proprietate intelectuală (DPI-drepturi de proprietate intelectulă), cele mai notabile fiind marca înregistrată, drepturile de autor și brevetele (până acum doar în scopuri defensive). A folosit DPI pentru a genera venituri și a reinvestit o mare parte din ele în dezvoltare, MySQL devenind nu doar un program mai mare, ci și unul mai bun cu timpul.

Creatorii petiției scriau că „dacă aceste DPI cad în mâna competitorului principal al MySQL, atunci MySQL încetează imediat să mai fie o alternativă pentru produsele foarte scumpe ale Oracle. Până acum, clienții au avut posibilitatea de a folosi MySQL în loc de produsele Oracle în noile lor proiecte. Câteva companii mari chiar au migrat de la Oracle la MySQL. Oricine putea amenința oamenii de vânzări ai Oracle cu folosirea MySQL, în cazul în care nu i se acorda o reducere mare. Dacă Oracle va deține MySQL, oamenii de vânzări în mod sigur vor râde când clienții vor mai încerca această tactică. Scăparea de această problemă valorează pe puțin 1 miliard de dolari pe an pentru Oracle”.

Dacă acum cincisprezece ani MySQL era o bază de date de slabă calitate, care mergea totuși foarte bine pentru „web” și pentru alte scopuri unde se cere numai citirea sau mai mult citirea datelor, în timp lucrurile s-au schimbat. Iar în ultimii ani, a devenit din ce în ce mai popular ca alternativă pentru reducerea costurilor în marile înteprinderi și în organizațiile guvernamentale. A urcat din mediul privat și departamental de dimensiuni reduse în mediul proiectelor de referință al unor organizații mari ca Google, Facebook, ebay, Poliția Suedeză, bănci, linii aeriene.

Desigur, Oracle oferă un număr de funcționalități pe care MySQL nu le are azi, dintre care pe unele probabil nici nu o să le aibă în decursul următorilor ani. Cu toate acestea, din ce în ce mai mulți programatori găsesc că MySQL oferă o mare parte din lucrurile de care chiar au nevoie, inclusiv funcționalități de „întreprindere”, mai spun cei din comunitatea open source.

Iată ce spune, însă, un angajat al Oracle pe un forum, subliniind că vorbește în nume personal și nu ca angajat al Oracle, fiind utilizator și cunoscător al mai multor baze de date, de peste 20 de ani: „Cine spune că MySQL este competitor pentru Oracle are o părere… hmm.. interesantă. E ca și cum ai compara Bugatti Veyron/Ferrari Enzo/o mașină de Formula 1 cu… nici nu știu ce să zic să fie comparația adecvată… Tata Nano? Să compari din punct de vedere features/performanțe/stabilitate baza de date care e opțiunea numărul 1 a băncilor, organizațiilor financiare, organizațiilor din sectoarele publice ș.a.m.d. cu «opțiunea nr. 1» a webmasterilor pentru forumuri… da, e posibil… pot să aibă cam același «market share» în segmentele lor… dar e comparația adecvată? Locul lui MySQL nu a fost și nici nu va fi niciodată în segmentul enterprise. Și banii, să fim serioși, de aici vin, și nu de la «forumiști»”. 

Monty Widenius, prin compania proprie Monty Program Ab, împreună cu Percona, o altă companie care oferea servicii și suport pentru MySQL, au anunțat că vor forma un consorțiu neutru, „The Open Database Alliance” cu scopul de a deveni un centru de resurse pentru MySQL. Acesta se va baza pe propria ramură MySQL dezvoltată de Widenius, cu cod derivat, binare, cursuri, suport și îmbunătățiri proprii, toate sub marca MariaDB: „MariaDB va lucra exact ca MySQL. Toate comenzile, interfețele și API care există în MySQL sunt și în MariaDB”, declară Widenius.

MariaDB va include motoarele de stocare Maria DBMS și Prime XT, iar conform declarațiilor lui Widenius, va avea mai puține erori, o linie de testare mai bună, performanțe ridicate, toate acestea fiind comparate cu versiunea Sun a MySQL 5.1, pe care acesta a declarat-o în mod public inutilizabilă în mediul de producție, astfel, MariaDB și Open Database Alliance pretându-se și fiind alternativa cea mai potrivită ca variantă derivată a MySQL.

Această variantă poate fi amenințată în orice stadiu al dezvoltării de brevetele lui MySQL, dacă acestea sunt achiziționate de Oracle.

80-85% din site-uri livrează conținutul prin intermediul unei baze de date MySQL. Conform unui sondaj realizat de 451Group, în momentul de față 82,1% din cei chestionați utilizează MySQL. În 2011 acest procent a scăzut la 78,7%, iar în 2014 la 72,3%.”

Conform Articolului din 24 iunie 2010[Nr. 126] “MySQL- o bază de date cu “ moștenitori“ al Revistei Market Watch.

HTML

HTML este un limbaj de marcare care stă la baza dezvoltării oricărei pagini Web. Limbajul HTML constă într-o serie de etichete numite și taguri care permit formatarea modului de afișare a informației din pagina Web (folosirea unor anumite font-uri, culori și stiluri pentru text, inserarea unor imagini sau a unor tabele, utilizarea listelor și a formularelor etc.).

Unele dintre tag-urile HTML permit precizarea unor caracteristici ale elementului pe care îl introduc, sub formă caracteristică=valoare, aceste caracteristici fiind numite atribute. O etichetă poate avea unul, nici unul, sau mai multe atribute.

Conținutul unui document HTML nu este case-sensitive, cu alte cuvinte nu se face diferența între litere mari și mici la nivelul etichetelor și atributelor, însă valoarea unui atribut poate fi case-sensitive, cum este cazul locațiilor fișierelor și adreselor URL. Un document HTML este un fișier care are extensia .htm sau .html.

Pentru editarea textului unui document HTML pot fi folosite orice tipuri de editoare, începând cu editoare simple cum ar fi Notepad, Textpad și ajungând la editoare mai complexe cum ar fi Macromedia Dreamweaver.

Două dintre trăsăturile de bază ale unui document HTML sunt independența față de platformă si legăturile hypertext (hyperlink-uri). Independența față de platformă este o trăsătură care permite ca documentul HTML să fie afișat în mod asemănător pe diferite calculatoare din punct de vedere al graficii, fontului, culorii, lucru extrem de esențial pentru un numar mare de vizitatori. Totuși, interpretarea codului HTML poate sa fie diferită în funcție de tipul de browser Web utilizat.

Astfel un document HTML poate fi afișat de către un browser Internet Explorer într-un anumit fel, iar de către alt browser (sper exemplu Mozilla Firefox) în alt fel. Hyperlink-urile au o importanță majoră in cadrul unui site Web, întrucat permit ca orice cuvânt, frază, imagine sau element al unei pagini Web să facă referire la o alta pagina Web sau chiar la paragrafe din interiorul aceleiași pagini, realizându-se astfel navigarea cu ușurință între paginile unui site Web sau între părțile componente ale aceleiași pagini.

Un mic document HTML

<!DOCTYPE html>

<html>

<head>

<title>Page Title</title>

</head>

<body>

<h1>My First Heading</h1>

<p>My first paragraph.</p>

</body>

</html>

Explicarea exemplului

Declarația DOCTYPE definește tipul de document pentru a fi HTML

Textul dintre <html> și </ html> descrie un document HTML

Textul dintre <head> și </ head> oferă informații despre documentul

Textul dintre <title> și </ title> prevede un titlu pentru document

Textul dintre <body> și </ body> descrie conținutul paginii vizibil

Textul dintre <h1> și </ h1> descrie o poziție

Textul dintre <p> și </ p> descrie un paragraf

Folosind această descriere, un browser web poate afișa un document cu un titlu și un paragraf.

Tag-uri HTML

Tag-uri HTML sunt cuvinte cheie (nume tag), înconjurate de paranteze unghiulare:

<tagname>content</tagname>

Tag-uri HTML sunt în mod normal în perechi ca <p> și </ p>

Primul tag într-o pereche este eticheta de start, al doilea tag este tag-ul final

Tag-ul final este scris ca tag-ul de start, dar cu un slash înainte de numele tag

Browsere Web

Scopul unui browser web (Chrome, Internet Explorer, Firefox, Safari) este de a citi documente HTML și a le afișa.

Browserul nu afișează etichetele HTML, dar le folosește pentru a determina modul de afișare a documentului:

Structura unei pagini HTML

<html>

<head>

<title>Page title</title>

</head>

<body>

<h1>This is a heading</h1>

<p>This is a paragraph.</p>

<p>This is another paragraph.</p>

</body>

</html>

Numai zona <body> este afișată de browser.

Declarația <! DOCTYPE>

Declarația <! DOCTYPE> ajută browser-ul să afișeze o pagină web în mod corect.

Există diferite tipuri de documente pe web.

Pentru a afișa un document corect, browserul trebuie să știe atât tipul și versiunea.

Declarația doctype nu este sensibilă la majuscule. Toate cazurile sunt acceptabile:

<!DOCTYPE html>

<!DOCTYPE HTML>

<!doctype html>

<!Doctype Html>

Declarații comune

HTML

<!DOCTYPE html>

HTML

<!DOCTYPE HTML PUBLIC>

XHTML 1.0

<!DOCTYPE html PUBLIC>

Inserarea de imagini într-o pagina Web

Pentru inserarea unei imagini intr-o pagină Web se utilizează eticheta Eroare! Nume fișier neprecizat., care are atributele: SRC,WIDTH si HEIGHT. Atributul SRC specifică imaginea care se dorește a fi inserată, luând ca valoare adresa URL a acesteia. Atributele WIDTH și HEIGHT sunt opționale și se utilizează pentru stabilirea unei noi dimensiuni a imaginii, alta decât cea originală. Aceste atribute pot lua ca valori fie numere intregi pozitive, reprezentând dimensiunea in pixeli a imaginii, fie numere de la 1 la 100 urmate de semnul „%”, reprezentând procente din dimensiunea originală a imaginii (lațime, respectiv înălțime). În lipsa acestor atribute, imaginea va fii afișată pe ecran la dimensiunea ei originală. În continuare se prezintă un exemplu de utilizare a etichetei Eroare! Nume fișier neprecizat și a atributelor sale.

<img src=”tabela.jpg” width=”200” height=”30%”>

Tabele sunt elemente de bază ale limbajului HTML. Ele sunt utilizate ca modalitate de afișare a informației (text sau grafică) în cadrul unei pagini Web, permițând organizarea datelor pe linii și coloane.

Un tabel este inserat în cadrul unui document HTML prin intermediul perechii de etichete <TABLE>..</TABLE>. Liniile de tabel se construiesc succesiv (mai întai o linie, apoi altă linie ș.a.m.d), cu ajutorul perechii de etichete <TR>..</TR> (table row). După ce se construiește o linie de tabel (un rând), în cadrul acesteia, trebuie să se definească cel putin un

header (un cap de tabel) sau un element de tip date (o celulă), cu ajutorul etichetelor <TH>…</TH>(table header), respectiv <TD>..</TD>(table date). Textul din interiorul unei celule cu statut de cap de tabel (adică construită cu perechea de etichete <TH>..</TH>) va fi afișat implicit cu caractere aldine si centrat.

Pentru a da un titlu tabelului, se utilizează perechea de etichete <CAPTION>..</CAPTION>, poziționată în zona de definire a tabelului, înaintea construirii liniilor și coloanelor (înainte de etichetele <TR>, respectiv <TD>) .

În continuare, se prezintă sintaxa de baza pentru crearea unui tabel, cu 3 linii (dintre care una reprezintă capul de tabel) și 2 coloane:

<body>

<table>

<caption>Tabel 1</caption> <tr>

<th>Id</th>

<th>Nume</th>

<th>Prenume</th>

<th>Nota</th>

</tr>

<tr>

<td>1</td>

<td>Robu</td>

<td>Andreea</td>

<td>10</td>

</tr>

<tr>

<td>2</td>

<td>Deatcu</td>

<td>Laura</td>

<td>9</td>

</tr>

</table>

</body>

Formulare sunt elemente importante ale limbajului HTML care asigură interacțiunea cu utilizatorii paginii Web. Cu ajutorul formularelor, se preiau o serie de date de la vizitatorii paginii Web, care ulterior, vor fi procesate prin intermediul unor scripturi (în cazul de față scripturi PHP) sau vor fi transmise către o adresa de e-mail.

Un formular HTML este definit între etichetele <FORM>..</FORM>. Tag-ul <FORM> are două atribute foarte importante: ACTION si METHOD.

Atributul ACTION poate lua ca valoare, fie adresa URL a scriptului care va primi si va procesa datele introduse in formular, fie adresa de e-mail, către care vor fi transmise aceste date.

Atributul METHOD specifică metoda de transmitere a datelor, care poate fi GET sau POST. Metoda GET se utilizează atunci când se dorește transmisia unor cantități mici de date. Aceste date vor fi vizibile in bara de navigare a browser-ului, fiind adăugate la adresa indicată de action. Metoda POST se utilizează pentru tansmiterea unor cantități mari de date, în general , și este mai des utilizată. Datele transmise cu metoda POST nu apar în linia de apelare a scriptului, așa cum se întâmplă în cazul utilizării metodei GET.

Elementele unui formular HTML sunt:

Casetele de editare simple;

Casetele de tip password;

Butoanele radio;

Casetele de validare;

Listele de selecție;

Casetele de editare multilinie;

Butoanele submit și reset.

Pentru definirea casetelor de editare simple, a casetelor de tip password, a butoanelor radio, a casetelor de validare, respectiv a butoanelor de tip submit și reset, în cadrul unui formular, se folosește eticheta <INPUT>, care are urmatoarele atribute:

atributul NAME – valoarea sa reprezintă numele sub care se transmite către server conținutul acestui element;

atributul VALUE – are rolul de a atribui o valoare elementului definit în cadrul formularului (valoare implicită);

atributul TYPE – valoarea sa precizează tipul elementului definit prin intermediul tag-ului <INPUT>, după cum urmează:

Dacă TYPE=TEXT, atunci elementul introdus în formular este de tip casetă de editare, conținutul acestei casete reprezentând valoarea transmisă spre server. În această situație, tag-ul <INPUT> dispune și de atributele SIZE – care precizează lungimea casetei de editare) și MAXLENGTH – care specifică numarul maxim de caractere care pot fi introduse în câmpul de editare.

Exemplu:

<input name="variabila" type="text" value="exemplu de casetă de editare" size="20" maxlength="30">

CSS

CSS în română având denumirea foi de stil în cascadă, reprezintă un limbaj de stilizare care permite formatarea elementelor unui document scris într-un limbaj de marcare (HTML, XML etc.). În cadrul acestui material, vom prezenta utilitatea elementelor CSS în stilizarea tag-urilor HTML ce stau la baza dezvoltării paginilor WEB.

Codul HTML se utilizează, de obicei, pentru plasarea conținutului în pagina WEB, detaliile legate de afișare (culori, font-uri, fundaluri, margini, etc. ) fiind asigurate de elementele CSS.

CSS este conceput în primul rând pentru a oferi posibilitatea separarii documentului ca și conținut (scris în HTML sau un Markup Language similar) de documentul de prezentare (scris în CSS) . Această separare îmbunătățeste accesibilitatea conținutului, oferă o mai mare flexibilitate și asigură un control mai simplu al modului de prezentare al elementelor HTML.

HTML nu a fost conceput ca să conțină taguri pentru formatarea documentelor, ci numai pentru definirea conținutului documentelor, ca în exemplul următor:

</h1>Acesta este un titlu<h1/>

</p>Acesta este un paragraf<p/>

Dezvoltarea site-urilor mari, în care informațiile despre font și culoare trebuiau adăugate pe fiecare pagină, a devenit un proces lung și costisitor.

Pentru a rezolva această problemă, consorțiul World Wide Web (W3C) a creat CSS.

În HTML 4.0, toate formatările pot fi înlăturate din documentul HTML și stocate într-un fișier CSS separat. Toate browserele suportă CSS. În acest fel puteți schimba ușor aspectul tuturor paginilor web dintr-un site modificând un singur fișier.

Aplicarea foilor de stil în cascadă asupra codului HTML se poate face în mai multe moduri:

stiluri în linie;

stiluri interne;

stiluri externe;

clase CSS.

Stiluri în linie

Stilurile în linie se definesc chiar în codul HTML, în elementul care se dorește a fi stilizat. Pentru adăugarea unui stil intern la un element se folosește atributul style urmat de proprietăți si valori, folosind următoarea sintaxă:

<element style="proprietate:valoare; proprietate:valoare;"></element>

Stiluri interne

Stilurile interne se definesc în secțiunea <head></head> a documentului HTML, cu ajutorul următoarei sintaxe <style type="text/css"> … </style>. În cadrul acestui tag, se vor defini proprietățile și valorile pentru diverse stiluri.

Această metodă este utilă când se dorește folosirea acelorași stiluri pentru mai multe tag-uri HTML de același tip din documentul HTML curent (tabele, liste, formulare etc.). Astfel, stilurile folosite pentru formatare sunt scrise o singură dată în document, și nu la fiecare element ce se dorește a fi formatat.

Stiluri externe

În cadrul acestei metode de lucru, proprietățile si valorile pentru diverse stiluri sunt specificate într-un fișier extern care are extensia "css", pe care îl putem construi cu orice editor de text (Notepad, Wordpad, Dreamweaver etc.). Fișierele css nu conțin cod HTML, ci doar CSS.

Avantajul folosirii fișierelor externe css constă în faptul că aceleași stiluri pot fi folosite de mai multe pagini din site, chiar de tot site-ul, fiind scrise o singură dată. Deasemenea, orice modificare necesară asupra unui stil, va trebui operată într-un singur loc. Pe de altă parte, stilurile externe ajută la micșorarea ca marime a documentelor HTML, care astfel se incarcă mai repede.

Pentru a referi un fișier extern CSS într- un document HTML, se adaugă în secțiunea <head></head> a documentului care va folosi acel fișier cu stiluri, următoarea comandă:

<link href="fisier.css" rel="stylesheet" type="text/css">, unde valoarea lui "href" reprezintă calea și numele fisierului css folosit.

Clasele CSS se utilizează pentru stilizarea în mod diferențiat a unor tag-uri HTML (distribuite în una sau mai multe pagini WEB). Acestea se definesc într-un fișier extern css, numele claselor fiind precedat fie de semnul „.”, fie de semnul „#”. Apelul unei clase CSS se face în tag-ul asupra căruia se dorește ca ea să acționeze. În cazul în care clasa este definită în fișierul extern printr-un nume precedat de caracterul „.”, apelul ei se va face folosind sintaxa class=”nume_clasa”. În cazul în care clasa este definită printr-un nume precedat de caracterul „#”, apelul ei se va face folosind sintaxa id=”nume_clasa”.

Din punct de vedere al apelului lor în cadrul tag-urilor, utilizarea claselor CSS este similară cu utilizarea stilurilor în linie, avantajul major fiind acela că atunci când se dorește efectuarea unei modificări de stil pe mai multe elemente/pagini, aceasta nu trebuie efectuată individual la nivelul fiecărui element, ci doar în clasa respectivă definită in fisierul css extern. Efectul acestei modificări se va răsfrânge asupra tuturor elementelor pe care acționează clasa respectivă.

În situația în care, pentru formatarea unui element HTML al paginii WEB, se folosesc în același timp, mai multe metode CSS, acestea se vor executa în cascada, în urmatoarea ordine: prioritate au stilurile în linie, apoi stilurile interne, iar în final, stilurile externe. Cu alte cuvinte, stilul în linie al unui element suprascrie stilul intern, definit în sectiunea <head></head>, sau stilul extern, definit într-un fișier extern.

Javascript

JavaScript este un limbaj de programare orientat obiect bazat pe conceptul prototipurilor.

<html>

<body><body>

<script type=”text/javascript”><script type=”text/javascript”>

Document.write(“this is my first JavaScript!”); document write(“This is JavaScript prima mea!”);

</script></script>

</body></body>

</html></html>

Este folosit mai ales pentru introducerea unor funcționalități în paginile web, codul Javascript din aceste pagini fiind rulat de către browser. Limbajul este binecunoscut pentru folosirea sa în construirea siturilor web, dar este folosit și pentru acesul la obiecte încastrate (embedded objects) în alte aplicații.

În ciuda numelui și a unor similarități în sintaxă, între JavaScript și limbajul Java nu există nicio legătură. Ca și Java, JavaScript are o sintaxă apropiată de cea a limbajului C, dar are mai multe în comun cu limbajul Self decât cu Java.

Cea mai des întâlnită utilizare a JavaScript este în scriptarea paginilor web. Programatorii web pot îngloba în paginile HTML script-uri pentru diverse activități cum ar fi verificarea datelor introduse de utilizatori sau crearea de meniuri și alte efecte animate.

Browserele rețin în memorie o reprezentare a unei pagini web sub forma unui arbore de obiecte și pun la dispoziție aceste obiecte script-urilor JavaScript, care le pot citi și manipula. Arborele de obiecte poartă numele de Document Object Model sau DOM. Există un standard W3C pentru DOM-ul pe care trebuie să îl pună la dispoziție un browser, ceea ce oferă premiza scrierii de script-uri portabile, care să funcționeze pe toate browserele. În practică, însă, standardul W3C pentru DOM este incomplet implementat. Deși tendința browserelor este de a se alinia standardului W3C, unele din acestea încă prezintă incompatibilități majore, cum este cazul Internet Explorer.

O tehnică de construire a paginilor web tot mai întâlnită în ultimul timp este AJAX, abreviere de la „Asynchronous JavaScript and XML”. Această tehnică constă în executarea de cereri HTTP în fundal, fără a reîncărca toată pagina web, și actualizarea numai anumitor porțiuni ale paginii prin manipularea DOM-ului paginii. În general se consideră că exista zece aspecte fundamentale ale limbajului JavaScript pe care orice programator în acest limbaj ar trebui să le cunoască :

JavaScript poate fi intrudus în HTML – De obicei codul JavaScript este găzduit în documentele HTML și executat in interiorul lor. Majoritatea obiectelor JavaScript au etichete HTML pe care le reprezintă, astfel încât programul este inclus pe partea de client a limbajului. JavaScript folosește HTML pentru a intra în cadrul de lucru al aplicațiilor pentru web.

JavaScript este dependent de mediu – JavaScript este un limbaj de scriptare; software-ul care rulează de fapt programul este browser-ul web (Firefox, Opera, Netscape Navigator, Internet Explorer, Safari, etc.) Este important să luăm în considerare această dependentă de browser atunci cand utilizăm aplicațiiJavaScript.

JavaScript este un limbaj în totalitate interpretat – codul scriptului va fi interpretat de browser înainte de a fi executat. JavaScript nu necesită compilări sau preprocesări, ci rămâne parte integrantă a documentului HTML. Dezavantajul acestui limbaj este că rularea durează ceva mai mult deoarece comenzile JavaScript vor fi citite de navigatorul Web și procesate atunci când user-ul apelează la acele funcții ( prin completare de formulare, apăsare de butoane, etc). Avantajul principal este faptul că putem mult mai ușor să actualizăm codul sursă.

JavaScript este un limbaj flexibil – în această privință limbajul diferă radical de C++ sau Java. În JavaScript putem declara o variabilă de un anumit tip, sau putem lucra cu o variabilă deși nu-i cunoaștem tipul specificat înainte de rulare .

JavaScript este bazat pe obiecte – JavaScript nu este un limbaj de programare orientat obiect, ca Java, ci mai corect, este "bazat pe obiecte"; modelul de obiect JavaScript este bazat pe instanță și nu pe moștenire.

JavaScript este condus de evenimente – mare parte a codului JavaScript răspunde la evenimente generate de utilizator sau de sistem. Obiectele HTML, cum ar fi butoanele, sunt îmbunătațite pentru a accepta handlere de evenimente.

JavaScript nu este Java – Cele doua limbaje au fost create de companii diferite, motivul denumirii asemănătoare este legat doar de marketing.

JavaScript este multifuncțional – limbajul poate fi folosit într-o multitudine de contexte pentru a rezolva diferite probleme: grafice, matematice, si altele.

JavaScript evoluează – limbajul evoluează, fapt pozitiv care însă poate genera si probleme, programatorii trebuind să verifice permanent ce versiune să folosească pentru ca aplicațiile să poata fi disponibile unui număr cât mai mare de utilizatori de browsere diferite.

JavaScript acoperă contexte diverse – programarea cu acest limbaj este îndreptată mai ales către partea de client, dar putem folosi JavaScript și pentru partea de Server. Codul PHP este executat pe server iar datele de ieșire sunt transmise la navigatorul web.
Codul scriptului JavaScript este executat de browser pe calculatorul utilizatorului.
Combinând aceste două limbaje de programare web, se pot obține scripturi JavaScript dinamice, cu rezultate în funcție de datele primite și procesate de server. Astfel, aceeași pagină de site poate conține un cod JavaScript pentru un utilizator și alt cod JS în cazul altui utilizator.
– Sunt 2 modalități de a combina JavaScript cu PHP ca să se obțină un rezultat dinamic sau personalizat:

1. Prin scrierea întregului script JS în codul PHP si adăugarea acestuia în pagina web cu funcția PHP "echo" (sau "print").

<?php
echo '<script type="text/javascript"> // Cod JS </script>';
?>

2. Prin adăugarea în scriptul JS din codul HTML doar a variabilelor PHP necesare scriptului JavaScript (returnând valoarea cu "echo").

<script type="text/javascript">
var var_js = <?php echo $var_php; ?>;
</script>

Java Script are trei obiecte buttons: Button, Submit și Reset. Fiecare din ele are o reprezentare a unei etichete HTML.

1. Obiectul Button
Obiectul Button este un buton generic, la care, pentru a fi folosit pentru o anumită funcție, trebuie să-i adăugăm linii de cod specifice, dar celelalte doup: Submit (trimite datele la un script) și Reset (șterge datele noi completate în formular); au scopuri specifice. Totuși, se poate să folosim un obiect "Button" pentru a avea același rol ca și obiectul "Submit" (apelând Form.submit()), sau ca obiect "Reset" (apelând Form.reset()). 
Proprietăți ale obiectului "Button" sunt următoarele :

form – returnează obiectul Form al carui membru este butonul 
name – returnează șirul specificat în atributul name al etichetei HTML <input> 
type – returnează șirul specificat în atributul type al etichetei HTML <input> 
value – returnează șirul care apare în reprezentarea grafica a unui buton, afișată în browser

Metode ale obiectului “Button” sunt următoarele:

blur() – dezactivează butonul 
click() – apelează un eveniment click pentru butonul respectiv. 
focus() – eveniment de activare a butonului 
handle Event() – transferă un eveniment handlerului de eveniment corespunzător

2. Obiectul Checkbox

Acest obiect reprezintă caseta de validare HTML dintr-un "Form", care permite vizitatorului să specifice o valoare "DA" sau "NU", ori "true" sau "false". 

Proprietăți ale obiectului "Checkbox" sunt următoarele :

checked – returnează o valoare booleană care determină dacă este bifată caseta de validare 
defaultChecked – returnează o valoare booleană care păstrează starea inițială a casetei de validare. Este stabilită cu atributul "checked" 
form – returnează obiectul Form al casetei de validare 
name – returnează șirul specificat în atributul name al etichetei HTML <input> 
type – returnează șirul specificat în atributul type al etichetei HTML <input> 
value – returnează o valoare returnată când formularul este înaintat

Metode ale obiectului “Checkbox” sunt următoarele:

blur() – dezactivează casetă de validare 
click() – apelează un eveniment click pentru caseta de validare respectivă. 
focus() – eveniment de activare a casetei de validare. 
handle Event() – transferă un eveniment handlerului de eveniment corespunzător

3. Obiectul FileUpload

Acest obiect este echivalentul elementului folosit pentru încărcarea fișierelor. 
Cu Java Script nu se poate face prea multe cu acest obiect decât făcând referire la proprietățile sale. 
Proprietăți ale obiectului "FileUpload" sunt următoarele :

form – face referire la obiectul Form ce conține caseta FileUpload 
name – conține șirul specificat în atributul name al casetei FileUpload 
type – conține șirul specificat în atributul type al casetei FileUpload 
value – conține șirul care specifica numele căii fișierului pentru upload

Metode ale obiectului “Fileupload” sunt următoarele:

blur() – dezactivează caseta FileUpload 
focus() – activează caseta FileUpload 
handle Event() – transferă un eveniment handlerului de eveniment corespunzător 
select() – selectează suprafața de adăugare a datelor pentru caseta FileUpload.

4. Obiectul Hidden

Acest obiect se foloșeste pentru stocarea anumitor date care vor fi transferate unei prelucrări pe server. Datele stocate în obiectul "hidden" sunt ascunse, nu apar vzibile in browser.

Proprietăți ale obiectului "Hidden" sunt următoarele :

form – face referire la formularul ce conține obiectul Hidden 
name – conține numele obiectului Hidden 
type – conține șirul specificat în atributul type al casetei Hidden 
value – conține șirul specificat în atributul "value" al obiectului Hidden

5. Obiectul Password

Obiectul password este asemănător cu obiectul "text", diferența fiind ca toate caracterele introduse în caseta "Password" sunt afișate cu "*" pentru a nu se vedea textul introdus. 

Proprietăți ale obiectului "Password" sunt următoarele :

defaultValue – face referire la atributul "value" al casetei pentru parola din formularul HTML 
form – face referire la obiectul Form ce conține caseta pentru parolă 
name – conține șirul specificat în atributul name pentru parolă 
type – conține șirul specificat în atributul type al casetei pentru parolă 
value – face referire la conținutul curent din caseta pentru parolă

Metode ale obiectului “Password” sunt următoarele:

blur() – dezactivează caseta pentru parolă
focus() – activează caseta pentru parolă
handle Event() – transferă un eveniment handlerului de eveniment corespunzător 
select() – selectează textul adaugat in caseta pentru parolă

jQuery

jQuery este o platformă de dezvoltare JavaScript, concepută pentru a ușura și îmbunătăți procese precum traversarea arborelui DOM în HTML, managementul inter-browser al evenimentelor, animații și cereri tip AJAX. jQuery a fost gândit să fie cât mai mic posibil, disponibil în toate versiunile de browsere importante existente, și să respecte filosofia "Unobtrusive JavaScript". Librăria a fost lansată in 2006 de către John Resig.

jQuery se poate folosi pentru a rezolva următoarele probleme specifice programării web:

selecții de elemente în arborele DOM folosind propriul motor de selecții open source Sizzle, un proiect născut din jQuery [2]

parcurgere și modificarea arborelui DOM (incluzând suport pentru selectori CSS 3 și XPath simpli)

înregistrarea și modificarea evenimentelor din browser

manipularea elementelor CSS

efecte și animații

cereri tip AJAX

extensii ( vezi mai jos )

utilităti – versiunea browser-ului, funcția each.

Plugin-urile sau extensiile sunt unele dintre cele mai interesante aspecte ale jQuery. Arhitectura sa permite programatorilor să dezvolte subaplicații bazate în librăria principală care extind funcțiile de bază jQuery cu funcții specifice plugin-ului. În acest fel libraria principală poate ocupa foarte puțin spațiu, iar extensiile necesare în anumite pagini web pot fi încarcate la cerere, doar când este nevoie de ele. Există un set de extensii principal numit jQuery UI( jQuery User Interface). jQuery UI ofera un set de extensii pentru interactivitate de bază, efecte mai complexe decât cele din libraria de bază și teme de culori. Avantajul jQuery UI față de alte extensii este că dezvoltarea și testarea acestor componente se face în paralel cu dezvoltarea librarie principale, minimizând riscul de incomptibilitate.

Orice programator poate crea o extensie și jQuery oferă publicare în catalogul de pe pagina proiectului în diversele categorii disponibile

Xampp Server

WAMP este o unealtă pentru instalare Apache, MySQL database, PHPmyadmin în computer. "WAMP" este un acronim format din inițialele sistemului de operare (Windows) și pachetul de componente principale: Apache, MySQL si PHP (sau Perl sau Python).

WampServer v3.2.1 [7/5/2013] include :

Apache

MySQL

Tot din acest meniu se pot accesa, prin intremediu unui browser de internet, component PhpMyAdmin.

Avantajele utilizării internet banking-ului

Utilizarea unui serviciu de internet banking are două avantaje majore:

câștigi timp prețios – Efectuezi tranzacții bancare din fața computerului la orice oră din zi și din noapte, fără să mai depinzi de programul de lucru al băncii, iar tranzacțiile vor fi procesate la fel ca și cele obișnuite.

ai comisioane mai mici – Aproape toate băncile percep comisioane mai mici la utilizarea internet banking-ului decât pentru operațiunile similare efectuate la ghișeu

CAPITOLUL 3

Descrierea aplicației

Pentru a accesa aplicația se deschide un browser și se introduce în câmpul url-ului : http://localhost/internetbanking/, după aceasta se apasă tasta ENTER. Dupa încărcarea intregii pagini aplicația ne v-a duce către pagina principală ( pagina pentru autentificare / înregistrare a unui nou cont, acesta urmând a ne fii folositor pentru autentificare).

Aplicația, conferă o interfață simplă, intuitivă și ușor de utilizat pentru oricine dorește, caută sau oferă servicii pentru cont bancar cu detaliile oferite . Crearea unui cont, gestionarea acestuia sau administrarea unei tranzacții sunt la doar câteva clicuri distanță.

Considerând că în momentul de față nu deținem niciun cont pentru aplicația de față, o să creăm prima data un cont.

Crearea acestuia se face dând click pe „Creaza un cont” sau apelând direct http://localhost/internetbanking/register.

Accesând pagina , aplicația ne va redirecționa către un formular de înregistrare.

Datele necesare formularului și validarea acestuia se face prin tipărirea în fiecare câmp afișat a informațiilor deținute de către utilizator, respectiv Email, Numele, Prenumele, Parolă și retipărirea acesteia ca și o metodă de precauție pentru a ne asigura că parola tipărită este ceea ce utilizatorul o dorește și nu s-a întâmplat o eroare omeneasca in scrierea acesteia.

Dupa tipăririrea tuturor câmpurilor si după acceptarea termenilor si condițiilor, se apasă pe „creaza cont”. Apăsând acest buton, toate informațiile se vor trimite către server pentru validare, validarea reprezentând verificarea tuturor câmpurilor scrise, precum și verificarea unicitații câmpului email cât si asemanarea ce trebuie sa fie 100% între parola si parola rescrisă.

Dacă validarea a eșuat ( un câmp a fost lăsat necompletat ) sau orice altă verificare făcuta ce a rezultat în invaliditatea informațiilor trimise vor da un mesaj de eroare pentru reverificarea câmpurilor.

Daca totuși datele trimise au fost valide , un cont cu detaliile oferite a fost făcut, și utilizatorul a fost redirecționat și logat(autentificat) în același timp în aplicație.

Aceasta este pagina de Home ( cunoscută și de pagină principală – pagină de după autentificare)

Aplicația este structurată în 3 parti.( Header, Left Menu, Content)

Header-ul este partea aplicației unde se află logo-ul aplicației.

Left Menu – meniul din stânga ce conține toate link-urile necesare navigării și locul unde vom găsii toate link-urile necesare și folosite în aplicație.

Content – locul unde conținutul fiecărui link v-a fi încărcat și afișat.

Model-View-Controller

PHP MVC este o aplicatie Web open-source care implementează modelul Model-View Controller (MVC).

Pattern-ul Model-View-Controller (MVC) separă o aplicație in trei componente principale:

M: model (Model). Modelul conține o mulțime de clase ce constituie datele cu care se lucrează și regulile de interacțiune ale acestora.

V: vizualizare (View User Interface). View definește cum va arăta interfața aplicației.

C: controler (Controller). Controller-ul conține o mulțime de clase ce gestionează comunicația de la utilizator și logica specifică aplicației.

În PHP MVC acesta este translatat astfel:

Model: Conține clase ce reprezintă domeniul aplicației. Aceste obiecte încapsulează adesea date memorate într-o bază de date precum și cod folosit pentru a manipula datele și a executa acțiuni specifice logicii aplicației.

View: View este un template pentru a genera în mod dinamic HTML.

Controller: Controller este o clasa specială ce gestionează relațiile dintre View si Model. Controller-ul raspunde la acțiunile utilizatorului, comunică cu modelul și decide ce vizualizare va afișa (daca există una).

Structura unei aplicații PHP MVC

Director Scop

/Includes/Pages/ Conține clasele pentru Controller ce gestionează cererile URL

/includes/classes/ Conține clasele ce reprezintă datele modelului, gestionarea acestor obiecte.

/views/ Conține fișiere template UI responsabile pentru afișarea rezultatului.

/assets/js/ Conține biblioteci JavaScript și scripturi (.js).

/assets/img/ Conține imaginile folosite în cadrul aplicației.

/assets/css/ Putem pune CSS sau alt conținut dar nu scripturi și/sau imagini.

Prezentarea componentelor

Header-ul : această componentă este prima încărcată în accesarea paginii și conține logo-ul principal al aplicației, logo ce reprezintă visual aplicația pe internet.

Left Meniu : așa cum am spus anterior conține toate link-urile folosibile din aplicație, link-uri ce oferă diferite detalii sau posibilitatea diferitelor acțiunii posibile în aplicație.

Home (sau pagină principală )

Conține toate detaliile bancare ale utilizatorului, precum totalitatea conturilor acestuia cât și sumele aferente acestor conturi. La „Total Funds” avem totalitatea fondurilor grupate per tipul contului, aplicația permite în momentul de față doar conturi de „RON/EUR” , posibilitatea adaugării mai multor tipuri putându-se a se face manual din baza de date.

Messages 0 – reprezintă numărul de mesaje necitite pe care utilizatorul le-a primit de la sistem, aceste mesaje sunt mesaje informative referitoare la diferite reguli sau termeni modificate, depozite noi apărute.

Open Account

Ne permite deschiderea unui cont, acesta putând fi de 2 tipuri, EUR sau RON.

Dupa selectarea tipului contului apăsând „Create Account” , contul de tipul selectat v-a fi creat. Acesta putând fi văzut in pagina „Home”.

Ca orice nou cont create, balanța acestuia v-a fi de 0.

Make payment

Această pagină conține un formular prin care putem face o anumită plată către un alt cont ( al nostru , al unei alte persoane). Pentru validarea formularului trebuiesc completate toate câmpurile afișate în formular precum ( Suma,Contul,Numele beneficiarului,Detaliile,Plății ) ce reprezintă această plată și ca motiv de securitate retipărirea parolei contului utilizatorului.

Retipărirea parolei a fost introdusă pentru a proteja utilizatorii de diferite autentificări din diferite locuri, și uitarea delogării acestuia din acel loc. Orice faptă frauduloasă de a încerca trimiterea anumitor fonduri din contul autentificatului către contul personal făra știrea acestuia neputând fi validată și trimisă către sistem deoarece persoana doritoare de acțiunile frauduloase nu v-a știi parola utilizatorului.

În momentul în care toate datele sunt completate, și acționați butonul „Send Payment” , acțiunea de plată a fost trimisă către server, server-ul validând datele introduse și dacă toate aceste date sunt valide, contul utilizatorului este creditat de suma plătită iar contul beneficiarului este debitat cu această sumă.

În cazul unei erori de validarea a datelor completate și trimise sistemul v-a returna un mesaj de eroare, mesajul de eroare se v-a afișa și în momentul în care se dorește o plată cu o suma mai mare decât balanța curentă din contul selectat.

My Details

În timpul înregistrării unui cont utilizatorului nu i se cer datele personale precum numărul de telefon, adresa, județ, oraș, codul poștal , etc. Aceste date pot fi atașate contului în pagina „My Details”.

Această pagină conține formularul pentru editarea datelor personale ( enumerate mai sus ). Pentru modificarea/updatarea acestor date, toate câmpurile trebuiesc completate ( câmpurile ce au deja o valoare în baza de date( bd ) sunt autocompletate cu cele din bd.

Dupa apăsarea butonului „confirm changes” , toate datele sunt transmise pentru validare pe server. Dacă validarea acestuia se realizează cu success, datele vor fi salvate contului utilizatorului.

County ( Județ ) – este un field ce are o acțiune javascript atașată schimbării acestuia, în momentul în care dorim să schimbăm adresa de domiciliu, apăsam pe county, o acțiune javascript se apelează făcând un apel AJAX către un script de pe server, script ce returnează orașele din acel județ în format json, acest json fiind apoi parcurs în javascript și afișat în select-ul pentru orașe ce este într-un div ascuns momentan.

Pentru validarea acestor informații se cere precum la pagina make payment reintroducerea parolei contului din motive de siguranță. Dacă parola nu este introdusă sau este introdusă greșit datele nu vor fi salvate contului aferent.

Calculator

Este un calculator pentru un posibil credit pe care utilizatorul l-ar putea cere. La acest calculator putem verifica posibilitatea de acordare a unui credit bazat pe suma dorită, salariu net, perioada de creditare, numărul membrilor familiei și faptul dacă utilizatorul mai are vreun alt credit luat.

Toate aceste field-uri în urma modificărilor sunt acționate prin javascript , ca la fiecare număr introdus pe oricare dintre field-uri ( input-uri ) o funcție javascript este apelată si calculează automat toate datele dorite a fi afișate și a fi aflate de către utilizator instant.

Exemplu pentru o suma dorită de 25000 lei, un venit de 1700 lei net/luna , o perioada de rambursare a creditului de 5 ani se poate acorda un credit de maximum 26235.10 lei ce este mai mult decât se dorește. Dobânda este de 11.64%, rata lunară fixă este de 544.31 lei și suma totală platită după toată perioada de 5 ani este de 32658.54 lei deci se plătește un plus de 7658.54 lei față de suma solicitată de 25000.

Reports

Pagina la fel ca în denumire se explică singură, aici putem face / scoate diferite rapoarte specifice conturilor utilizatorului în funcție de perioada aleasă. Raportul aferent contului poate fi scos pentru o perioadă de ( 1 zi , 3 zile, 1 saptămână, 1 lună, mereu ). Această perioadă aleasă specifică dorința utilizatorului de a vedea detaliile acțiunilor făcute pe contul selectat.

Exemplu : Dacă dorim să afișăm toate tranzacțiile făcute de pe / către contul selectat în urmă cu 1 lună, selectăm contul, la „Date” selectăm -1month- si apăsam „Get Report”.

În urma apăsării butonului, serverul primește informația și face căutarea în baza de date. Dacă pentru perioada aleasă nu există niciun raport un mesaj v-a fi afișat.

Messages

Această pagină conține totalitatea mesajelor de la sistem trimise către utilizator pentru citire.Daca nu avem niciun mesaj trimis de către sistem, pagina de mesaje arată așa.

Capitolul 4

Implementarea aplicației

Aplicația a fost realizată folosiind tehnologii precum : php, mysql, html, css, javascript, ajax ,json si smarty template engine.

Php-ul a fost folosit pentru a realiza partea de back-end , partea de server, logica din spatele aplicației și tot ce ține de verificarea și validarea informației.

Mysql-ul a fost folosit pentru stocarea tuturor informațiilor referitoare la conturi, la detaliile utilizatorilor, mesajele, tranzacțiile.

HTML, CSS – cu aceste tehnologii am realizat tot ce ține de partea vizuală a aplicației.

Javascript-ul a fost folosit pentru diferitele acțiuni asupra anumitor butoane din aplicație

Ajax – din dorința de a apela anumite funcții fară a se face refresh la pagină ( în pagina my details s-a realizat apelul ajax pentru returnarea tuturor orașelor specifice unui județ). Acestea au fost transmise înapoi la javascript printr-un json ce a conținut totalitatea orașelor.

Exemplu : La selectarea județului „Bacău” json-ul primit arată în felul următor :

{"cities":{"443":"Ag\u0103\u0219","482":"Albele","624":"Antohe\u0219ti","454":"Apa As\u0103u","451":"Ardeoani","585":"Arini","453":"As\u0103u","391":"Bac\u0103u","525":"B\u0103cioiu","655":"B\u00e2cle\u0219ti","723":"Bahna","728":"B\u0103hn\u0103\u0219eni","625":"B\u0103imac","569":"B\u0103laia","638":"B\u0103l\u0103neasa","745":"B\u0103l\u0103ne\u0219ti","548":"B\u0103l\u0103ne\u0219ti","532":"B\u00e2lca","459":"Balcani","833":"Balote\u0219ti","675":"B\u0103l\u021bata","819":"B\u0103lu\u0219a","547":"Banca","405":"Bara\u021bi","688":"B\u0103rboasa","772":"Barcana","706":"Barna","729":"B\u0103rne\u0219ti","481":"B\u00e2rs\u0103ne\u0219ti","868":"B\u0103rt\u0103\u0219e\u0219ti","800":"B\u00e2rzule\u0219ti","730":"B\u0103s\u0103\u0219ti","608":"Bazga","834":"Belciuneasa","444":"Beleghet","835":"Bene\u0219ti","820":"Berbinceni","793":"Bere\u0219ti","463":"Bere\u0219ti-Bistri\u021ba","471":"Bere\u0219ti-Tazl\u0103u","478":"Berzun\u021bi","869":"Bibire\u0219ti","499":"Bijghir","549":"Blaga","485":"Bl\u0103ge\u0219ti","506":"Blidari","577":"Boan\u021ba","550":"Bobo\u0219","551":"Bodeasa","561":"Bogata","807":"Bogdan Vod\u0103","422":"Bogdana","862":"Bogd\u0103ne\u0219ti","813":"Bogd\u0103ne\u0219ti","490":"Bogd\u0103ne\u0219ti","507":"Boi\u0219tea","533":"Boi\u0219tea de Jos","899":"Bol\u0103t\u0103u","589":"Bolov\u0103ni\u0219","534":"Bor\u0219ani","413":"Borze\u0219ti","883":"Bosia","472":"Bo\u0219oteni","552":"Bost\u0103ne\u0219ti","870":"Bota","871":"Bote\u0219ti","570":"Brad","669":"Brad","464":"Brad","483":"Br\u0103te\u0219ti","604":"Br\u0103tila","492":"Brusturoasa","676":"Buchila","423":"Buciumi","773":"Buc\u0219a","755":"Buc\u0219e\u0219ti","479":"Buda","774":"Buda","486":"Buda","736":"Bude\u0219ti","500":"Buhocel","498":"Buhoci","429":"Buhu\u0219i","775":"Burdusaci","493":"Buruieni\u0219","494":"Buruieni\u0219u de Sus","746":"C\u0103be\u0219ti","697":"C\u0103d\u0103re\u0219ti","505":"C\u0103iu\u021bi","553":"Calapode\u0219ti","682":"C\u0103lc\u00e2i","670":"C\u0103line\u0219ti","518":"C\u0103lini","537":"C\u0103lug\u0103reni","495":"Camenca","731":"C\u00e2mpeni","416":"Cap\u0103ta","617":"C\u0103pote\u0219ti","484":"Caracl\u0103u","578":"C\u00e2rligi","503":"Ca\u0219in","554":"C\u0103uia","438":"Cerdac","756":"Cernu","842":"Cet\u0103\u021buia","656":"Chetreni","848":"Chetri\u0219","657":"Chicerea","715":"Chilia Benei","821":"Chiticeni","455":"Ciob\u0103nu\u0219","439":"Cire\u0219oaia","766":"Ciucani","698":"Ciughe\u0219","465":"Ciuma\u0219i","822":"Ciuture\u0219ti","514":"Cleja","466":"Clime\u0219ti","658":"Cociu","517":"Colone\u0219ti","801":"Coman","432":"Com\u0103ne\u0219ti","794":"Con\u021be\u0219ti","524":"Corbasca","876":"Corn\u0103\u021bel","659":"Corn\u0103\u021belu","579":"Corne\u0219ti","757":"Cornet","852":"Cornii de Jos","853":"Cornii de Sus","445":"Co\u0219nea","808":"Costei","501":"Coteni","531":"Co\u021bof\u0103ne\u0219ti","580":"Cotu Grosului","446":"Cotumba","836":"Cr\u0103ie\u0219ti","401":"Crihan","496":"Cuchini\u0219","881":"Cucova","562":"Cucuie\u021bi","830":"Cucuie\u021bi","504":"Curi\u021ba","884":"D\u0103de\u0219ti","536":"D\u0103miene\u0219ti","776":"D\u0103n\u0103ila","541":"D\u0103rm\u0103neasca","540":"D\u0103rm\u0103ne\u0219ti","546":"Dealu Morii","689":"Dealu Perjului","402":"Dealu-Mare","605":"Deleni","447":"Diacone\u0219ti","716":"Diene\u021b","560":"Dofteana","885":"Dorneni","737":"Dorneni","555":"Dorofei","502":"Dospine\u0219ti","854":"Dr\u0103ge\u0219ti","538":"Dr\u0103ge\u0219ti","480":"Dragomir","606":"Dr\u0103guge\u0219ti","702":"Dr\u0103gu\u0219ani","417":"Dumbrava","467":"Dumbrava","777":"Dumbrava","473":"En\u0103che\u0219ti","588":"F\u0103get","468":"F\u0103ge\u021bel","590":"F\u0103getu de Sus","626":"F\u0103ghieni","393":"F\u00e2nt\u00e2nele","660":"F\u00e2nt\u00e2nele","567":"Faraoani","778":"Farca\u0219a","683":"Ferestr\u0103u-Oituz","747":"Fichite\u0219ti","568":"Filipeni","576":"Filipe\u0219ti","491":"Filipe\u0219ti","618":"Flore\u0219ti","508":"Flore\u0219ti","814":"Flore\u0219ti","460":"Frumoasa","599":"Frumu\u0219elu","571":"Frunte\u0219ti","717":"Fulgeri\u0219","661":"Fund\u0103tura","779":"Fund\u0103tura R\u0103chitoasa","823":"Fundeni","619":"Fundoaia","767":"Fundu R\u0103c\u0103ciuni","738":"Fundu Tutovei","718":"Fundu V\u0103ii","849":"Furnicari","584":"G\u0103iceana","677":"Galbeni","581":"Galbeni","609":"Galeri","872":"G\u00e2rla Anei","595":"G\u00e2rleni","594":"G\u00e2rlenii de Sus","769":"G\u00e2\u0219teni","436":"G\u0103z\u0103rie","768":"Gheorghe Doja","855":"Gherdana","886":"Ghil\u0103ve\u0219ti","591":"Ghime\u0219","556":"Ghionoaia","850":"Gioseni","856":"Giurgeni","748":"Giurgioana","598":"Gl\u0103v\u0103ne\u0219ti","824":"Glodi\u0219oarele","887":"Godine\u0219tii de Jos","888":"Godine\u0219tii de Sus","448":"Goioasa","837":"Gorghe\u0219ti","557":"Gr\u0103de\u0219ti","815":"Grigoreni","662":"Gura Cr\u0103ie\u0219ti","762":"Gura V\u0103ii","415":"Gura V\u0103ii","424":"Gutina\u0219","780":"H\u0103ghiac","563":"H\u0103ghiac","732":"H\u00e2ineala","763":"H\u0103lm\u0103cioaia","497":"H\u00e2ng\u0103ne\u0219ti","749":"Han\u021ba","684":"H\u00e2rja","582":"H\u00e2rle\u0219ti","603":"Helegiu","509":"Heltiu","392":"Hemeiu\u0219","900":"Hemieni","863":"Hertioana de Jos","864":"Hertioana-R\u0103ze\u0219i","396":"Holt","607":"Horge\u0219ti","616":"Huruie\u0219ti","586":"Hu\u021bu","843":"Iaz","764":"Ilie\u0219i","739":"I\u021bcani","469":"Ite\u0219ti","623":"Izvoru Berheciului","542":"L\u0103po\u0219","564":"Larga","678":"L\u0103rgu\u021ba","750":"Lehancea","452":"Leontine\u0219ti","596":"Lespezi","395":"Letea Veche","882":"Lichiti\u0219eni","394":"Lilieci","630":"Lipova","637":"Livezi","461":"Luda\u0219i","643":"Luizi-C\u0103lug\u0103ra","456":"Lunca As\u0103u","877":"Lunca Dochiei","406":"Luncani","651":"Lupe\u0219ti","781":"Magazia","645":"M\u0103gire\u0219ti","671":"M\u00e2gla","400":"M\u0103gura","631":"M\u00e2losu","650":"M\u0103n\u0103stirea Ca\u0219in","610":"M\u0103r\u0103scu","572":"M\u0103r\u0103\u0219ti","510":"M\u0103rce\u0219ti","685":"Marginea","430":"Marginea","404":"M\u0103rgineni","526":"Marvila","802":"Mateie\u0219ti","889":"Medeleni","707":"Mile\u0219tii de Jos","708":"Mile\u0219tii de Sus","787":"Misih\u0103ne\u0219ti","435":"Moine\u0219ti","719":"Motoc","418":"Motoce\u0219ti","654":"Moto\u0219eni","782":"Movili\u021ba","600":"Muncelu","844":"Nadi\u0219a","709":"N\u0103ne\u0219ti","710":"N\u0103st\u0103seni","890":"N\u0103z\u0103rioaia","425":"Negoie\u0219ti","758":"Negreni","668":"Negri","558":"Negule\u0219ti","788":"Negu\u0219eni","674":"Nicolae B\u0103lcescu","724":"Nicore\u0219ti","627":"Ob\u00e2r\u0219ia","620":"Ocheni","825":"Odobe\u0219ti","681":"Oituz","687":"Once\u0219ti","690":"Once\u0219tii Vechi","412":"One\u0219ti","583":"Oni\u0219cani","783":"Opri\u0219e\u0219ti","639":"Or\u0103\u0219a","694":"Orbeni","644":"Osebi\u021bi","628":"O\u021bele\u0219ti","629":"P\u0103dureni","539":"P\u0103dureni","470":"P\u0103dureni","573":"P\u0103dureni","407":"P\u0103dureni","543":"P\u0103gubeni","699":"Paji\u0219tea","696":"Palanca","419":"P\u0103ltinata","457":"P\u0103ltini\u0219","714":"P\u00e2nce\u0219ti","795":"P\u0103nce\u0219ti","725":"P\u00e2r\u00e2u Boghii","701":"Parava","722":"P\u00e2rg\u0103re\u0219ti","705":"Parincea","727":"P\u00e2rjol","652":"P\u00e2rvule\u0219ti","621":"Perchiu","720":"Petre\u0219ti","845":"Petricica","735":"Plopana","751":"Plopu","544":"Plopu","433":"Podei","408":"Podi\u0219","744":"Podu Turcului","754":"Poduri","527":"Pogle\u021b","672":"Poiana","663":"Poiana","519":"Poiana","409":"Poiana","640":"Poiana","487":"Poiana Negustorului","686":"Poiana S\u0103rat\u0103","441":"Poieni","711":"Poieni","789":"Poieni","511":"Popeni","587":"Pope\u0219ti","700":"Popoiu","622":"Pr\u0103dai\u0219","664":"Praja","865":"Pr\u0103je\u0219ti","646":"Pr\u0103je\u0219ti","641":"Prajoaia","512":"Pralea","449":"Preluci","474":"Prisaca","759":"Prohoze\u0219ti","733":"Pustiana","784":"Putini","601":"Putredeni","765":"R\u0103c\u0103ciuni","612":"R\u0103c\u0103t\u0103u de Jos","611":"R\u0103c\u0103t\u0103u-R\u0103ze\u0219i","426":"R\u0103c\u0103u\u021bi","592":"R\u0103chiti\u0219","846":"R\u0103chiti\u0219u","771":"R\u0103chitoasa","761":"Racova","752":"R\u0103cu\u0219ana","427":"R\u0103deana","703":"R\u0103doaia","397":"Radomire\u0219ti","770":"R\u0103stoaca","602":"R\u0103ze\u0219u","613":"Recea","891":"Repriv\u0103\u021b","528":"Rogoaza","475":"Rom\u00e2ne\u0219ti","786":"Ro\u0219iori","665":"Rot\u0103ria","431":"Runcu","741":"Rusenii de Sus","740":"Rusenii R\u0103ze\u0219i","398":"Ru\u0219i-Ciutea","545":"S\u0103l\u0103truc","799":"S\u0103nduleni","831":"S\u0103rata","679":"S\u0103rata","753":"S\u00e2rbi","792":"Sascut","796":"Sascut-Sat","691":"Satu Nou","520":"Satu Nou","632":"Satu Nou","726":"Satu Nou","878":"Satu Nou","712":"Satu Nou","806":"S\u0103uce\u0219ti","642":"Sc\u0103riga","529":"Sc\u0103ri\u0219oara","809":"Schineni","797":"Schineni","462":"Schitu Frumoasa","812":"Scor\u021beni","695":"Scurta","653":"Scutaru","565":"Seaca","818":"Secuieni","666":"\u0218endre\u0219ti","811":"\u0218erbe\u0219ti","817":"\u0218erpeni","648":"\u0218esuri","810":"Siretu","399":"Siretu","437":"Sl\u0103nic-Moldova","574":"Slobozia","414":"Slobozia","879":"Slobozia","838":"Slobozia","839":"Slobozia Nou\u0103","721":"Soci","403":"Sohodol","614":"Sohodor","829":"Solon\u021b","515":"Somu\u0219ca","521":"Spria","647":"St\u0103ne\u0219ti","832":"St\u0103ni\u0219e\u0219ti","421":"\u0218tefan cel Mare","566":"\u0218tefan Vod\u0103","816":"Stejaru","458":"Straja","742":"Str\u0103minoasa","841":"Strugari","803":"Stufu","450":"Sul\u021ba","597":"\u0218urina","743":"\u021a\u00e2g\u00e2ra","847":"Tama\u0219i","535":"T\u0103m\u0103\u0219oaia","734":"T\u0103r\u00e2\u021ba","488":"\u021a\u00e2rdenii Mari","440":"T\u00e2rgu Ocna","858":"T\u00e2rgu Trotu\u0219","593":"T\u0103rh\u0103u\u0219i","692":"Tarni\u021ba","851":"T\u0103t\u0103r\u0103\u0219ti","693":"Taula","559":"T\u0103v\u0103d\u0103re\u0219ti","704":"Teiu\u0219","420":"Temelia","667":"\u021aepoaia","476":"Tescani","893":"\u021aig\u0103ne\u0219ti","804":"Tisa","826":"Tisa-Silvestri","785":"Tochilea","892":"Tomozia","861":"Traian","410":"Trebe\u0219","477":"Turluianu","859":"Tuta","857":"Ungureni","867":"Ungureni","875":"Ureche\u0219ti","673":"Ursoaia","530":"V\u00e2lcele","442":"V\u00e2lcele","649":"Valea Arinilor","575":"Valea Bo\u021bului","411":"Valea Budului","633":"Valea Caselor","827":"Valea F\u00e2na\u021bului","634":"Valea Hogei","489":"Valea lui Ion","894":"Valea Lupului","522":"Valea Mare","790":"Valea Mare","635":"Valea M\u0103rului","895":"Valea Merilor","516":"Valea Mic\u0103","791":"Valea Mic\u0103","636":"Valea Mo\u0219neagului","798":"Valea Nacului","896":"Valea Salciei","680":"Valea Seac\u0103","880":"Valea Seac\u0103","760":"Valea \u0218o\u0219ii","840":"V\u0103leni","615":"V\u0103leni","828":"V\u0103leni","434":"Verme\u0219ti","805":"Ver\u0219e\u0219ti","873":"Viforeni","428":"Vii\u0219oara","860":"Vii\u0219oara","713":"Vladnic","513":"Vr\u00e2nceni","897":"Vultureni","523":"Z\u0103podia","866":"Z\u0103podia","898":"Zeme\u0219","874":"Zl\u0103tari"}}

Aceste date sunt apoi parcurse 1 cu 1 și afișate în selectul pentru orașe.

Implementarea bază de date

Db_accounts reține totalitatea conturilor utilizatorilor.

Db_accounttype reține tipul conturilor ( EUR/RON)

Db_city conține totalitatea orașelor din România, poza este truncată deoarece în baza de date avem un total de 14714 orașe.

Db_county conține totalitatea județelor din România

Db_messages este tabela ce cuprinde toate mesajele trimise de către system tuturor utilizatorilor.

Db_sessions cuprinde toate sesiunile curente din aplicație( în urma logării cu success o sesiune se creează pe server și se introduce în db_sessions cu detaliile utilizatorului), user_id are ca valoare id-ul utilizatorului, user_ip ip-ul utilizatorului, user_side primește ca valoare ultimul link accesat de către utilizator și user_lastactivity primește ca valoare timestamp-ul accesării ultimului link.

Db_transactions cuprinde totalitatea tranzacțiilor ce s-au făcut/primit de către conturile utilizatorilor. (fromAccountId – id-ul contului celui ce trimite, toAccountIBAN- IBAN-ul destinatarului, timestamp – timpul când a fost realizată, balance – suma plătită, details – detaliile tranzacției, status – 0/1 (0 dacă a fost plătită, 1 dacă nu a fost plătită).

O tranzacție primește status 1 ( plătită ) dacă destinatarul este un client aceleași instituții bancare ce foloșeste aceeastă aplicație, și primește 0 , tranzacția este pusă în așteptare deoarece server-ul trebuie să trimită tranzacția băncii aferente iban-ului beneficiarului.

Db_users conține totalitatea detaliilor conturilor aferente utilizatorilor precum numele, prenumele , email-ul, parola este encriptată pentru a nu putea fi descifrată dacă vreodată cineva rău intenționat face rost de access la baza de date numarul de telefon, adresa, județul, orașul (pentru ultimele 2, se rețin doar id-urile acestora),cod poștal, timpul când a fost online si ip-ul acestuia.

Baza de date este una relațională cu indexi puși și legături prin chei private.

Implementarea fișierului principal

Toate request-urile se fac prin acest fișier.

Common.php

<?php

define('TIMESTAMP', $_SERVER['REQUEST_TIME']);

#CONFIG, CONSTANTS, GENERAL FUNCTIONS, TEMPLATE

require_once(ROOT_PATH . 'includes/config.php');

require_once(ROOT_PATH . 'includes/constants.php');

require_once(ROOT_PATH . 'includes/GeneralFunctions.php');

require_once(ROOT_PATH. 'includes/classes/class.template.php');

require_once(ROOT_PATH. 'includes/classes/class.Session.php');

require_once(ROOT_PATH. 'includes/classes/class.Abstract.php');

#MYSQL

require_once(ROOT_PATH . 'includes/classes/class.MySQLi.php');

$db = new DB_MySQLi();

unset($database);

#create the view page

$mode = $_REQUEST['mode'];

$mode = ( !empty($mode) ? $mode : 'show');

$page = ( !empty($_GET['view']) ? $_GET['view'] : 'index');

$page = str_replace(array('_', '\\', '/', '.', "\0"), '', $page);

$pageClass = 'Show'.ucfirst($page).'Page';

$path = 'includes/pages/'.$pageClass.'.class.php';

if(!file_exists($path)) {

die('Page doesnt exist');

}

require($path);

if (MODE === 'INSITE'){

$SESSION = new Session();

if(!$SESSION->IsUserLogin())

header('Location: /');

$SESSION->UpdateSession();

$USER= $db->uniquequery("SELECT *FROM db_users where id = (SELECT user_id from db_session where sess_id = '".$_SESSION['token']."') ");

if(empty($USER)) {

header('Location: /');

}

}

$pageObj = new $pageClass;

$pageProps = get_class_vars(get_class($pageObj));

if(!is_callable(array($pageObj, $mode))) {

if(!isset($pageProps['defaultController']) || !is_callable(array($pageObj, $pageProps['defaultController']))) {

die('modul not accesible in the class');

}

$mode = $pageProps['defaultController'];

}

$pageObj->{$mode}();

?>

CAPITOLUL 5

Probleme Întâmpinate

O problemă principală la acest tip de aplicație este aceea de securitate si controlul accesului în interiorul site-ului.

Pentru a prevenii această problema toti parametrii trimiși către formular ( register / login , etc) au toate elementele validate. Această validare se face prin excluderea caracterelor speciale ( -' " \/.,) pentru a prevenii o intruziune a unei inserări/updatari la sql.

Exemplu fară securitatea formularului:

În momentul în care încercăm logarea utilizatorului, facem următorul check în baza de date:

$user = $db->uniquequery("SELECT *FROM db_users where email='".$_POST['email']."' and password = '".md5($_POST['password'])."' ;");

Acest query verifică în tabela db_users existentă unui utilizator cu email-ul trimis în formular și cu parola egală cu md5 ( parametrul pentru parolă trimisă ).

O încercare de sql inject fară a securiza parsarea ar putea fii ca în dreptul field-ului email să trimitem ' OR '1'='1 asta ar însemna că verificarea noastră ar duce catre

SELECT*FROM db_users where email = '' OR '1'='1' and … acest apel ar trece peste orice altă verificare dat fiind faptul că testul logic 1=1 returnează o valoare de adevăr deci acel select ar selecta toți utilizatorii din tabelă.

După verificare folosind tehnica de sql inject nu s-ar mai trece peste verificare fiindcă query-ul nostru ar fi următorul

SELECT*FROM db_users where email='OR 1=1 , ceea ce ar returna o eroare fiindcă field-ul email nu poate să primească doar ' ( o ghilimea ) , rezultatul acestui query final fiind FALSE deci logarea nu s-a realizat cu success.

Concluzii

Alegerea serviciului de internet banking depinde de o multitutidine de factori, plecând de la notorietatea și reputația băncii, continuând cu tipurile de servicii oferite și terminând cu comisioanele percepute. Acces 24/7 online poți efectua tranzacții și noaptea sau în weekend, având astfel acces la informațiile private despre conturile personale, oricând si de oriunde din lume. Totuși din motive tehnice, uneori serviciul poate fi întrerupt pe timpul nopții, pentru o perioadă scurtă de timp.

Dezvoltarea rapidă a capacităților e-bankingului are deopotrivă beneficii și riscuri datorate în special securității rețelelor de transmisie a datelor.

Toate tranzacțiile se realizează în timp real și soldurile conturilor sunt permanent actualizate.

Poți constitui depozite, să faci transferuri între conturi.

Serviciul de Internet banking are astfel marele avantaj că te scutește de drumurile la bancă pentru o gamă diversificată de operațiuni, de la transferuri de bani la servicii de direct debit, plata facturilor, vizualizarea extraselor de cont, constituirea de depozite.

Continuă dezvoltare tehnologică și competiția între organizațiile bancare existente și cele nou înființate, au impulsionat diversificarea produselor și serviciilor bancare, făcându-se accesibile sau fiind distribuite clienților și pe cale electronică. Toate acestea formează așa numitul Internet banking sau pe scurt e-banking.

BIBLIOGRAFIE

Corina Pascu – Totul despre … SQL, Editura Tehnică, București, 1999.

Ileana Popescu – Baze de date relaționale, Editura Univ. București, 1999.

Stephen Wynkoop, Totul despre Microsoft SQL Server 7.0, 2000, Ed. Teora, București.

Ion Lungu, N. Mușat, I. Roșca, Gh. Sabău – Limbajul SQL Plus, Editura ALL, București, 1992.

Robert Dollinger, Lucian Andron, Utilizarea Sistemului SQL SERVER, 2004, Editura Albastă.

Paul DuBOIS (Traducere de Mihai Mănăstireanu), MySQL.

Ene Alexandru Suport curs anul IV Programare Web.

Păun Viorel Suport Curs Anul III Baze de date.

Păun Viorel Suport Curs Anul IV Sisteme avansate de baze de date.

Ghid de Utilizare INTERNET – BANKING

www.mysql.com

https://ro.wikipedia.org

http://www.phpromania.net/info/documentatie

ANEXE

Listing ShowHomePage

<?php

define('MODE', 'INSITE');

class ShowHomePage extends AbstractPage{

function __construct(){

parent::__construct();

}

public function show(){

global $db,$USER;

$accountType = $db->fetchquery("SELECT acc.id, acc.balance,acctype.name as type,acc.iban from db_accounts acc left join db_accounttype acctype on acctype.idtype = acc.account_type where acc.user_id = ".$USER['id']);

$allAccount = $db->fetchquery("SELECT SUM(acc.balance) as balance,acctype.name as type from db_accounts acc left join db_accounttype acctype on acctype.idtype = acc.account_type where acc.user_id = ".$USER['id']." group by acctype.name ");

$getMessages = $db->uniquequery("SELECT COUNT(messageID) as total from db_messages where messagereceiverID = ".$USER['id']." and messageRead=0;");

$this->tplObj->assign_vars(array('accountType' => $accountType,'allAccount' => $allAccount,'messages'=>$getMessages['total']));

$this->tplObj->display('view/default.home.tpl');

}

}

?>

Listing ShowCalculatorPage

<?php

define('MODE', 'INSITE');

class ShowCalculatorPage extends AbstractPage{

function __construct(){

parent::__construct();

}

public function show(){

global $db;

$this->tplObj->display('view/default.calculator.tpl');

}

}

?>

Listing ShowIndexPage

<?php

class ShowIndexPage extends AbstractPage{

function __construct(){

parent::__construct();

}

public function login(){

global $db;

if(empty($_POST)){

die('Error');

}else{

$user = $db->uniquequery("SELECT *FROM db_users where email='".$_POST['email']."' and password = '".md5($_POST['password'])."' ;");

if(!$user){

message("Account not found");

}else{

session_start();

$SESSION = new Session();

$SESSION->CreateSession($user['id']);

redirectTo("home");

}

}

}

public function show(){

$this->tplObj->display('view/default.index.tpl');

}

}

?>

Listing ShowMakepaymentPage

<?php

define('MODE', 'INSITE');

class ShowMakepaymentPage extends AbstractPage{

function __construct(){

parent::__construct();

}

function makepayment(){

global $db, $USER;

if($_POST){

/*

post variables

account: int

amount:int

accountsender: beneficiar iban

beneficiarname: beneficiar name

details: details payment

password: retype password

*/

if(empty($_POST['account']) || empty($_POST['accountsender']) || empty($_POST['amount']) || empty($_POST['beneficiarname']) || empty($_POST['details']) || empty($_POST['password']) ){

$this->tplObj->assign_vars(array('showMessages' => "Please complete all the fields",'type' => 'danger'));

}else{

//further verifications

$accountID = $db->sql_escape($_POST['account']);

$amount = $db->sql_escape($_POST['amount']);

$IBAN = $db->sql_escape("RO".$_POST['accountsender']);

$senderName = $db->sql_escape($_POST['beneficiarname']);

$details = $db->sql_escape($_POST['details']);

$userPass = $db->sql_escape($_POST['password']);

$errors = 0;

$errorsMessages = "\n ";

$userAccounts = $db->uniquequery("SELECT acc.id, acc.balance,acctype.name as type,acc.iban from db_accounts acc left join db_accounttype acctype on acctype.idtype = acc.account_type where acc.user_id = ".$USER['id']." and acc.id=".$accountID);

if(!isset($userAccounts['id'])){

$errors++;

$errorsMessages .= "Invalid Account Selection \n";

}else{

if($amount > $userAccounts['balance']){

$errors++;

$errorsMessages .=" Not enough funds \n";

}

}

//password doesn't match

if(md5($userPass) != $USER['password']){

$errors++;

$errorsMessages .=" Your password does not match \n";

}

if(strlen($IBAN)<16){

$errors++;

$errorsMessages .= "Invalid IBAN account \n";

}

if($amount < 0){

$errors++;

$errorsMessages .= "No negative amounts \n";

}

if($errors == 0){

//we make transfer

$db->query("Update db_accounts set balance = balance – ".$amount." where `id` = ".$userAccounts['id']." ;");

/*

`id` int(11) NOT NULL AUTO_INCREMENT,

`fromAccountId` int(11) NOT NULL,

`toAccountIBAN` text NOT NULL,

`toAccountName` text NOT NULL,

`timestamp` int(11) NOT NULL,

`balance` decimal(10,2) NOT NULL,

`details` text NOT NULL,

`status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0-not sent, 1-sent',

*/

$db->query("INSERT INTO db_transactions(fromAccountId,toAccountIBAN,toAccountName,timestamp,balance,details) VALUES (".$userAccounts['id'].",'".$IBAN."','".$senderName."',".TIMESTAMP.",".$amount.",'".$details."') ;");

$this->tplObj->assign_vars(array('showMessages' => "Transaction has been sent to bank for process",'type'=> 'success'));

}else{

//show errors

$this->tplObj->assign_vars(array('showMessages' => $errorsMessages,'type'=>'danger'));

}

}

}

self::show();

}

public function show(){

global $db,$USER;

$userAccounts = $db->fetchquery("SELECT acc.id, acc.balance,acctype.name as type,acc.iban from db_accounts acc left join db_accounttype acctype on acctype.idtype = acc.account_type where acc.user_id = ".$USER['id']);

$this->tplObj->assign_vars(array('accountType' => $accountType,'userAccounts' => $userAccounts));

$this->tplObj->display('view/default.makepayment.tpl');

}

}

?>

Listing ShowMessagesPage

<?php

define('MODE', 'INSITE');

class ShowMessagesPage extends AbstractPage{

function __construct(){

parent::__construct();

}

function search(){

global $db, $USER;

if($_POST){

/*

post variables

account: int

amount:int

accountsender: beneficiar iban

beneficiarname: beneficiar name

details: details payment

password: retype password

*/

if(empty($_POST['account']) || empty($_POST['date']) ){

$this->tplObj->assign_vars(array('showMessages' => "Please complete all the fields",'type' => 'danger'));

}else{

//further verifications

$account = $db->sql_escape($_POST['account']);

$date = $db->sql_escape($_POST['date']);

/*

<option value="1">1 day</option>

<option value="2">3 days</option>

<option value="3">1 week</option>

<option value="4">1 month</option>

<option value="5">Forever</option>

*/

$fetchAccountInfo = $db->uniquequery("SELECT *FROM db_accounts where user_id = ".$USER['id']." and id = ".$account." ;");

if(!$fetchAccountInfo){

$this->tplObj->assign_vars(array('showMessages' => "Invalid account selection",'type' => 'danger'));

}

switch($date){

case '1':

$where = 'timestamp >= '.(time()-24*60*60);

break;

case '2':

$where = 'timestamp >= '.(time()-3*24*60*60);

break;

case '3':

$where = 'timestamp >= '.(time()-7*24*60*60);

break;

case '4':

$where = 'timestamp >= '.(time()-30*24*60*60);

break;

case '5':

$where = '1';

break;

}

$getAllTransactions = $db->fetchquery("SELECT *FROM db_transactions where (fromAccountId = ".$account." OR toAccountIBAN= '{$fetchAccountInfo['iban']}' ) and ".$where." ");

//debug($db->debug());

foreach($getAllTransactions as $key => $value){

$getAllTransactions[$key]['timestamp'] = date('Y-m-d H:m:s',$value['timestamp']);

}

//we make transfer

$this->tplObj->assign_vars(array('transactions' => $getAllTransactions));

//$this->tplObj->display('view/default.reports.show.tpl');

}

}

self::show();

}

public function show(){

global $db,$USER;

$userMessages = $db->fetchquery("SELECT *FROM db_messages where messagereceiverID = ".$USER['id']);

foreach($userMessages as $key => $value){

$userMessages[$key]['messageTimestamp'] = date('Y-m-d H:m:s',$value['messageTimestamp']);

}

$this->tplObj->assign_vars(array('userMessages'=>$userMessages));

$this->tplObj->display('view/default.messages.tpl');

}

}

?>

Listing ShowMyaccountPage

<?php

define('MODE', 'INSITE');

class ShowMyaccountPage extends AbstractPage{

function __construct(){

parent::__construct();

}

function getCities(){

global $db;

$countyID = $_POST['id'];

$checkIfCountyExists = $db->uniquequery("SELECT `id` from db_county where `id` = ".$db->sql_escape($countyID)." ;");

if($checkIfCountyExists['id']){

$theCities = $db->fetchquery("SELECT id,name from db_city where county_id = ".$checkIfCountyExists['id']." order by name ASC;");

$cities = array();

foreach($theCities as $key => $value){

$cities[$value['id']] = $value['name'];

}

echo json_encode(array('cities'=>$cities));

exit;

}

return json_encode(array('cities'=>array('')));

}

function update(){

global $db, $USER;

if($_POST){

/*

post variables

account: int

amount:int

accountsender: beneficiar iban

beneficiarname: beneficiar name

details: details payment

password: retype password

*/

if(empty($_POST['email']) || empty($_POST['phone_nr']) || empty($_POST['address']) || empty($_POST['postal_code']) || empty($_POST['password']) ){

$this->tplObj->assign_vars(array('showMessages' => "Please complete all the fields",'type' => 'danger'));

}else{

//further verifications

$email = $db->sql_escape($_POST['email']);

$phone_nr = $db->sql_escape($_POST['phone_nr']);

$address = $db->sql_escape($_POST['address']);

$posta_code = $db->sql_escape($_POST['postal_code']);

$userPass = $db->sql_escape($_POST['password']);

$errors = 0;

$errorsMessages = "\n ";

//password doesn't match

if(md5($userPass) != $USER['password']){

$errors++;

$errorsMessages .=" Your password does not match \n";

}

if(strlen($phone_nr)<10){

$errors++;

$errorsMessages .= "Invalid phone nr \n";

}

if(strlen($email) < 5){

$errors++;

$errorsMessages .= "Invalid Email \n";

}

if($postal_code < 0){

$errors++;

$errorsMessages .= "Invalid postal code \n";

}

if($errors == 0){

//we make transfer

foreach($_POST as $key => $value){

if(isset($USER[$key]) && $key != 'password'){

$db->query("Update db_users set {$key} = '".$value."' where id = ".$USER['id']." ;");

}

}

$this->tplObj->assign_vars(array('showMessages' => "Account has been updated succesfull",'type'=> 'success'));

}else{

//show errors

$this->tplObj->assign_vars(array('showMessages' => $errorsMessages,'type'=>'danger'));

}

}

}

self::show();

}

public function show(){

global $db,$USER;

$userDetails = $db->uniquequery("SELECT acc.judet_id, acc.city_id,acc.id,acc.email,acc.phone_nr,acc.address,acc.name, acc.surname, acc.postal_code,dbc.name as judet,city.name as oras from db_users acc

left join db_county dbc on dbc.id=acc.judet_id

left join db_city city on city.id=acc.city_id

where acc.id = ".$USER['id']);

$allCounties = $db->fetchquery("SELECT *from db_county order by name asc");

$this->tplObj->assign_vars(array('userDetails' => $userDetails,'counties' => $allCounties));

$this->tplObj->display('view/default.myaccount.tpl');

}

}

?>

Listing ShowOpenaccountPage

<?php

define('MODE', 'INSITE');

class ShowOpenaccountPage extends AbstractPage{

function __construct(){

parent::__construct();

}

function createaccount(){

global $db,$USER;

if($_POST){

$IBAN = "RO".rand(10,99)."INGB".generateIBAN();

$db->query("INSERT INTO db_accounts(user_id,account_type,timestamp,iban) values (".$USER['id'].",".(int)$_POST['radioExample'].",".TIMESTAMP.",'".$IBAN."');");

redirectTo('home');

}

}

public function show(){

global $db,$USER;

$accountTypes = $db->fetchquery("SELECT *FROM db_accounttype ;");

$this->tplObj->assign_vars(array('accountType' => $accountTypes));

$this->tplObj->display('view/default.openaccount.tpl');

}

}

?>

Listing ShowRegisterPage

<?php

class ShowRegisterPage extends AbstractPage{

function __construct(){

parent::__construct();

}

public function create(){

global $db;

if(empty($_POST)){

die('Error');

}else{

$name = $_POST['name'];

$surname = $_POST['surname'];

$password = $_POST['password'];

$confirmPassword = $_POST['confirmPassword'];

$email = $_POST['email'];

$errors = 0; // we have no errors

if(empty($name) || empty($surname) || empty($password) || empty($confirmPassword) || $password != $confirmPassword || empty($email)){

message('Please reverify the fields');

exit;

}

$db->query("INSERT INTO ".USERS."(name,surname,email,password) VALUES ('".$name."','".$surname."','".$email."','".md5($password)."')");

session_start();

$SESSION = new Session();

$SESSION->CreateSession($db->GetInsertID());

redirectTo("home");

}

}

public function show(){

$this->tplObj->display('view/register.index.tpl');

}

}

?>

Listing ShowReportsPage

<?php

define('MODE', 'INSITE');

class ShowReportsPage extends AbstractPage{

function __construct(){

parent::__construct();

}

function search(){

global $db, $USER;

if($_POST){

/*

post variables

account: int

amount:int

accountsender: beneficiar iban

beneficiarname: beneficiar name

details: details payment

password: retype password

*/

if(empty($_POST['account']) || empty($_POST['date']) ){

$this->tplObj->assign_vars(array('showMessages' => "Please complete all the fields",'type' => 'danger'));

}else{

//further verifications

$account = $db->sql_escape($_POST['account']);

$date = $db->sql_escape($_POST['date']);

/*

<option value="1">1 day</option>

<option value="2">3 days</option>

<option value="3">1 week</option>

<option value="4">1 month</option>

<option value="5">Forever</option>

*/

$fetchAccountInfo = $db->uniquequery("SELECT *FROM db_accounts where user_id = ".$USER['id']." and id = ".$account." ;");

if(!$fetchAccountInfo){

$this->tplObj->assign_vars(array('showMessages' => "Invalid account selection",'type' => 'danger'));

}

switch($date){

case '1':

$where = 'timestamp >= '.(time()-24*60*60);

break;

case '2':

$where = 'timestamp >= '.(time()-3*24*60*60);

break;

case '3':

$where = 'timestamp >= '.(time()-7*24*60*60);

break;

case '4':

$where = 'timestamp >= '.(time()-30*24*60*60);

break;

case '5':

$where = '1';

break;

}

$getAllTransactions = $db->fetchquery("SELECT *FROM db_transactions where (fromAccountId = ".$account." OR toAccountIBAN= '{$fetchAccountInfo['iban']}' ) and ".$where." ");

//debug($db->debug());

foreach($getAllTransactions as $key => $value){

$getAllTransactions[$key]['timestamp'] = date('Y-m-d H:m:s',$value['timestamp']);

}

//we make transfer

$this->tplObj->assign_vars(array('transactions' => $getAllTransactions));

//$this->tplObj->display('view/default.reports.show.tpl');

}

}

self::show();

}

public function show(){

global $db,$USER;

$userAccounts = $db->fetchquery("SELECT acc.id, acc.balance,acctype.name as type,acc.iban from db_accounts acc left join db_accounttype acctype on acctype.idtype = acc.account_type where acc.user_id = ".$USER['id']);

$this->tplObj->assign_vars(array('accountType' => $accountType,'userAccounts' => $userAccounts));

$this->tplObj->display('view/default.reports.tpl');

}

}

?>

Listing Conectare la Baza de date

<?php

//### Database access ###//

$database['host'] = 'localhost';

$database['port'] = '3306';

$database['user'] = 'root';

$database['userpw'] = '';

$database['databasename'] = 'kingcode_eduardo';

//### Do not change beyond here ###//

?>

Similar Posts