. Aplicatie Informatica Pentru Managementul Serviciilor Internet
INTRODUCERE
Primul web designer a fost de fapt chiar inventatorul www-ului, Tim Berners Lee, care a publicat primul site din lume în anul 1991. La început site-urile nu erau nici pe departe atât de complexe și încarcate grafic cum sunt în prezent, limbajul utilizat – HTML – fiind extrem de simplu și permițând numai o serie limitată de formatări, precum și inserarea de link-uri, pentru a putea "lega" paginile între ele, web designul fiind, de fapt, mai mult programare web.
În prezent preocuparea pentru aspectul grafic al site-urilor, devenite puternice instrumente publicitare și comerciale, justifică în întregime denumirea de "web design" iar tehnologiile utilizate s-au diversificat și au devenit din ce în ce mai complexe. Firmele care produc site-uri lucrează cu angajați specializați pentru fiecare etapă a dezvoltării unui site, de la stadiul de concepție grafică la programare și editare de conținut pentru SEO (optimizarea site-urilor pentru motoarele de căutare). Site-urile actuale sunt din ce în ce mai mult axate pe animație interactivă și dinamism, aceste deziderate fiind îndeplinite de cunoscutul program Flash, precum și de alte programe apărute după acesta, care pot genera automat fișiere animate cu extensia originară, .swf.
Site-urile, în forma în care ele se afișează în browsere, sunt de fapt interpretări vizuale, menite să fie înțelese de orice persoană, fără să-i fie necesare cunoștinte în domeniul informaticii, ale secvențelor de cod redactate de programatori în diverse limbaje care apoi generează limbajul specific de script al internetului – HTML (HyperText Markup Language) sau direct in acest limbaj de programare. Daca browserele nu ar exista si nu ar ști să interpreteze limbajul de script, site-urile ar fi înșiruiri de texte, neformatate și, cel mai probabil, fără imagini. În principiu, limbajul indică diverselor elemente vizibile locul în care să se afișeze, dimensiunea, culoarea, precum și alți parametri care conferă unei pagini web atât un aspect anume cât și funcționalitate.
CAPITOLUL 1
STUDIUL SI ANALIZA SISTEMULUI EXISTENT
1. Prezentare generala
NET.SRL este localizata în București și a fost înființat în anul 2002. Scopul firmei este să întâmpine cererile ale unui număr de peste 200 de români care vor sa viziteze si sa se foloseasca de noua tehnologie online mult mai practica . NET.SRL pune la dispozitia clientilor o gama variata de servicii:E-mail,Dial-up,Configurare software client,conturi e-mail suplimentare,suport tehnic la cerere,desing pagini web…Acestea se pot alege in functie de dorintele clientilor in momentul in care se realizeaza cantractul.
Piața-țintă:
familii cu venituri medii și peste medie,
Distribuția:
Angajatii firmei se deplaseaza la domiciliul clientului executand toate demersurile pentru ca acesta sa beneficieze de serviciile dorite
Publicitatea:
elaborarea unor campanii de publicitate în colaborare cu agenții specializate care să vină în sprijinul strategiei de poziționare a mărcii și de creștere rapidă a notorietății acesteia.
Marketing direct:
utilizarea web marketingului în comunicarea cu clienții și pentru promovarea serviciilor
crearea unei baze de date de marketing relațională;
1111111111111111
Studiul pieței:
culegerea unui volum cât mai mare de informații despre modul de alegere al cumpărătorilor de servicii internet,;
1.1 Indicatori economici
Dezvoltarea firmei este indisolubil legata de asigurarea echilibrului financiar, care reprezinta o parte constitutiva a echilibrului economic in expresie valorica, un obiectiv important al politicii financiare a firmei. Echilibrul financiar exprima egalitatea si corelatiile dintre necesarul de resurse financiare si posibilitatea de constituire a acestor resurse. Acest echilibru este dependent de starea si miscarea patrimoniului.
Situatia principalilor indicatorilor economici conform bilantului din perioada 2002-2003
Capital propriu
1.1.2 Organigrama unitatii economice
Asa cum reiese din organigrama S.C. NET.SRL societatea este administrata de Directorul General care are in subordine urmatoarele compartimente:
Compartimentul de marketing;
Compartimentul financiar-contabil;
Oficiul juridic;
La data de 1 octombrie 2002 intreprinderea avea un numar total de 10 de angajati din care 5 cu contracte de munca pe perioada nedeterminata si 5 cu contract de colaborare sau alte forme de angajare temporara.
Structura de personal existenta la data de 1 octombrie 2002:
conducerea intreprinderii:1
personal direct productiv:vanzatori: 3
personal indirect productiv:
administrativ: 2
marketing: 1
desfacere (magazioner): 1
contabil:1
jurist: 1
Fig.1.3. Organigrama S.C. SYSTEMS S.R.L.
Atributiile Directorului General (Administratorului) sunt urmatoarele: asigura conducerea administrativa societatii, aproba infiintarea/desfiintarea punctelor de lucru, aproba organigrama personalului angajat, desemneaza nominal, prin decizie, persoanele cu drept de semnatura in banca.
Atributiile compartimentului juridic sunt urmatoarele: reprezinta interesele societatii in fata organelor de jurisdictie si a notariatelor, avizeaza asupra legalitatii contractelor.
Atributiile compartimentului financiar-contabil sunt urmatoarele: stabileste preturile si tarifele din componenta organizatiei si urmareste respectarea preturilor si tarifelor legal aprobate, analizeaza evolutia preturilor, tarifelor si acumularilor cuprinse in ele la serviciile proprii, prezentand conducerii propuneri de imbunatatire; intocmeste evidentele contabile impuse de legislatie; asigura intocmirea, difuzarea, arhivarea tuturor documentelor care stau la baza operatiunilor contabile, intocmeste inregistrarile de contabilitate primara; asigura inregistrarea ritmica a operatiunilor de decontare cu clientii societatii; asigura plata in termen a obligatiilor societatii fata de buget, urmarind permanent capacitatea de plata.
1.1.3Siutuatia existenta
Furnizarea tuturor informatiilor care descriu caracteristicile serviciului;
Furnizarea instructiunilor de lucru, acolo unde acestea sunt necesare;
Personal calificat;
Mediu de lucru adecvat;
On1.3.1
Procesul de aprovizionare
Procesul de aprovizionare se desfasoara planificat, prin intermediul SC NET.SRL., pe baza urmatoarelor informatii: valoarea stocului minim pentru fiecare tip de produs; comenzi/contracte existente; cataloage de prezentare puse la dispozitie de furnizorii de produse/servicii. S.C. SYSTEMS S.R.L. mentine in baza de date evolutia stocurilor de produse din import.
Depozitarea
Produsele sunt depozitate in spatii special amenajate, pe rafturi adecvate, aerisite, ferite de surse de apa si foc. Acestea sunt marcate in vederea identificarii lor cu usurinta.
Loturile de produse sunt inscriptionate cu denumirea produsului, codul produsului, numarul lotului, data fabricatiei, numele clientului, si sunt incarcate astfel incat sa permita accesul usor pentru incarcare.Produsele sunt manipulate cu atentie pentru a preveni deteriorarea lor calitativa, pierderile si eventualele accidente. Pentru a se evita posibilitatea deteriorarii calitative pe parcursul transportului sunt utilizate mijloace de transport proprii, dotate corespunzator care sa asigure stabilitatea produselor.
Marketing-ul
Principalele activitatii: stabilirea strategiei de desfacere optimă a produselor pe piața internă, având de ales între vânzări prin propriile magazine de desfacere sau intermediari, pe care o va transmite spre aprobare managerului general; stabilirea targetelor de vânzări pe produse și pe regiuni; comunicarea permanentă cu vânzătorii din cadrul magazinelor de prezentare și desfacere ale firmei pentru a afla orice tip de informație de la clienți (sugestii, nemulțumiri, etc.) analiza vânzărilor firmei pe regiuni geografice, firma având ca obiectiv extinderea rețelei de magazine în marile orașe ale țării; în vederea facilitării acestei sarcini, firma va achiziționa un sistem software de automatizare a vânzărilor; stabilirea strategiilor de preț prin colaborarea cu departamentul financiar; colaborarea cu specialiștii în promovare pentru găsirea modalităților de creștere a vânzărilor.
1.1.4Studiul sistemului informational
studiul documentelor care circula în sistem, a continutului informational al
acestora, al circuitului lor, al periodicitatii cu care se emit;
elaborarea schemei fluxului informational global (cu punerea în evidenta a principalelor activitati si a legaturilor statice si dinamice dintre acestea);
estimarea cantitativa si calitativa a informatiilor de intrare-iesire, modul de culegere si prelucrare.
identificarea principalilor algoritmi, a regulilor de calcul si a punctelor si regulilor de control;
situatia rationalizarii fluxurilor si a documentelor din unitatea economica, studii elaborate, stadiul lor de implementare;
sistemul de codificare utilizat, restrictii;
performantele si limitele sistemului informational existent.
Identificarea metodelor si mijloacelor tehnice utilizate pentru Prelucrarea datelor în cadrul sistemului informational existent se face analizând:
mijloacele tehnice existente în dotarea unitatii economice (modul de utilizare, cheltuielile de exploatare, personalul implicat, performante);
existenta unor aplicatii proiectate si/sau implementate.
1.1.5 Dotarea tehnica
Societatea S.C. NET. S.R.L. dispune de sisteme de calcul performante.
Toate sistemele de calcul sunt legate in retea si au acces la internet prin fibra optica. Serverul este unitatea de la contabilitate fiind folosit in acelasi timp la realizarea proceselor contabile. De asemenea societatea are angajati operatori calificati si programatori pentru dezvoltarea sistemelor informatice.
1.1.6 Analiza activitatii societatii
Realizarea acestui proiect informatic este necesara deoarece firma doreste extinderea si comercializarea produselor on-line. Analiza structurii sistemului informatic decizional al societatii S.C.NET. S.R.L. este orientata pe conceptul de „domeniu” de activitate.
1.1.7 Principalele colectii de informatii
Informatiile obtinute din analiza principalelor fluxuri de informatii sunt necesare pentru un bun management al unitatii. Aceste colectii de informatii pot fi grupate in 2 categorii principale si anume:
Sectiuni ale bancii de date ale societatii S.C.NET. S.R.L.
Colectii de date si informatii locale, specifice activitatilor fiecarui compartiment al societatii.
1.1.8 Solutia conceptuala a noului sistem
Descrierea noului sistem, prin prisma urmatoarelor aspecte:
cerinte functionale, care se refera la activitatile, la functiunile pe care sistemul informatic trebuie sa le respecte.
cerinte nefunctionale, care precizeaza de exemplu cine sunt utilizatorii sistemului, ce pregatire trebuie sa aiba pentru a putea utiliza viitorul sistem, cum se pot reface fisierele, baza de date in caz de incident, cum se arhiveaza si cat timp trebuie sa fie ele pastrate, etc.
Restrictiile impuse de noul sistem, cum ar fi necesitatea unei dotariminime,necesitatea asigurarii legaturilor cu celelalte aplicatii existente in functiune in cadrul societatii, necesitatea alinierii la sistemul de codificare existent sau necesitatea reproiectarii lui, restrictii de ordin legislativ, etc.
Analiza cost-beneficiu- se stie ca proiectarea si realizarea efectiva a unui sistem informatic necesita o activitate laborioasa a unui numar adeseori mare de specialisti de înalta clasa în domeniul informaticii. In aceste conditii, se va determina costul de realizare a s, se va determina costul de realizare a sistemului informatic, adica pretul platit proiectantului pentru realizarea sistemului informatic, la care se adauga costurile suportate de societatea respectiva pentru instruirea personalului care va utiliza sistemul, precum si costul determinat de achizitionarea unor componente hardware performante (calculatoare, placi de retea, componente multimedia,etc) si software (licente pentru sisteme de operare, programe utilitare, limbaje de programare sau sisteme gestiune a bazelor de date necesare). Se va estima deasemenea costul de functionare a sistemului informatic în cadrul societatii; de regula acesta nu este semnificativ daca societatea respectiva avea calculatoare si lucrari în functiune, deci avea si un minim de personal calificat în domeniu. Cunoscând aceste costuri, se impune calculul beneficiului obtinut prin realizarea sistemului respectiv, a timpului de recuperare a investitiei efectuate. Adeseori, beneficiul consta în calitatea deosebita a informatiilor furnizate si economia de timp pe care o aduce prelucrarea automata a datelor, cu efecte benefice asupra fundamentari si derularii actelor decizionale, reflectate într-o mai buna relatie cu furnizorii si clientii, cu personalul din interior cu piata si cresterea, în acest fel, a profitului realizat.
1.1.9 Definirea directiilor de perfectionare a actualului sistem
Definirea directiilor de perfectionare presupune:
specificarea obiectivelor si a performantelor sistemului informatic;
stabilirea domeniilor de probleme si a principalelor functiuni ale sistemului informatic;
definirea cerintelor si restrictiilor informationale pe domenii de probleme si functiuni care consta în:
formularea conditiilor pentru realizarea sistemului informatic, care consta în:
– specificarea termenelor si duratelor solicitate;
– precizarea prioritatilor în realizarea obiectivelor sistemului informatic;
– specificarea cerintelor speciale privind flexibilitatea, compatibilitatea cu alte sisteme, gradul de generalizare al sistemului.
Pentru fiecare varianta de solutie informatica se procedeaza la:
– evaluarea resurselor necesare (costurile de sistem);
– evaluarea efectelor economice directe si indirecte;
– calculul indicatorilor de eficienta economica.
avizarea si alegerea variantei de sistem de catre beneficiar pe baza indicatorilor de eficienta economica.
CAPITOLUL 1 Despre internet si programe web
1.2. Prezentare
În ultima perioadă, creșterea numărului de potențiali utilizatori cu acces la computer și cu posibilități de conectare la Internet, a dus la o creștere accentuată a solicitărilor pentru soluții de transmitere a cunoștințelor prin intermediul Internetului, pentru aplicații care să faciliteze schimbul de informații dintre două sau mai multe locații aflate în parți diferite ale aceluiași oraș sau în părți diferite ale globului.
Deși posibilitățile tehnice de realizare a paginilor interactive sunt practic nelimitate, limitările privind banda de comunicație la utilizatorul final constituie un obstacol în calea înlocuirii totale a factorului uman.
În acest context, aplicația prezentată are ca scop realizarea unui cadru propice pentru organizarea, managementul și transmiterea informației în condiții controlate pentru un provider de servicii INTERNET.
Direcțiile principale urmărite sunt organizarea, managementul și monitorizarea informației care este introdusă de către o persoană specializată, persoană care nu trebuie să aibă cunoștințe solide despre acest gen de aplicație.
Aplicația este structurată pentru a permite dezvoltări viitoare, aplicația găsindu-și deja aplicația comercială. Este folosită deja la stocarea în baza de date a abonaților unui INTERNET SERVICE PROVIDER (ISP). De asemenea, este folosită și pentru facturarea automată a abonaților la sfârșitului unei luni, acesta fiind și scopul principal al creării acestei aplicații, eliminarea sau reducerea implicării factorului uman în eliberarea facturii pentru serviciile oferite unui anumit abonat.
1.2.1 Istoria “WEB-ului”
În data de 12 decembrie 1991, la Stanford Linear Accelerator Center (SLAC) a fost instalat un server Web și primele pagini Web, care făceau legătura cu biblioteca centrului. Dar primul server Web a fost realizat aproape cu un an înainte, la Centrul European pentru Cercetări Nucleare (CERN), la Geneva, în Elveția, și s-a numit la început nxoc01.cern.ch, iar mai apoi info.cern.ch. Iar prima pagină Web a conținut chiar prezentarea proiectului și a fost accesibilă la: http://nxoc01.cern.ch/hypertext/www/TheProject.html
Cum au decurs, de fapt, lucrurile?
Știm că, în '90 – '91, când Internetul era deja în plină dezvoltare, după ce proiectul și toate modulele acestuia fuseseră elaborate în Statele Unite, la Stanford Research Institute, la UCLA, UCSB, WU, etc., prin realizarea a ceea ce numim acum Web, a venit rândul europenilor. Mai exact, la Centrul European de Cercetări Nucleare (CERN) Geneva, prin proiectul lui Tim Berners-Lee (http://www.w3.org/People/Berners-Lee/) și contribuția câtorva colegi și studenți, a fost creat primul navigator și editor de legături (cu o primă versiune a limbajului HTML) și primul program de server Web. La acea dată comunicația prin Internet, prin serviciile de atunci, adică e-mail, ftp și telnet, mergea bine și era destul de serios folosită de comunitatea academică. În 1991, traficul prin nodul NSF (miezul Internetului) depășea 1 miliard de octeți/oră, iar numărul de calculatoare conectate depășea o jumătate de milion. Tot 1991 este anul în care National Science Foundation renunță la interdicția de folosire a Internetului în scopuri comerciale, creând premisele boom-ului economic produs de comerțul electronic.
Tim Berners-Lee era preocupat de introducerea hypertext-ului în Internet, în procesul de căutare și regăsire a documentelor. Noțiunea exista, chiar și termenul Hypertext fusese deja introdus de Ted Nelson (1965). Problemele și avantajele parcurgerii informațiilor organizate ca hypertext fuseseră deja analizate de Doag Engelbart, realizator al unui prin sistem on-line și inventator al mouse-ului.
Tim Berners-Lee scrie încă în 1980, în stagiul la CERN, un program „notebook”, intitulat „Enquire-Within-Upon-Everything”, care permite legături între noduri arbitrare. Fiecare nod fiind caracterizat de un titlu, un tip și o listă de legături bidirecționale. Programul a rulat pe mașini Norsk Data sub sistemul de operare SINTRAN-III.
În martie 1989, Tim Berners-Lee scrie lucrarea: „Information management: A proposal”, difuzată pentru comentarii în CERN. Însoțită și de lucrarea „Hypertext and CERN”. Ideea de bază a fost cea a accesului la documente pe baza a ceea ce acum numim URL. După mai multe dezbateri și reluări, în septembrie, șeful său, Mike Sendal, cumpără un calculator NeXT (unul din supercalculatoarele vremii) și îi permite să treacă la treabă. Era în luna Mai a anului 1990.
În octombrie Tim lucra deja la un navigator cu interfață grafică și la editorul aferent. Folosind mediul de dezvoltare NeXTStep. În acest timp, proiectul este reformulat în cooperare cu Robert Cailliau, astfel că, atunci când primul server Web devine funcțional, prima pagină vizibilă cu ajutorul navigatorului care încă se dezvolta, a fost chiar TheProject.html, cu coordonatele complete:
http://nxoc01.cern.ch/hypertext/www/TheProject.html
Studentul Nicola Pellow reușește să facă un navigator mod linie (în genul lynx-ului actual), astfel că la Crăciunul din 1990 erau demonstrabile atât navigatorul său simplu și cel realizat de Tim Barners-Lee, combinat cu editor și cu o interfață grafică. Era posibil accesul la fișiere hypertext și la grupurile de știri.
În 1991 proiectul începe să fie prezentat în diverse colective din CERN, iar în luna iunie este organizat primul seminar de calculatoare cu ajutorul acestui sistem, adică pe WWW.
1.2.2 Internetul în România
În România, Internetul a pătruns relativ încet, multă vreme fiind considerat un lux inutil. Chiar și acum, pentru uz personal, mai ales datorită costurilor foarte mari ale serviciilor telefonice, este destul de puțin utilizat. Dacă din punct de vedere al infrastructurii lucrurile au avansat destul de mult, din punct de vedere al resurselor informatice disponibile evoluția este greoaie, dar se simte o mișcarea continuă înainte, înspre dezvoltare și al utilizatorilor de acasă, cât și al firmelor.
Majoritatea companiilor și chiar unele structuri administrative au înțeles ca prezența în Internet este foarte importantă. Traficul observat în rețea este mai mult de aducere de informație din exterior decât de export de informație sau de schimb de informație în cadrul țării. Având în vedere intervalul mare de timp pentru care accesul din România la informații externe a fost oprit, fenomenul este destul de natural. În contextul internațional actual de afaceri, academic și tehnologic, fenomene ca globalizarea și liberalizarea accesului la informație potențate de dinamica și nivelul de performanță al dezvoltărilor în domeniul comunicațiilor și al calculatoarelor, sunt deja lucruri comune.
Rețeaua academică
În România din motive care au ținut mai mult de politică decât de necesitățile reale, rețeaua cercetării este separată de rețeaua universitară. Rețeaua cercetării (RNC) a fost creată utilizând și sume importante primite de la comunitatea internațională pentru rețeaua academică română (care ar fi trebuit să lege la Internet atât unitățile de cercetare cât și cele de învățământ). Rețeaua universitara (RoEduNet) s-a dezvoltat prin eforturile financiare depuse de către o serie de universități din rețeaua Ministerului Educației Naționale și eforturile tehnice, de imaginație și nu în ultimul rând de muncă efectivă depuse de o echipa de entuziaști. Abia în ultimii ani RoEduNet a beneficiat de o dotare semnificativa din partea MEN. La RoEduNet sunt cuplate practic toate universitățile din țară și există „puncte de prezență” în toate capitalele de județ.
1.2.3 Despre fiabilitate
Fiabilitatea unui sistem este definită ca o capacitate a sistemului de a funcționa conform cărții tehnice și fără defecțiuni, un anumit interval de timp. Durata preconizată, de la momentul punerii în funcțiune și până la prima defecțiune se numește durata de viață a sistemului.
Analiza, depistarea și corectarea erorilor din pachetele de programe, a bug-urilor, este o activitate curentă în orice firmă de soft. În decursul anilor s-au încercat diferite procedee de automatizare a depistării și corectării erorilor, realizarea unor mecanisme de testare a programelor. Celebră rămâne o afirmație a lui Djikstra: „Orice program de test poate evidenția cel mult prezența unei erori, niciodată absența erorii”.
Trecerea de la un sistem de operare la altul, de la un limbaj de programare la altul, odată cu amplificarea continuă a configurațiilor hard și cu sporirea vitezei de calcul, în condițiile extinderii utilizării calculatoarelor, au condus la soluții de transcriere automată și la studii privind ingineria reutilizării programelor, revitalizând programe care „muriseră” odată cu scoaterea din fabricație a calculatoarelor pentru care fuseseră realizate. Apar de fapt noi versiuni ale aplicațiilor, adaptate noilor sisteme de operare și noilor configurații hard, versiuni stabile care rezistă uneori câțiva ani, alteori, mai puțin stabile, sunt înlocuite de versiuni noi, mai complete și mai adecvate noilor condiții și noilor utilizatori.
În firmele de soft există norme privind munca de programare și condiții de calitate, care stabilesc media erorilor la mia de linii de cod, numărul mediu de erori care pot fi corectate în etapele de testare, precum și procentul de eventuale erori nedepistate. Gradul de acceptare al acestor erori depinde de destinația sistemului și influențează desigur prețul de vânzare al produsului program sau al sistemului în ansamblu. Cerințele fiind altele la un calculator de proces, realizat pentru o centrala nucleara sau pentru un program spațial, față de un calculator personal – domestic. Vorbim despre siguranța în funcționare a programului și a întregului sistem și acceptăm ca un program are o durată de viață limitată de apariția unor erori (de exemplu de depistarea unor „găuri de securitate”) sau de apariția unei versiuni noi, mai performante, care îl înlocuiește.
Care ar fi însă elementele de fiabilitate pentru informațiile din Internet? Care ar fi defecțiunile sau erorile ce pot interveni în manevrarea acestor informații și câte din acestea au legătură directă cu conținutul? Putem delimita defecțiunile care privesc direct fișierele ce includ anumite informații, de cele care afectează serverele în gestiunea cărora se afla acele fișiere? Putem determina un timp de viata specific informației, sau durata ei de viata este data doar de a serverului care o „publică”?
Și în cazul fișierelor accesibile prin FTP și pe arhivele grupurilor de discuții, informațiile sunt păstrate adesea și după ce își pierd actualitatea sau importanța. De multe ori se întâmpla la fel și în cazul paginilor Web. Cu excepția unor incidente sau catastrofe, sau a unor situații banale de tip renunțarea la abonament, sau criza de spațiu disc. Ne putem imagina și situații în care administratorul pedant al serverului (Web sau FTP) analizează conștiincios fișierele catalog și, constatând ca a dispărut interesul publicului pentru acele documente, își asumă responsabilitatea ștergerii lor de pe server.
1.2.4 Greșeli uzuale în Web Design
Folosirea frame-urilor
Împărțind o pagină în frame-uri aceasta devine foarte confuză pentru utilizatori, deoarece frame-urile încalcă stilul de model fundamental al utilizatorului despre o pagină web. Toate ca toate, dar nu avem posibilitatea să facem un „bookmark” la pagina curenta și să ne întoarcem la ea mai târziu (bookmark-ul are un link către altă pagină cu frame-uri), adresele web nu mai funcționează și tipărirea este greoaie.
Gratuitatea folosirii ultimei tehnologii
Nu este indicată atragerea de utilizatori în site folosind laude despre ultimele tehnologii folosite. Vor fi atrași câțiva, dar majoritatea utilizatorilor vor judeca în funcție de conținutul ajutător și de diversitatea ofertei de produse și servicii bune. Folosind cuvinte ca „ultima” sau „cel mai” înainte de versiunea finala, este sigur o cale de a descuraja utilizatorii: daca sistemul lor „crapă” în timp ce vizitează site-ul vostru, puteți paria ca ei nu se vor mai întoarce niciodată în site.
Doar daca sunteți într-o afacere de vânzări de produse Internet sau servicii, cea mai bună cale este a aștepta până câștigați experiența cu respectul față de căile apropiate în folosirea noilor tehnologii. Când tehnoredactarea era în faza inițială, se introduceau douăzeci de fonturi în document, deci găsim similaritate în designul pentru Web.
Adrese de web (URLs) complexe
Atâta timp cât adresabilitatea la nivel de mașină, adică o adresa de web (URL) nu ar trebui expusă în interfața utilizatorului, se observă ca utilizatorii actuali încearcă să decodeze adresele paginilor pentru a interacționa cu structura web-site-urilor.
Utilizatorii fac aceasta pentru ca simt lipsa suportului de navigare și pentru a găsi sensul localizării în web browser. Astfel, un URL ar trebui să conțină directoare citibile și nume de fișiere care reflecta natura informației. De asemenea, uneori, utilizatorii au nevoie să tasteze un URL, deci încercați să reduceți riscul de tastare folosind nume scurte cu toate caracterele mari și fără caractere speciale (multa lume nu știe sa tasteze caracterul ~).
Lipsa de suport de navigare
Nu va gândiți ca utilizatorii știu atât de multe despre site-ul vostru cât știți voi. Întotdeauna vor avea dificultăți în găsirea de informații, deci au nevoie de un suport, în sensul unei perceperi a structurii. Porniți designul vostru cu o înțelegere bună a structurii spațiului destinat informației și comunicați explicit aceasta structură utilizatorului. Furnizați o harta a site-ului (site map) și lăsați utilizatorul să înțeleagă unde se află și încotro să o apuce. De asemenea, aveți nevoie de o facilitate de căutare atâta timp cât suportul de navigare nu e satisfăcător.
Durata descărcării
Aceasta greșeală este inclusă în acest top din cauză că multă lume nu înțelege ce înseamnă, nu din cauză că este importantă. Tradițional ghidurile factorilor umani indica 10 secunde ca fiind maximul timpului de răspuns, înainte ca utilizatorii sa își piardă interesul. Tehnologic vorbind, aceasta limita de timp poate fi redusă la 7 secunde, aceasta ultima limita fiind și un instrument de marketing, cu care puteți atrage clienți. Pe web, utilizatorii se antrenează sa îndure atâta suferința cât sa accepte să se mărească aceasta limită la 15 secunde pentru câteva pagini.
Chiar și website-urile cu număr ridicat de utilizatori trebuie să ia în considerare acest timp de descărcare (download): se observă că se accesează site-uri de pe calculatoarele de acasă, după-masa sau seara, deoarece utilizatorii sunt prea ocupați să navigheze în timpul orelor de lucru. Folosind lățimea de bandă, navigarea se înrăutățește, nu mult, din cauza că Internetul adaugă utilizatori mai mulți decât infrastructura poate duce.
CAPITOLUL 2. Managementul serviciilor INTERNET
2.1. Ce înseamnă managementul serviciilor INTERNET?
Managementul serviciilor INTERNET este un termen generic care descrie procesul de stocare, actualizare și organizare a datelor cu ajutorul unui calculator, de obicei conectat într-o rețea.
De exemplu, introducerea unui nou abonat în baza de date existentă a ISP-ului, completarea tuturor datelor referitoare la acest abonat (adresa, nume, tipul serviciilor solicitate, etc.), actualizarea datelor referitoare la un abonat face parte din managementul serviciilor INTERNET.
De asemenea, oferirea acestor servicii de către acest ISP atrage de la sine și facturarea acestor servicii la sfârșitul unei luni calendaristice sau la sfârșitul unei date bine stabilite prin contract. Acest eveniment de facturare este efectuat, de obicei, manual de către un operator uman. Această aplicație permite, însă, facturarea automată, prin selectarea abonatului și validarea serviciilor oferite, facturare care se face prin crearea unui document de tip PDF și prin printarea lui, apoi, pe o factură obișnuită.
Testele efectuate până în prezent au relevat că timpul câștigat de operatorul uman, prin folosirea acestei aplicații, scade până la 40%, față de timpul necesar actualizării unei baze de date de tip EXCEL și prin facturarea manuală.
2.2. Caracteristici și beneficii
2.2.1. Caracteristici
Principalele caracteristici și particularități ale managementului electronic al serviciilor INTERNET sunt:
Introducerea de noi abonați se face pe baza unui formular și nu permite trecerea peste câmpurile obligatorii;
Câmpurile completate în acest formular sunt folosite mai târziu pentru actualizarea contractului cu abonatul;
Există o machetă pentru contractele de abonați, persoane fizice sau persoane juridice, machetă care se completează automat după completarea tuturor câmpurilor obligatorii;
Această aplicație este proiectată pentru orice tip de utilizator mai mult sau mai puțin familiarizat cu aceasta;
Barierele geografice sunt eliminate, aplicația putând fi utilizată, de exemplu, de mai multe sucursale ale aceluiași ISP, aflate în orașe diferite;
Timpul și costurile asociate sunt reduse la minim;
Sporește îndemânarea în lucrul cu calculatorul și Internetul;
2.2.2. Beneficii
Exista destule avantaje ale folosirii acestei aplicații. În continuare, sunt enumerate câteva dintre acestea:
Comoditate și mobilitate;
Costuri mici;
Flexibilitate;
Aplicația poate fi accesată de oriunde;
Portabilitatea aplicației pe orice tip de sistem de operare.
2.3. Beneficiarii aplicației prezentate
Au fost vizați prin implementarea acestei aplicații, în principal, furnizorii de servicii INTERNET, care doresc să aibă o bază de date cu toți abonații și cu toate serviciile aferente acestor abonați.
Această aplicație poate fi extinsă foarte ușor și către alte tipuri de beneficiari, cum ar fi furnizorii de servicii de televiziune prin cablu (CATV), furnizorii de materii prime către alte societăți și multe alte tipuri de firme care furnizează tipuri de servicii către alte societăți sau către populație. Ar putea fi folosită această aplicație și de către firmele gen ELECTRICA, RADET sau altele.
CAPITOLUL 3. Arhitectura de implementare a platformei
Datorită multitudinii de limbaje de programare sau scripting și a bazelor de date existente la ora actuală, la implementarea platformei trebuie făcută o selecție cât mai riguroasă a uneltelor de dezvoltare astfel încât soluția aleasă să corespundă cel mai bine cerințelor dezvoltatorilor și a utilizatorilor produsului rezultat. În acest capitol voi prezenta câteva limbaje de scripting și baze de date care au fost luate în calcul la proiectarea acestei platforme și alegerea făcută.
3.1 JavaScript
3.1.1 Ce este JavaScript?
JavaScript este platforma de bază pentru browser-ul Netscape, este un limbaj de scripting orientat pe obiecte. JavaScript este un limbaj mic și ușor de învățat; nu este folositor ca limbaj de sine stătător, dar este desenat pentru înglobarea lui în alte produse și aplicații, cum ar fi browserele de Internet. Înăuntrul unui mediu de programare gazdă, JavaScript se poate conecta la obiecte din mediul respectiv pentru a prevedea control programatic peste ele.
JavaScript conține un set de obiecte, cum ar fi Array, Date și Math, și un set de elemente de limbaj cum ar fi operatorii, structurile de control și clauzele. Aceste funcții ale JavaScript pot fi extinse pentru o varietate de scopuri prin suplimentarea lui cu obiecte adiționale; de exemplu:
Client-side JavaScript extinde limbajul prin suplimentarea unor obiecte pentru controlul browser-ului (Navigator sau alt web browser) și pentru Document Object Model (DOM). De exemplu, extensiile client-side permit unei aplicații să plaseze elemente într-un cod HTML și răspunde la evenimentele utilizatorului cum ar fi, click-urile de mouse, introducerea datelor și navigația prin pagini.
Server-side JavaScript extinde limbajul prin suplimentarea unor obiecte relevante pentru rularea JavaScript pe un server. De exemplu, extensiile server-side permit unei aplicații să comunice cu o bază de date relațională, să prevadă continuitatea informațiilor de la o apelare la altă apelare a aplicației sau pentru manipularea fișierelor pe un server.
Prin intermediul funcționalității JavaScript LiveConnect, se poate face codul de Java să comunice cu JavaScript. Din JavaScript, se pot instanția obiecte din Java și se pot accesa metodele și câmpurile lor publice. Din Java, se pot accesa obiectele, proprietățile și metodele din JavaScript.
Netscape a inventat JavaScript, iar JavaScript a fost folosit pentru prima dată în browserele Netscape.
3.1.2. JavaScript și Java
JavaScript și Java sunt similare în câteva privințe, dar fundamental sunt diferite în altele. Limbajul JavaScript reasamblează Java, dar nu are aceleași caracteristici de fiabilitate ca și Java. JavaScript suportă cea mai mare parte a expresiilor și a constructorilor Java.
În contrast cu timpul de compilare al claselor construite prin declarații ale Java, JavaScript suportă un număr mic de tipuri de date reprezentând valori numeric, Boolean și string. JavaScript are un model de prototipuri de obiecte în schimbul modelului clasei de obiecte comune. Model de prototipuri de obiecte prevede moștenire dinamică; adică, ceea ce este moștenit poate varia pentru obiectele individuale. JavaScript suportă, de asemenea, funcții fără vreo cerință specială pentru declararea lor. Funcțiile pot fi proprietăți ale obiectelor, executate ca metode de sine stătătoare.
JavaScript este un limbaj mai puțin riguros comparativ cu Java. Nu trebuie să declari toate variabilele, clasele și metodele. Nu trebuie să îți faci probleme dacă metodele sunt publice, private sau protejate, și nu trebuie să implementezi interfețele. Variabilele, parametrii și tipurile returnate de funcții nu sunt scrise explicit.
Java este un limbaj de programare bazat pe clase, desenat pentru execuție rapidă și scriere sigură. Scriere sigură înseamnă, de exemplu, că nu poți să modifici tipul integer într-o obiect referință sau să accesezi memoria privată prin coruperea octeților de cod Java. Modelul bazat pe clase al Java înseamnă că programele sunt formate exclusiv din clase și metodele lor. Moștenirea claselor în Java și scrierea sigură are nevoie de niște ierarhii de obiecte bine cuplate. Aceste cerințe fac ca programarea Java să fie mult mai complexă decât programarea JavaScript.
În contrast, JavaScript descinde din niște limbaje mici, dinamice cum ar fi HyperTalk și dBASE. Aceste limbaje de scripting oferă unelte de programare pentru o varietate mai mare de utilizatori, din cauza sintaxei ușoare, funcționalității specializate si cerințelor minimale pentru crearea obiectelor.
3.2. PHP
PHP, acronim care provine din „PHP: Hypertext Preprocessor”, este un limbaj de scripting utilizat pe scară largă, realizat și distribuit în sistem Open Source, care este special realizat pentru a dezvolta aplicații web, prin integrarea codului PHP în documente HTML. Sintaxa sa provine din C, Java și Perl și scopul principal al limbajului este acela de a scrie rapid pagini web dinamice.
3.2.1. Istoric
La fel ca multe alte proiecte software importante, PHP s-a născut sub forma unui mic utilitar cu care trebuia să se rezolve o problemă simplă și foarte particulară. În 1995, un programator pe nume Rasmus Lerdorf și-a publicat CV-ul în pagina sa Web. Pentru ca să poată să urmărească cine i-a vizitat pagina, Rasmus a introdus în pagină un tag special și a scris în Perl un script CGI care să colecteze informații despre vizitatori, pe care apoi le scria într-un jurnal (log). A botezat acest cod PHP (Personal Home Page) tools. Mai apoi, în cadrul unui proiect „de serviciu”, a trebuit să realizeze o interfață între clienții de pe Web și o bază de date. A recurs la aceeași idee: taguri HTML proprii, procesate de un script CGI (de data aceasta scris în C) care le înlocuia cu conținutul care trebuia inserat în pagină. A numit aceste taguri „Form Interpreters” (FI) deoarece rolul lor era de a prelua datele transmise prin formulare HTML și de a le transforma în variabile simbolice pe care le folosea apoi pentru interogarea bazei de date.
Ce a urmat este destul de simplu: a reunit codul PHP cu FI și l-a făcut public sub numele PHP/FI. Comunitatea programatorilor a făcut restul. Programul a fost corectat, dezvoltat și extins în regim open source, depășind cu mult scopul său inițial. Deși numele PHP s-a păstrat, semnificația sa a devenit alta (cea din titlul articolului – observați caracterul recursiv, similar cu GNU). Ajuns între timp la versiunea 5, PHP este un limbaj de scripting server-side foarte solid, dotat cu peste 1000 de funcții, implementat pe numeroase platforme, conlucrând cu toate serverele Web importante și dispunând de interfețe pentru majoritatea bazelor de date utilizate. Popularitatea sa a crescut neîncetat, statistici Netcraft (nu foarte recente) estimând că PHP este folosit în circa 1,5 milioane de domenii Web.
3.2.2. Ce este PHP?
PHP (acronim recursiv pentru „PHP: Hypertext Preprocessor”) este un limbaj de scripting ce se potrivește producției Web și poate fi încapsulat în HTML.
Orice script PHP diferă față de un script scris în alte limbaje cum ar fi Perl sau C – în loc de a scrie un program cu o mulțime de comenzi pentru a produce un HTML, scrii un script HTML ce include cod pentru a realiza ceva. Codul PHP este delimitat de coduri de start și de sfârșit ce îți permit să intri și să ieși din „modul PHP”.
Diferența dintre PHP și alt limbaj de scripting cum ar fi JavaScript este acela că PHP este executat pe server, pe când JavaScript este executat pe calculatorului clientului (de navigatorul de Internet). Când rulezi un script pe serverul tău, clientul primește doar rezultatele scriptului ce este rulat, fără a vedea în nici un fel codul din spatele acestuia. Îți poți chiar configura serverul de web ca acesta să îți proceseze toate fișierele HTML cu PHP și astfel nu există nici o metodă ca un utilizator să știe de fapt ce există în fișierele tale.
Punctele forte în folosirea PHP-ului sunt că oferă o mulțime de facilități avansate pentru un programator profesional. Deși dezvoltarea PHP-ului este axată pe partea de scripting ce rulează pe server, poți să faci mult mai multe cu el. PHP este în principal axat pe partea de scripting ce rulează pe server, deci poți face orice fac și un program CGI, cum ar fi colectarea de date de la formulare, generarea de conținut dinamic sau trimitere și primire de cookie-uri sau session-uri.
Există trei domenii principale unde sunt folosite scripturile PHP.
Scripturi ce rulează pe server. Acesta este cel tradițional și cel mai important pentru PHP. Ai nevoie de trei lucruri pentru a face să meargă: Interpretorul PHP (CGI sau modul de server), un server de web și un navigator de web. E nevoie ca serverul de web să fie pornit, cu o conexiune PHP instalată. Poți accesa rezultatul programelor PHP cu un navigator prin intermediul serverului de web.
Scripting la linia de comandă. Poți face ca PHP să ruleze fără a fi nevoie de server și de browser, ci doar de Interpretorul PHP
Scrierea de aplicații ce rulează de partea clientului în mod grafic (GUI). Probabil că PHP nu este limbajul cel mai bun de a scrie aplicații cu ferestre pentru Windows sau alte sisteme de operare, dar dacă cunoști PHP foarte bine și vrei să folosești facilitățile avansate ale PHP-ului în aplicațiile ce rulează de partea clientului poți totuși folosi PHP-GTK pentru a scrie astfel de programe. De asemenea, ai posibilitatea de a scrie aplicații ce rulează pe platforme diferite folosind această metodă. PHP-GTK este o extensie a PHP-ului, nedisponibilă în distribuția principală de PHP.
PHP poate fi folosit pe aproape toate marile sisteme de operare, incluzând Linux, multe variante de Unix (incluzând HP-UX, Solaris și OpenBSD), Microsoft Windows, Mac OS X și RISC OS. PHP are, de asemenea, suport pentru majoritatea serverelor de web din prezent. Acestea includ serverele Apache, Microsoft Internet Information Server (IIS), Personal Web Server, Netscape și iPlanet, serverul Oreillz Website Pro, Caudium, Xitami și OmniHTTPd. Pentru majoritatea serverelor PHP are un modul, iar pentru celelalte suportă standardul CGI, PHP putând să lucreze ca un procesor CGI.
Deci, cu PHP, ai libertatea de a alege un sistem de operare și un server de web. Chiar mai mult, ai posibilitatea de a alege programarea procedurală sau programarea orientată obiect, sau chiar să le amesteci. Cu toate acestea, nu orice facilitate a standardului POO este prezentă în versiunea curentă a PHP-ului, multe librării de cod și aplicații mari (incluzând și librăria PEAR) sunt scrise folosind doar POO.
Cu PHP nu ești limitat să scoți rezultat HTML. Posibilitățile PHP-ului includ afișarea de imagine, fișiere PDF și chiar Flash (folosind librăriile libswf și Ming) toate generate instant. Poți de asemenea ca rezultatul tău să fie orice fișier text, cum ar fi XHTML sau orice alte fișiere XML. PHP poate genera automat aceste fișiere și să le salveze în sistemul de fișiere în loc să le afișeze, formând un cache de partea serverului pentru conținutul dinamic.
Una dintre cele mai puternice și importante facilități în PHP este suportul său pentru o gamă largă de baze de date. Scrierea unei pagini de web ce interacționează cu o bază de date este incredibil de simplă. Următoarele baze de date sunt suportate:
De asemenea, are o extensie abstractă a bazei de date DBX ce îți permite într-un mod transparent folosirea oricărei bazei de date ce suportă această extensie. Mai mult, PHP suportă ODBC, standardul Open Database Connection, deci te poți conecta la orice altă bază de date ce suportă acest standard mondial.
PHP are suport pentru conversia cu alte servicii folosind protocoale cum ar fi LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM (pentru Windows) și multe altele.
Poți deschide socket-uri de rețea și să interacționezi între aproape toate limbajele de programare Web. PHP are suport pentru instanțierea obiectelor Java și utilizarea lor într-un mod transparent ca obiecte PHP. Se pot folosi extensii CORBA pentru a accesa obiecte aflate la distanță.
PHP are capabilități extrem de folositoare pentru procesarea textului, de la POSIX Extins sau expresii regulare Perl până la parsarea documentelor XML. Pentru parsarea și accesarea documentelor XML, suportă standardele SAX și DOM. Se poate folosi extensia XSLT pentru a transforma documentele XML.
În cele din urmă, dar nu în ultimul rând, are și alte extensii interesante, cum ar fi funcții ale motorului de căutare mnoGoSearch, funcții pentru accesarea IRC-ului, multe utilitare de compresie (gzip, bz2), conversie de calendar, traducere, ș.a..
3.3. PostgreSQL
3.3.1. Scurt istoric al familiei Postgres
Istoria de 13 ani a dezvoltării RDBMS-urilor din familia Postgres consemnează câteva versiuni reprezentative, ca jaloane pe traiectoria apropierii de compatibilitatea SQL, în condițiile extinderii modelului relațional clasic cu facilități deosebite.
Elaborarea codului original de Postgres a început în 1985, implicând efortul unei echipe numeroase de studenți și programatori, sub conducerea profesorului Michael Stonebraker de la Universitatea Berkeley din California. Illustra Information Technologies va lansa o variantă comercială a acestui cod.
Postgres95, lansat în 1994, aduce, pe lângă ameliorări ale codului (compatibilitate integrală cu ANSI C, reducere a dimensiunii, creșterea performanței), câteva îmbunătățiri majore (limbajul de interogare Postquel a fost înlocuit cu un subset SQL etc.).
În 1996 apare PostgreSQL, cu un nume mai inspirat și cu caracteristici precum: adăugarea de opțiuni semnificative modulului de „backend”, includere de elemente de limbaj compatibile ISO SQL, ANSI SQL/98, SQL/92 și ANSI SQL/89, extinderea setului de tipuri de date intrinseci etc. Server-ul Informix Universal (lansat în 1997) este bazat pe PostgreSQL (ca urmare a cumpărării de către Informix a Illustra Inc.). Versiunea actuală este 6.3.2. și se are în vedere continuarea perfecționării ei. A fost testată pe diverse platforme (aix, alpha, BSD44, bsdi, dgux, hpux, 1386_solaris, irix5, linux, sco, sparc_solaris, sunos4, svr4, ultrix4).
Această succesiune a versiunilor creează oarece probleme de compatibilitate, cerând uneori proceduri de adaptare a unor baze de date create sub versiuni anterioare.
Există, evident, posibilitatea de a opta pentru varianta comercială derivată din modelul Postgres – Illustra, RDBMS care păstrează elementele interesante aduse de acest model, în condițiile unui spor de facilități, robustețe, viteză de prelucrare, calitate a asistării utilizatorului.
3.3.2. Caracteristici generale
Sistemul de gestiune de baze de date PostgreSQL poate fi definit ca fiind: relațional, foarte extensibil, cu orientare obiectuală. Unul din scopurile proiectului de cercetare care a dus la crearea modelului Postgres a fost demonstrarea posibilității de a crea un DBMS esențialmente relațional, cu un mare grad de extensibilitate, cu posibilitatea manipulării de obiecte și reguli complexe.
Sunt incluse facilitățile majore ale modelului relațional clasic, precum cereri declarative în SQL, optimizarea interogării, controlul concurent, tranzacții, suport multiutilizator.
Extensibilitatea (ca posibilitate a utilizatorului de a defini arbitrar operatori, tipuri, funcții și metode de acces) este asigurată printr-un mecanism tipic sistemelor relaționale: ansamblul de cataloage. Spre deosebire de RDBMS-urile standard, Postgres memorează mai multă informație în aceste cataloage (nu numai date despre tabele și coloane, dar și despre tipuri, funcții, metode de acces). Aceste cataloage apar utilizatorului ca niște clase oarecare, la care poate avea acces. Astfel, se pot face extensii care în RDBMS-urile convenționale se fac doar modificând codul de bază al produsului sau adăugând noi module scrise special de furnizorul respectivului RDBMS. Serverul Postgres poate încorpora cod scris de utilizator prin încărcare dinamică.
Categorisirea ca „obiectual-relațională” reflectă existența unor facilități specifice orientării obiect (ex.: conceptul de clasă, echivalent cu cel de tabel din sintaxa tip SQL, moștenirea de către o clasă nou creată a atributelor unei clase existente etc.), în condițiile asigurării, în același timp, și a caracteristicilor de bază de date relațională și suportării limbajelor de interogare tradiționale corespunzătoare (ceea ce nu asigură sistemele de gestiune de baze de date considerate „orientate obiect”).
Faptul că acest spectru de facilități este de interes a primit diverse confirmări. Baze de date comerciale au înglobat opțiuni propuse pentru prima dată în Postgres. În cadrul unor proiecte de anvergură, s-a ales acest RDBMS pentru memorarea unor structuri mai complexe – date și programe – de diverse tipuri (exemple: baze de date de imagini cu regăsire de imagini pe baza unor criterii de selecție, integrarea unui GIS de tip GRASS (sistem de informare geografic, un alt produs de interes din domeniul public) pentru compactizare și exploatare mai eficientă etc. Produsul a mai fost, de asemenea, folosit la dezvoltarea de diverse aplicații în cercetare și producție (sistem de analiză date financiare, pachete de monitorizare performanțe motoare, bază de date de trasare asteroizi, baze de date de informații medicale etc.) și a fost utilizat în mai multe universități ca model demonstrativ.
3.3.3. Elemente de performanță
Viteza de tratare a unei cereri utilizator depinde (alături de alte alți factori: configurație hardware a platformei, sistem de operare etc.) de dimensiunea bazei de date și complexitatea cererii. Sunt suportate baze de date de mari dimensiuni (peste 200 Gbytes), dar performanțele scad vizibil la tratarea bazelor mai mari de 5 Gbytes pe mașinile cu procesor pe 32 biți. Exploatarea bazelor de date de mari dimensiuni este recomandată doar pe mașinile pe 64 biți.
3.3.4. Arhitectură produs
PostgreSQL este construit conform unui model client/server proces per utilizator. În fiecare sesiune, sunt implicate trei procese Unix cooperante: postmaster (proces supervizor tip demon, gestionând comunicația dintre procesele „frontend” și „backend”, efectuând inițializări, alocări de memorie etc.), „backend” (procesul server de baze de date; postmaster-ul inițiază un nou proces backend pentru fiecare nouă conectare; acest proces este cel care asigură tratarea interogărilor; rulează întotdeauna pe mașina server), „frontend” (proces cerând conexiune la backend prin intermediul postmaster; poate rula pe altă mașină, de exemplu pe stația de lucru a clientului).
„Garnitura” actuală Postgres include, pe lângă RDBMS-ul propriu zis, o serie de produse destinate administrării acestui tip de baze de date și facilitării dezvoltării de aplicații. Aceste produse s-au cumulat în timp, prin aportul mai multor specialiști din toată lumea (cu contribuții diverse ca factură, anvergură și grad de finisare). În continuare, se amintesc câteva dintre acestea.
3.3.5. Facilități de acces utilizator
Partea de client a Postgres (procesul de tip „frontend”) este monitorul interactiv psql. Prin el se oferă o soluție minimală de acces al utilizatorului. Formularea unor comenzi la nivel linie nu e foarte comodă pentru utilizator și nici pentru administrator. Pentru facilitarea creării, întreținerii și consultării de baze de date s-a impus elaborarea unor utilitare cu interfață grafică și cu un set corespunzător de funcții.
PgAccess este un utilitar de administrare și consultare baze PostgreSQL scris în Tcl/Tk, cu o interfață grafică atrăgătoare și cu serie întreagă de tratări și facilități la nivel de tabele, interogări, secvențe (include și un generator de rapoarte).
Există, de asemenea, MPMGR (interfață pentru administrare grafică), MPSQL (interfață SQL grafică).
3.3.6. Facilități de programare
Se oferă interfețe de programare din C (biblioteca libpq), din C++ (biblioteca libpq++) și soluția de imbricare SQL – „embedded SQL” (apelurile SQL, într-o sintaxă specifică, sunt integrate în aplicația scrisă în C care, înainte de a fi compilată, este prelucrată de preprocesorul ecpg).
Există, de asemenea, pgsql-perl5 (interfață de programare din Perl5), libpgtcl (interfață de programare din Tcl), PyGres95 (interfață de programare din python) etc.
Pentru integrare cu WWW, pentru aplicații simple se poate utiliza interfața PHP (preprocesor hipertext – limbaj de script imbricat în HTML, asistând dezvoltatorii de WWW la scrierea de pagini generate dinamic), iar pentru aplicații mai complexe se poate utiliza un script Perl, lansabil în contextul mecanismului CGI (WDB-P95, o interfață WWW-Postgres).
S-a dezvoltat un driver ODBC pentru PostgreSQL, numit psqlODBC.
Pentru programatorii de Java există un driver JDBC.
S-au scris clase Java dedicate facilitării accesării PostgreSQL.
A apărut și un produs de tip RAD (Rapid Application Development) pentru dezvoltarea rapidă de aplicații Java de accesare PostgreSQL, deocamdată încă nefinisat și interesant mai mult ca perspectivă.
Un context de accesare de utilitate foarte largă ar fi consultarea de la nivelul unui server WWW, prin intermediul applet-urilor Java (utilizând pachetele awt pentru interfața grafică cu utilizatorul și sql pentru interfațarea cu RDBMS-ul) apelând driverul JDBC pentru Java. Se poate asigura o bună interfațare cu utilizatorul comun (care, în mod uzual, nu cunoaște structura bazei respective și nici limbajul SQL). Prin folosirea funcției JDBC de obținere de metainformații despre o bază de date (nume de tabele, coloane etc.) și prin ghidare la nivelul interfeței grafice (ferestre de tip „help”, posibilitate de selectări din meniuri succesive etc.), acest utilizator poate fi asistat în formularea unei interogări SQL.
O certitudine este aceea că elaborarea unor aplicații de exploatare a unor baze PostgreSQL, pornind de la limbajul Java, este o soluție „de viitor”. Adoptarea ei va putea asigura, comparativ cu alte opțiuni de programare amintite (programe C, script-uri Perl etc.) o viteză corespunzătoare de tratare a operațiilor SQL solicitate, în condițiile unei interfețe utilizator mai atractive (ca facilități oferite și ca aspect) și beneficiind de securitatea și portabilitatea garantate de utilizarea limbajului Java.
3.3.7. Concluzii
Prin disponibilitate (posibilitatea de a obține gratuit produsul, documentația, utilitare de dezvoltare aferente) și prin facilitățile oferite, Postgres poate fi util oricărui programator dispus să facă mici eforturi suplimentare pentru a dezvolta, fără achiziționare de software, aplicații viabile. Unități care au nevoie de un sistem de consultare facilă a unor seturi de date și care nu dispun de resursele necesare achiziționării unor RDBMS-uri comerciale puternice sau nu au, în general, cerințe informatice de un volum și o complexitate care să justifice investiția în software ar putea prefera o soluție bazată pe utilizarea acestui produs.
Unele facilități specifice (posibilitatea de a-și modifica modul de operare „din mers”, în urma extensiilor utilizator, posibilitatea existenței unor atribute non-atomice ale unei relații, elementele de orientare obiect) impun Postgres ca un instrument deosebit de adecvat pentru constituirea rapidă de prototipuri în dezvoltarea de noi aplicații și structuri de date (care pot fi de o mare complexitate).
3.4. MySQL (comparație cu PostgreSQL)
Când vorbim despre baze de date vorbim despre sisteme de gestiune (sau administrare, sau management) a bazelor de date, adică despre niște softuri specializate pe manevrarea cât mai eficientă și cât mai sigură a unor volume mari de date. Dacă excludem din discuție sistemele desktop și sistemele înglobate (embedded), rămânem cu o categorie numită generic „servere de baze de date”.
În ultima vreme au apărut servere de baze de date gratuite, dezvoltate și furnizate în regim open source. Mai mult, acestea au încetat să mai fie curiozități sau experimente exotice și, în unele privințe, au ajuns să fie comparabile cu sistemele comerciale. Răspândirea acestor sisteme, deși foarte rapidă, este relativ limitată din punctul de vedere al utilizării: majoritatea instalărilor sunt menite să furnizeze un back-end pentru aplicații pentru Internet sau intranet. Un alt domeniu în care sistemele gratuite au o nișă perfectă este învățământul. Fie că este vorba de universități, fie că este vorba de autodidacți, aceste sisteme reprezintă alegerea firească (și, uneori, singura posibilă).
Cele mai răspândite sisteme gratuite la momentul de față sunt MySQL și PostgreSQL. În ultima vreme, rivalitatea dintre ele a atins cotele unui veritabil „război religios”, comparabil cu cel dintre comunitatea Linux și Microsoft. Dar, chiar dacă ambele produse sunt gratuite, alegerea serverului de baze de date cel mai potrivit este o alegere importantă, care poate afecta desfășurarea întregului proiect.
3.4.1. Istoria MySQL
MySQL a fost până de curând creația solitară a unui programator pe nume Michael Widenius, lucrând la firma suedeză TcX. Prima versiune a apărut în 1995 și avea scopul precis de a furniza un back-end rapid și stabil pentru situri Web cu pagini generate dinamic. În acest scop, proiectul a fost direcționat în mod preponderent spre performanță. După ce dezvoltarea a trecut la modelul open source, echipa de programatori a crescut, iar unele firme comerciale contribuie și ele la dezvoltarea motorului și a unor instrumente adiacente.
În vreme ce MySQL a fost orientat spre viteză și simplitate, Postgres a fost un banc de probă pentru toate experimentele de la Berkeley. MySQL a fost scos în open-source pentru a adăuga funcționalitate unui program aflat sub un control strict, în timp ce PostgreSQL a ieșit în open-source (părăsind Universitatea Berkeley) pentru a permite unui grup de programatori să „curețe” și să organizeze cele 250.000 de linii de cod pentru a obține performanță și stabilitate păstrând o funcționalitate bogată. MySQL este sub licență GPL (GNU General Public License) în timp ce PostgreSQL este sub licență BSD, ambele licențe fiind recunoscute ca „open source” de către OSI (Open Source Initiative).
3.4.2. Standardul SQL
Ambele produse folosesc dialecte SQL, dar compatibilitatea cu standardul ANSI SQL (92) diferă. Ambele dispun de un set de extensii față de standard și ambele sunt lipsite de anumite funcționalități prevăzute de acesta.
O primă constatare de ordin general este că MySQL este mai comod în faza de creare a bazelor de date, fază în care se lucrează de obicei iterativ, cu un script. Aceasta se datorează câtorva extensii prezente în MySQL precum și unor lipsuri din PostgreSQL. Astfel, în MySQL pot să scriu într-un script de generare ceva de genul următor:
Remarcăm mai întâi opțiunea IF NOT EXISTS, care va evita apariția unei erori în situația în care tabela Alfa există deja, așa cum IF EXISTS va evita o eroare la DROP TABLE în cazul în care tabela Alfa nu există. Apoi, este interesantă posibilitatea de a crea o tabelă și totodată de a o popula cu ajutorul unei selecții (în exemplul de mai sus tabela „ajutătoare” Beta este dintr-o alta bază de date). De notat că definițiile câmpurilor specificate în SELECT sunt adăugate la definiția tabelei, astfel încât (în cazul nostru) tabela Alfa va avea coloanele a, b, id și cont. (Obs: această facilitate există și în PostgreSQL, cu o sintaxă diferită: CREATE TABLE AS).
Un alt punct roșu merită MySQL pentru implementarea comenzii ALTER TABLE, care extinde în mod copios standardul SQL. Pe lângă numeroase clauze suplimentare, avem posibilitatea să folosim mai multe clauze în aceeași comandă ALTER TABLE. De pildă:
PostgreSQL este departe încă la acest capitol. ALTER TABLE nu poate decât să adauge sau să redenumească coloane și să schimbe numele tabelei. Pentru orice alte modificări trebuie creată o tabelă temporară. De pildă, pentru a adăuga o simplă clauză NOT NULL unei coloane col, în PostgreSQL se procedează așa:
În plus, mulți utilizatori s-au lovit de o comportare ce creează confuzii în mediul PostgreSQL în scripturile de generare: dacă se șterge o tabelă având o coloană declarată SERIAL, la tentativa de a crea din nou tabela cu același nume se produce o eroare. Motivul este că SERIAL creează o secvență implicită al cărei nume este derivat din numele tabelei. DROP TABLE nu șterge și secvența, deci la un nou CREATE TABLE secvența implicită nu poate fi creată pentru că există deja.
3.4.3. Selecții
În materie de selecții, fiecare dintre produse are un punct slab și unul forte. În primul rând, MySQL nu poate face subselecții. Este, fără îndoială, unul dintre cele mai mari bile negre ale acestui produs. În unele operații suficient de simple această deficiență poate fi depășită relativ ușor. De pildă, selecția PostgreSQL de mai jos
poate fi transcrisă în MySQL astfel:
Dar, pentru selecții mai complexe, manualul ne sugerează să folosim tabele temporare (care însă pot deteriora serios performanțele) sau să rezolvăm problema în limbajul procedural al aplicației (ceea ce de regulă se traduce prin înglobarea în selecție a rezultatelor subselecției).
În cele ce urmează voi prezenta un exemplu concret care sugerează complicațiile care pot să survină: avem o asociere many-to-many între niște firme (identificate prin c_id) și niște persoane (identificate prin p_id) printr-o tabelă Contact. Pentru o firmă dată (să zicem: firma) vreau să aflu persoanele care nu sunt asociate cu această firmă. În Postgres e simplu:
De data aceasta în MySQL nu se poate recurge la o transcriere cu outer join, așa că trebuie să mă conectez la baza de date MySQL prin ODBC, și fragmentul de sursă PHP redus la esențial va arăta astfel:
Rezolvarea e corectă, dar trebuie să ținem seama de faptul că dimensiunea maximă a unei instrucțiuni SQL este limitată (1048574 octeți în MySQL) și că penalizarea la viteză poate fi semnificativă.
Din nefericire, în MySQL lipsesc nu doar subselecțiile, ci și operațiile cu seturi (UNION, INTERSECT, EXCEPT etc.), fapt care complică și mai mult anumite operații. De notat că absența subselecțiilor nu se restrânge doar la condițiile din WHERE, ci este valabilă oriunde poate să apară o selecție în cadrul altei selecții. În MySQL nu pot să folosesc selecția în WHEN.
Pe de altă parte PostgreSQL nu dispune de outer join. Explicația acestei lipse provine, probabil, din faptul cu profesorul Stonebraker (părintele Postgres-ului) a fost un adversar al SQL-ului. De altfel un alt „guru” al bazelor de date, Chris Date, spune foarte clar în celebra sa carte de baze de date: „However, we do not advocate direct support for that operation (at least as usually understood), because we believe there are better solutions to the problem that outer join is intended to solve”.
Un exemplu poate fi edificator. Se presupunem că vreau să obțin o listă cu toate persoanele, pentru fiecare persoană afișând și numărul de firme pe care le reprezintă. Persoanele care nu reprezintă nici o firmă vor avea zero în această coloană.
În MySQL:
În PostgreSQL, va trebui să folosesc o joncțiune simplă (care nu aduce însă persoanele care nu figurează în tabela Contact) și apoi să adaug (prin UNION) persoanele care nu reprezintă nici o firmă:
Pare mai complicat, dar trebuie să remarcăm faptul că procedeul este întotdeauna aplicabil și, mai mult chiar, permite simularea tuturor formelor de outer join (MySQL nu dispune decât de LEFT OUTER JOIN).
3.4.4. Foreign key
Așa-numitele „restricții” (sau „constrângeri” – constraints) au fost mereu un subiect tabu în lumea bazelor de date relaționale. Dintre acestea, cea numită FOREIGN KEY este un caz special deoarece ea este menită să asigure integritatea referențială unei baze de date (una dintre cele 12 reguli enunțate de Dr. Codd), iar unii experți refuză să încadreze un SGBD în categoria relațională dacă nu implementează această restricție într-o manieră declarativă.
MySQL nu dispune de această caracteristică, dar permite scrierea clauzelor foreign key pentru „compatibilitate” și cu scop explicativ. Mai mult chiar, creatorii lui MySQL explică în manual că aceste chei străine nu sunt recomandate și, de fapt, nu avem nevoie de ele niciodată.
PostgreSQL, în schimb, dispune de o implementare riguroasă a standardului SQL92 pentru foreign key, atât ca restricție la nivel de coloană cât și la nivel de tabelă.
De notat ar fi câteva dintre avantajele utilizării restricției foreign key, nu înainte de face observația că Postgres adaugă automat restricția NOT NULL pentru coloanele care fac parte dintr-o cheie primară.
În primul rând, tentativa de a insera un contact incorect se soldează cu o eroare. Ce trebuie luat în considerare este că incoerențele din baza de date vor provoca erori greu de depistat în alte aplicații.
În al doilea rând, anumite reguli de operare sunt aplicate automat, centralizat (deci nu sunt lăsate pe seama programelor de aplicație) și în mod consistent. Aceasta înseamnă că, de exemplu, ștergerea unei înregistrări va atrage după sine ștergerea tuturor contactelor aferente, într-o singură tranzacție.
Pe de altă parte, integritatea referențială implică anumite costuri care nu sunt deloc neglijabile din perspectiva timpului de răspuns. Pentru aplicațiile care lucrează interactiv, o secundă în plus sau în minus nu contează. Pentru operațiile batch, există o variantă mai bună:
Restricțiile pot fi „amânate” (deferred), operațiile batch (în cazul acesta COPY) funcționând cu toată viteza, verificările ce consistență fiind făcute abia la sfârșitul.
3.4.5. Caracteristici
MySQL nu are noțiunea de View. Se poate folosi și fără aceste tabele virtuale, dar pentru aplicații complexe ele sunt extrem de importante, fie și doar dintr-un singur motiv: adaptabilitatea. MySQL nu are proceduri stocate și, în general, nici o modalitate de a păstra elemente procedurale (server-side programming).
PostgreSQL excelează însă la acest capitol. O modalitate simplă o reprezintă așa numitele rules (reguli), care permit definirea unor acțiuni simple care să aibă loc atunci când o tabelă (stocată sau virtuală) este accesată. PostgreSQL mai permite și scrierea de funcții server-side în mai multe limbaje: SQL, PL/PGSQL (o extensie procedurală asemănătoare cu PL/SQL din Oracle), TCL, PERL și C. Mai mult chiar, se pot programa noi tipuri de date împreună cu operatorii corespunzători acestora. PostgreSQL permite să atașăm tabelelor „declanșatoare” (triggers), care să fie lansate în execuție automat atunci când se încearcă o operație INSERT, UPDATE sau DELETE asupra tabelei în cauză, înainte sau după operație, la nivel de linie (ROW) sau instrucțiune. Cu ajutorul acestor triggers se pot verifica condiții complexe de integritate (de altfel restricțiile foreign key sunt implementate prin generarea automată a unor triggers) sau se pot realiza automat operații suplimentare. De pildă, transferarea actualizărilor de pe un view pe tabelele de bază. PostgreSQL știe cursoare, derulabile înainte și înapoi (cu FETCH).
3.4.6. Tranzacțiile
MySQL nu are suport pentru tranzacții. Instrucțiunile begin, commit și rollback au în MySQL o semnificație diferită de cea din standardul SQL: begin va determina trecerea în modul de lucru non-autocommit (ceea ce înseamnă ca actualizările sunt făcute în memorie) iar commit și rollback determină revenirea în mod autocommit, cu sau (respectiv) fără transcrierea pe disc a actualizărilor realizate în memorie. Nu se asigură însă nici caracterul atomic al setului de instrucțiuni și nici izolarea acestora de operațiile altor utilizatori ai bazei de date.
Observație: Începând de la versiunea 3.23.15, MySQL poate lucra împreună cu Berkeley DB, care furnizează lui MySQL un handler de tabelă „transaction safe”.
În schimb, suportul tranzacțional din PostgreSQL este recunoscut ca fiind state of the art (mulți programatori afirmă că este la ora actuală cel mai bun de pe piață) și se bazează pe controlul concurenței prin versiuni multiple (MVCC – Multi-Version Concurrency Control), asigurând în mod complet caracteristicile cunoscute sub numele ACID (caracterul atomic al tranzacțiilor, consistența, izolarea și persistența).
Postgres permite, de asemenea, stabilirea nivelului de izolare a tranzacțiilor la read-commited (nivelul implicit) sau serializable (asigură izolarea totală). În strânsă legătură cu tranzacțiile sunt mecanismele de blocare (locking) pe care cele două produse le oferă. În Postgres, tranzacțiile folosesc în mod implicit mecanismul de blocare, așa că arareori se folosește instrucțiunea LOCK pentru a impune o blocare mai „tare” (la nivel de linie sau tabelă) decât cea oferită implicit de program. De obicei, această soluție este adoptată atunci când se lucrează în mod read-commited dar, pentru anumite grupuri de operații critice, se dorește o izolare totală. Blocarea explicită nu poate apare decât în cadrul unei tranzacții. Nu există UNLOCK, piesele blocate sunt deblocate la încheierea tranzacției (prin COMMIT sau ROLLBACK). De remarcat că PostgreSQL oferă o extensie prin care se poate obține blocarea exclusivă la selecție: SELECT FOR UPDATE.
MySQL oferă instrucțiunile LOCK și UNLOCK (desigur, blocările sunt folosite și implicit). Spre deosebire de Postgres, blocarea se face doar la nivelul tabelei și nu există time-out (de altfel nici nu ar avea rost, deoarece nu există posibilitatea de rollback în cazul unui deadlock). Blocarea la nivel de tabelă poate conduce la degradarea semnificativă a vitezei atunci când se lucrează în regim intens concurențial.
3.4.7. Moștenirea
Suportul așa-zis „obiectual” din Postgres este o caracteristică unică în lumea bazelor de date relaționale. O tabelă poate fi definită pe baza altei tabele, moștenind anumite caracteristici ale tabelei de bază:
Tabela Angajat va avea toate câmpurile tabelei Pers plus câmpurile marca și salariu. Cele două tabele pot fi tratate independent. Avantajul acestei abordări o reprezintă posibilitatea de a efectua selecții asupra unei tabele și a tabelelor care o moștenesc. Până la versiunea 7.1, o selecție asupra unei tabele returna doar liniile tabelei. Pentru a obține și liniile din tabele moștenitoare, se folosea marcajul „*” aplicat numelui tabelei:
Cererea de mai sus returnează atât conținutul tabelei Pers cât și conținutul tabelei Angajat (desigur, doar câmpurile comune).
Începând de la versiunea 7.1, comportamentul va fi schimbat, eliminându-se marcajul. O selecție în Pers va merge în mod implicit și în tabelele moștenitoare. Pentru a limita selecția la Pers, se va scrie:
Comparația nu este nici pe departe încheiată. Se mai poate vorbi despre suportul pentru stocarea datelor binare nestructurate (BLOBs), despre sistemul de securitate (unde MySQL oferă o granulație mai fină decât PostgreSQL), despre interfețele de acces din diverse limbaje și medii de dezvoltare (unde ambele stau foarte bine), despre utilitarele de și, nu în ultimul rând, despre stabilitate, performanță și scalabilitate.
La acest capitol, lucrurile sunt destul de confuze, deoarece realizarea unor teste comparative este extrem de dificilă. Intervin probleme legate de fine-tuning (de pildă, alegerea tipurilor de tabele în MySQL sau a tipurilor de indecși în PostgreSQL), care pot merge până la nivelul compilării surselor. Probleme legate de alegerea tipurilor de selecții, de simularea încărcării, de dimensiunile tabelelor, de opțiunile folosite pentru rulare.
MySQL este semnificativ mai rapid pentru cereri simple (aici întrecând toate sistemele comerciale), dar performanțele tind să se degradeze pe măsură ce crește complexitatea cererilor și numărul de clienți concurenți (blocarea la nivel de tabelă poartă o mare parte din vină). La capitolul stabilitate, MySQL excelează, dar versiunile noi ale lui Postgres au adus ameliorări semnificative. Scalabilitatea pare să fie mai bună în cazul lui Postgres.
Ambele sisteme au în lucru completarea lipsurilor în funcționalitate, așa că este foarte probabil ca în curând MySQL să dispună de subselecții iar PostgreSQL de outer join. Problema suportului tranzacțional din MySQL este mult mai complicată, deoarece ar impune modificări substanțiale la nivelul structurii de stocare a tabelelor. Este însă evident că este vorba de un compromis: o funcționalitate mai bogată tinde să reducă performanțele și invers.
Dacă cerința este ca SGBD-ul să ruleze sub Windows, PostgreSQL cade (rulează doar pe Unix-uri). MySQL are versiuni pentru Windows 95/98 și NT/2000/XP, stabile și rapide.
Dacă integritatea datelor este esențială (de pildă pentru aplicații în domeniul financiar), PostgreSQL este obligatoriu. MySQL nu poate să garanteze integritatea datelor, chiar dacă este posibil să se lucreze ani de zile fără nici o problemă.
Dacă integritatea datelor nu este critică, complexitatea este redusă și nevoia de viteză este cheia, MySQL este alegerea cea mai atractivă mai ales pentru aplicații Web, datorită mecanismului extrem de rapid de conectare.
Dacă aplicația este de mare complexitate, mecanismele procedurale din PostgreSQL vor permite centralizarea anumitor procesări și impunerea unor invarianți extrem de valoroși pentru coerența ansamblului de aplicații.
3.5. Alegerea
În alegerea limbajului de scripting și a bazei de date am luat în calcul mai multi factori: ușurința instalării uneltelor, portabilitatea lor (independența față sistemul de operare), cerințele de sistem, costul lor, ușurința in exploatare, timpul de implementare, etc.
3.5.1 Limbajul de scripting: PHP
Alegerea PHP – ului ca limbaj de dezvoltare a fost determinată mai ales de dificultățile întâmpinate în dezvoltarea aplicației: descărcarea sdk – ului de java si a unui server WEB care să suporte paginile jsp, download de dimensiuni considerabile, erori apărute datorită setului de caractere folosit, întârzierea apariției primelor rezultate, dezvoltarea necesitând multe etape premergătoare. PHP – ul s-a dovedit un instrument foarte fiabil si ușor de folosit. Astfel paginile html au fost transformate in pagini dinamice foarte rapid, rezultatele apărând imediat. Principala problemă de utilizare a PHP – ului a fost lipsa unui suport real pentru programare orientată pe obiecte, acest lucru fiind ocolit fără dificultăți prea mari prin introducerea funcțiilor refolosite într-un singur fișier de unde au fost apelate ori de câte ori a fost nevoie.
3.5.2. Baza de date: MySQL
Au fost luate in calcul două baze de date: MySQL si PostgreSQL. Greutățile întâmpinate în utilizarea Postgresului: problemele întâmpinate la instalarea Postgresului sub Windows, importul unei baze de date existente, mecanismul destul de încurcat la definirea tabelelor, a constrângerilor si a regulilor. Ținând cont de anvergura destul de redusă a bazei de date și a numărului redus de utilizatori care pot face modificări de amploare în baza de date, MySQL s-a dovedit soluția perfectă prin ușurința implementării folosirii și modificării bazei de date.
CAPITOLUL 4 Prezentarea platformei
4.1. Baza de date
Pentru crearea bazelor de date aferente s-a folosit utilitarul MySQL. Baza de date conține 3 tabele aferente aplicației. Tabelele sunt următoarele: identity, contract si users.
Tabela users are următoarea structură:
Această tabelă reține utilizatorii și parolele aferente conturilor respective; conține două înregistrări name, care reprezintă numele contului, respectiv pwd, care reține parola aferentă contului respectiv; cele două înregistrări sunt de tip VARCHAR. Numele contului, name, este stocat în baza de date sub forma unei înregistrări de tip string, necodificată. Înregistrarea pwd este reținută în baza de date ca o variabilă de tip string, care este criptată prin metoda MD5.
Definiția funcției MD5:
Această funcție calculează „amestecul” de caractere ale str folosind algoritmul RSA Data Security, Inc. MD5 Message-Digest și returnează acel șir. Acest șir este un număr pe 32 de caractere în format hexadecimal. Dacă este folosită și variabila opțională raw_output și este setată ca TRUE, atunci funcția md5 returnează un șir în format uzual cu lungimea de 16 caractere.
Criptarea care se face este ireversibilă, adică nu există un algoritm de decriptare al parolei introduse. Uitarea parolei se poate remedia doar prin introducerea uneia noi.
Tabela identity are următoarea structură:
Tabela identity reține datele de identificare despre abonat, indiferent dacă este persoană fizică sau persoană juridică.
Câmpurile aferente tipului de abonat persoană fizică sunt: id, forma, nume, prenume, oras, strada, numar, telefon, bloc, scara, etaj, apartament, codpostal, serie, nrbuletin, cnp, data, sectia si judet.
Câmpurile aferente tipului de abonat persoană juridică sunt: id, forma, numefirma, email, web, oras, strada, numar, telefon, bloc, scara, etaj, apartament, codpostal, nrinreg, codfiscal, reprezentant, judet, cont si banca.
Majoritatea câmpurilor sunt de tipul VARCHAR, adică pot să conțină atât cifre, cât și litere.
Câmpul id este de tipul int, cu proprietatea EXTRA auto_increment, adică acest câmp se incrementează automat la adăugarea unui nou abonat in baza de date. Datorită acestui fapt în baza de date nu pot să existe la un moment dat doi abonați care să aibă același id.
Câmpul forma se referă la natura persoanei, adică dacă este persoană fizică sau persoana juridică. Se va vedea mai departe în această lucrare că se face despărțirea între persoanele fizice și persoanele juridice, deoarece nu trebuie completate aceleași câmpuri la cele 2 tipuri de persoane.
Câmpul nume reprezintă numele persoanei fizice care încheie un contract pentru oferirea serviciului respectiv.
Câmpul numefirma reprezintă numele persoanei juridice care solicită aceste servicii.
Câmpul prenume reprezintă prenumele persoanei fizice care încheie un contract pentru oferirea serviciului respectiv.
Câmpul email reprezintă e-mail-ul persoanei juridice care încheie un contract pentru oferirea serviciului respectiv.
Câmpul web reprezintă site-ul persoanei juridice care încheie un contract pentru oferirea serviciului respectiv.
Câmpul oras reprezintă numele orașului în care își are domiciliul persoana fizică sau persoana juridică la care se face referire.
Câmpul strada reprezintă numele străzii unde își are domiciliul persoana fizică sau persoana juridică la care se face referire.
Câmpul numar reprezintă numărul străzii unde își are domiciliul persoana fizică sau persoana juridică la care se face referire.
Câmpul telefon reprezintă numărul de telefon al persoanei fizice sau al persoanei juridice la care se face referire.
Câmpul bloc reprezintă numărul blocului unde își are domiciliul persoana fizică sau persoana juridică căreia i se oferă aceste servicii.
Câmpul scara reprezintă numărul scării unde își are domiciliul persoana fizică sau persoana juridică căreia i se oferă aceste servicii.
Câmpul etaj reprezintă numărul etajului unde își are domiciliul persoana fizică sau persoana juridică căreia i se oferă aceste servicii. Dacă persoana fizică stă la parter sau sediul firmei respective este la parter, valoarea câmpului etaj va fi 0.
Câmpul apartament reprezintă numărul apartamentului unde își are domiciliul persoana fizică sau persoana juridică căreia i se oferă aceste servicii.
Câmpul codpostal reprezintă codul poștal al străzii unde își are domiciliul persoana fizică sau persoana juridică căreia i se oferă aceste servicii.
Câmpul serie reprezintă buletinului sau al cărții de identitate al persoanei fizice căreia i se oferă aceste servicii.
Câmpul nrbuletin reprezintă numărul buletinului sau al cărții de identitate al persoanei fizice căreia i se oferă aceste servicii.
Câmpul cnp reprezintă numărul codul numeric personal al persoanei fizice căreia i se oferă aceste servicii.
Câmpul data reprezintă data eliberării buletinului sau al cărții de identitate al persoanei fizice căreia i se oferă aceste servicii. Acest câmp are formatul: AAAA-LL-ZZ, adică anul eliberării (AAAA), luna eliberării (LL) și ziua eliberării (ZZ).
Câmpul sectia reprezintă numărul secției de poliție sau numele inspectoratului de poliție care a eliberat buletinul sau cartea de identitate a persoanei fizice căreia i se oferă aceste servicii.
Câmpul nrinreg reprezintă numărul de înregistrare la Registrul Comerțului al persoanei juridice căreia i se oferă aceste servicii.
Câmpul codfiscal reprezintă codul fiscal care se găsește pe certificatul de înregistrare al persoanei juridice căreia i se oferă aceste servicii.
Câmpul reprezentant reprezintă numele reprezentantului legal al firmei căreia i se oferă aceste servicii.
Câmpul judet reprezintă numele județului în care își are domiciliul persoana juridică căreia i se oferă aceste servicii.
Câmpul cont reprezintă numărul contului din bancă al persoanei juridice căreia i se oferă aceste servicii.
Câmpul banca reprezintă numele băncii în care are deschis un cont persoana juridică căreia i se oferă aceste servicii.
Tabela contract are următoarea structură:
Tabela contract reține datele referitoare la serviciile oferite către abonat și datele referitoare la data de începere si data de încheiere a contractului, indiferent dacă este persoană fizică sau persoană juridică.
Câmpul nrcontract este de tip întreg, reprezintă numărul de contract asociat acestui abonat și are aceeași valoare cu id-ul abonatului, adică daca abonatul Popescu are id-ul 20, același abonat va avea numărul de contract 20.
Câmpurile date_incepere și data_incheiere au tipul date și reprezintă data de începere a contractului, respectiv data de încheiere a contractului. Pentru ca datele să fie validate trebuie ca data de începere să fie mai mică decât date de încheiere.
Câmpul tip_serviciu reprezintă tipul de servicii dintre care un abonat poate să aleagă când semnează contractul. Acest câmp are tipul SET, adică dintre toate serviciile el trebuie să aleagă cel puțin unul pentru validarea cererii lui.
Câmpul abonat reprezintă tipul de abonat, care poate să fie de două tipuri: standard sau protocol. Abonații de tip protocol sunt scutiți de plata anumitor servicii.
Câmpul observatii este destinat notării de observații referitoare la acest abonat sau la serviciile selectate de el.
Câmpul rau_platnic specifică dacă abonatul este cu plata la zi sau are restanțe. Inițial el este setat la valoarea „nu”.
4.2 DIAGRAMA ENTITATE-ASOCIERE
4.2 INTERFATA DE LOGARE
]4.2.1 PAGINA DE LOGARE
La prima accesare a aplicației, pagina care este accesată este index.php, care coincide cu pagina de login a utilizatorului. Aceasta are următoarea interfață:
În această pagină sunt introduse username-ul și parola necesare accesării bazei de date INTERNET. După cum se poate observa din această imagine, câmpul user este selectat implicit, putându-se introduce direct numele utilizatorului. După aceasta se poate trece la introducerea parolei, urmând apoi apăsarea tastei ENTER sau apăsarea cu ajutorul mouse-ului a imaginii verzi tip „OK”.
De asemenea, în partea din dreapta sus este afișată data curentă. Acest lucru se realizează cu ajutorul unei funcții care este creată în JavaScript.
4.2.2. Pagina principală
După ce utilizatorul a introdus corect cele două câmpuri, este direcționat către pagina principală a aplicației, care are următoarea interfață:
Pagina principală este compusă din două parți:
partea meniu:
Din partea meniu pot fi accesate celelalte funcții ale aplicației: Adugare abonat, Vizualizare abonati și Cautare abonati.
Prin apăsarea pe meniul Adaugare abonat, acesta se expandează, permițând utilizatorului alegerea tipului de abonat: persoana fizică sau persoana juridică.
4.2.3. Pagina Adauga abonat
Această pagină este accesată prin selectarea unuia dintre cele două tipuri de persoane. Prin selectarea tipului de persoana, persoana fizică, se ajunge la pagina următoare:
În această pagină se completează datele referitoare la abonatul persoană fizică. Câmpurile indicate cu * sunt câmpuri obligatorii. Necompletarea vreunuia dintre ele, redirectează utilizatorul către aceeași pagină de formular. De asemenea, îi sunt prezentate cauzele pentru care nu a fost făcută validarea datelor introduse:
După completarea tuturor câmpurilor obligatorii, utilizatorul este redirectat către o pagină în care poate să vadă datele completate:
O dată ajunși la această pagină, avem toate datele necesare despre un abonat și, în consecință, putem realiza contractul cu acest abonat. Datele despre acest abonat sunt trimise către un fișier de tip Microsoft Word, o dată cu apăsarea butonului Realizează contract care este disponibil în josul paginii Validare abonat.
Inițial acest fișier este de fapt o machetă. Adică, câmpurile care urmează a fi completate sunt înlocuite în fișierul Word cu niște caractere mai speciale, caractere care nu mai apar în document, care ulterior vor fi înlocuite cu datele despre abonat. Deci, fișierul original Word arată în genul următor:
După cum se observă din această imagine anumite cuvinte sunt înconjurate de niște caractere mai speciale. De exemplu, <<numesolicitant>> va fi înlocuit ulterior cu numele persoanei fizice sau juridice, iar <<domiciliu>> va fi înlocuit ulterior cu adresa completă a persoanei. Fișierul de tip Word a fost salvat sub extensia .RTF. Acest lucru a fost efectuat din cauză că s-a folosit o funcție din PHP care face înlocuirea într-un fișier de acest tip a unui cuvânt (<<domiciliu>>) cu valoarea unei variabile. Această funcție este aplicabilă doar acestui tip de fișiere.
Rezultatul final al aplicării acestei funcții este înlocuirea tuturor acestor cuvinte înconjurate de simbolurile <<>>. Se obține următoarea formă a fișierului de tip Word:
Această procedură a realizării contractului este perfect asemănătoare și pentru abonații de tip persoane juridice, singura diferență fiind câmpurile care se completează la secțiunea “Formular de adăugare”.
4.2.4. Pagina Vizualizare abonati
Această pagină este selectată odată cu apăsarea link-ului Vizualizare abonati, link disponibil în partea meniu.
În această pagină sunt afișați toți abonații aferenți acestei baze de date. Ei sunt împărțiți în funcție de forma lor: persoane fizice sau persoane juridice. La fiecare dintre cele 2 categorii sunt afișate doar o parte dintre câmpuri, iar pe lângă aceste câmpuri mai sunt disponibile o serie de acțiuni care pot fi efectuate asupra abonatului respectiv.
Prima acțiune Editare, permite editarea datelor unui abonat.
Prin apăsarea acestui link, utilizatorul este directat către pagina de editare a datelor abonatului:
Aici poate fi editat orice câmp din datele referitoare la acest abonat. Dacă nu se dorește editarea datelor acestui abonat se apasă butonul Back. Dacă se efectuează modificări la datele acestui abonat se apasă butonul OK, Prin apăsarea acestui buton, se efectuează cu ajutorul MySQL-ului modificarea în baza de date.
A doua acțiune Sterge, permite ștergerea unui abonat din baza de date.
Prin apăsarea acestui link este apelată o funcție JavaScript, care deschide o fereastră care permite utilizatorului să aleagă dacă șterge acest utilizator sau nu.
Dacă se apasă Cancel utilizatorul rămâne la aceeași pagina. În schimb, daca se apasă OK, abonatul este șters din baza de date:
Ultima acțiune Facturare, permite realizarea facturii pentru un abonat din baza de date.
La fel ca la realizarea contractului, prin apăsarea acestui link este apelat un fișier machetă, care de această dată este de tip PDF, în care, de asemenea, sunt înlocuite cu valorile variabilelor anumite câmpuri. Pentru ca acest procedeu să se poată realiza, în prealabil, fișierul machetă PDF a fost realizat dintr-un fișier de tip document Word, prin transformarea lui cu ajutorul unui utilitar (PDF Writer). La fel ca la contract au fost introduse niște tag-uri speciale (<<>>,!!!!), în interiorul cărora au fost inserate câmpurile. Fișierul machetă PDF arată în felul următor:
La apăsarea link-ului de facturare, acest fișier este modificat și se obține fișierul final care conține toate datele despre abonat, inclusiv serviciile care îi sunt facturate:
După aceasta fișierul de tip PDF poate fi tipărit pe factură, în acest fel realizându-se scopul principal al acestei aplicații, facturarea automată a serviciilor INTERNET oferite către un anumit abonat.
4.2.5. Pagina Cautare abonati
În interiorul acestei pagini se efectuează căutarea unui abonat după anumite criterii: nume, strada.
Dacă se încearcă căutarea unui abonat, în cazul găsirii unui asemenea abonat se afișează în altă pagină rezultatul căutării:
În caz de nereușită este afișat un mesaj de eroare, prin care se anunță utilizatorul să mai încerce.
4.3. Folosirea sesiunilor (SESSION MANAGEMENT)
În Statele Unite ale Americii raportul (Vezi http://www.census.gov/mrts/www/current.html) Departamentului pentru Comerț arată vânzări prin e-commerce de 10 miliarde USD pentru al doilea semestru fiscal al anului 2002 și cifrele sunt în creștere. În România comerțul electronic este încă în faza incipientă. Totuși o firmă de mărime mică sau medie poate trage avantaje de pe urma unei prezențe solide pe internet, iar această prezență este la îndemâna multor firme, necesitând doar investiții mici. Avantajele sunt evidente. Chiar dacă cifra vânzărilor online va fi încă mică în anii următori, firma va profita de pe urma unui magazin electronic cel târziu când comerțul electronic se va dezvolta și în România. În momentul acela firma va profita de pe urma vizitatorilor adunați până atunci.
Dacă v-ați decis că firma dumneavoastră ar avea de profitat de pe urma unei prezențe pe internet, vă vom arăta în articolul de față cum se realizează un magazin virtual și ce soluții open source puteți folosi pentru a minimiza costurile de implementare.
Open Source: o soluție ieftină
Soluția prezentată în continuare se bazează pe o combinație dedicată: server de web Apache, limbaj de scripting server side PHP, bază de date MySql. Orice serviciu de webhosting, chiar și în România, oferă suport pentru aceste aplicații.
Componenta de bază a unei prezențe online este serverul de web. Apache reprezintă liderul necontestat al acestui domeniu, statisticile indicând că 63% din serverele internet folosesc acest produs. Există versiuni pentru multe sisteme de operare, incluzând evident Linux și Windows.
PHP (Hypertext Preprocessor) este un limbaj de scripting server side foarte răspândit care se pretează deosebit de bine pentru web și care poate fi inserat în cod HTML.
MySql este cea mai populară bază de date open source, proiectată în principal pentru viteză si stabilitate. La ora actuală există peste patru milioane de instalări ale acestui SGBD, printre clienți numărându-se nume sonore precum: NASA, Silicon Graphics și Texas Instruments.
Serverul de web Apache și limbajul de scripting PHP au fost dezvoltate de Apache Software Foundation iar PHP oferă suport nativ pentru MySql.
În PHP există un mecanism interesant și foarte potrivit pentru facilitarea stocării nepersistente a datelor utilizatorului. Să presupunem că există mai mulți utilizatori care pot avea acces simultan la acest sistem. Informații despre aceștia (nume, adresa, username, parola etc.) sunt stocate în baza de date. În momentul în care unul dintre ei accesează sistemul și începe să completeze un formular, avem nevoie de o modalitate de a stoca informațiile separat față de informațiile despre ceilalți utilizatori. Aici intervine mecanismul numit administrarea sesiunilor (session management). Acest mecanism, introdus în PHP4, creează o zonă separată de stocare pe server pentru fiecare ședință de lucru cu clienții. Datele sunt stocate într-un director temporar, pe hardul utilizatorului care accesează pagina respectivă. Datele stocate într-o sesiune sunt valabile atâta timp cât browesr-ul nu este închis. La o nouă accesare a paginii se crează o nouă sesiune care are un id diferit de cele existente.
Astfel vom folosi variabila de sesiune $SESSION[„utilizator”] pentru a stoca numele clientului care a intrat in sistem. Când clientul se loghează, vom seta această variabilă cu datele respective și atâta timp cât această variabilă este definită, vom considera că utilizatorul este logat.
Funcțiile de administrare a sesiunilor oferite de PHP 4 sunt ușor de folosit și foarte utile pentru scopul nostru. Funcțiile cele mai importante sunt:
• session_start() – inițiază mecanismul de session management; trebuie apelată înaintea de oricare altă funcție de lucru cu sesiunile și înainte de orice afișare a vreunei variabile;
• session_register() sau $_SESSION[„numevariabila”] – înregistrează variabile în sesiune.
O bună practică este folosirea unei variabile de tip tablou (array) pentru păstrarea tuturor variabilelor de sesiune. Astfel numele utilizatorului va fi înregistrat folosind
În cazul în care se dorește distrugerea unei variabile dintr-o sesiune pentru a i se atribui o nouă valoare, se folosește funcția session_unregister („numevariabila”).
CAPITOLUL 5 Testarea aplicației
5.1. Instalare
Încă din faza de proiectare a platformei s-a avut în vedere independența față de sistemul de operare. Astfel, platforma funcționează pe majoritatea sistemelor de operare existente și nu necesită mașini de calcul puternice, mergând foarte bine și pe sisteme mai puțin avansate tehnologic. Singura cerință este cea de a exista acces la Internet pentru a se putea accesa aplicația sau să existe o placă de rețea pe calculatorul pe care se rulează aplicația, calculator care nu trebuie să fie neapărat conectat la Internet. Necesitatea existenței plăcii de rețea de datorează faptului că serverul de web rulează pe adresa locală a plăcii de rețea (127.0.0.1 – adresa de loop-back; adresa 127.0.0.1 este echivalentă cu http://localhost)
După instalarea pe calculator a serverului de WEB cu suport PHP și a bazei de date MySQL (un utilitar care instalează toate cele trei aplicații deodată se numește PHPTRIAD), se copiază platforma într-un director conform cerințelor serverului (de obicei, scripturile de copiază la adresa C:\apache\htdocs, iar baza de date la adresa C:\apache\mysql\data și se procedează la configurarea bazei de date.
Pentru executarea cu succes a comenzilor trebuie ca serverul MySQL să fie pornit, de asemenea și serverul de web, în speță, APACHE, trebuie sa fie pornit pentru a se putea rula aplicația.
După ce toate acestea au fost efectuate corect se editează fișierul connect.inc, care se găsește în același director cu scripturile:
<?php
function connect(){
$link=mysql_connect(„„,”„,”„)
or die („Could not connect”.mysql_error());
#print(„Connected on database was successfully ……………”);
mysql_select_db(„internet”,$link);
}
function close(){
$res=mysql_close($link);
}
?>
După cum se observă din acest script de conectare la baza de date, conectarea se face cu username-ul si parola nule. În cazul în care conectarea nu s-a reușit la baza de date se afișează un mesaj corespunzător, mesaj care cuprinde și eroarea și numărul erorii MySQL. Dacă s-a reușit conectarea se selectează baza de date cu care se va lucra în continuare. După ce s-a terminat lucrul cu baza de date, se apelează funcția close(). În acest fel se efectuează conectarea la baza de date în care se mențin informațiile.
După ce s-au parcurs toți acești pași, platforma este gata de folosire cu condiția ca serverul WEB și MySQL-ul să fie pornite.
5.2. Accesarea aplicației
După instalarea platformei se poate efectua logarea cu drepturi depline prin folosirea utilizatorului predefinit „root” cu parola „m@r1us”. Prin folosirea opțiunilor din meniurile care sunt disponibile după logarea utilizatorului pot fi adăugați noi abonații în baza de date, pot fi vizualizați cei existenți, le pot fi editate datele setate anterior și pot fi chiar șterși din baza de date. Trebuie să fie luat în considerare toate măsurile ca link-urile dintre pagini să fie corecte, să fie accesate bazele de date cu tabelele corecte, pentru ca rezultatele ce urmează a fi afișate să fie corecte.
Fișierele care pot fi interpretate de serverul de web pot să fie de orice tip, cele mai folosite fiind însă cele HTML și cele PHP. Pe parcursul utilizării acestei aplicații se mai lucrează cu câteva tipuri de fișiere importante, cum ar fi:
documente Microsoft Word, care pentru a putea fi deschise de aplicația corectă, i se „sugerează” serverului de web să folosească o anumită aplicație:
header( „Content-type: application/msword” );
header( „Content-Disposition: filename=fact.rtf”);
documente de tip PDF – Adobe Reader, Acrobat Reader, care pentru a putea fi deschise de aplicația corectă, i se „sugerează” serverului de web să folosească o anumită aplicație:
header( „Content-Disposition: filename=factura.pdf”);
header( „Content-type: application/pdf” );
5.3. Concluzii
Soluția prezentată se dovedește a fi fiabilă, deoarece nu sunt necesare cunoștințe de programare sau alte cunoștințe avansate în domeniul calculatoarelor sau al Internetului. Totuși este nevoie de un bagaj minim de cunoștințe de programare HTML pentru a realiza această aplicație. Dacă aceste cunoștințe nu sunt foarte temeinice se poate utiliza în acest scop un editor HTML, utilitar care ușurează foarte mult munca programatorului. Pentru programarea în PHP sunt necesare cunoștințe medii de programare in limbajul C++, limbaj care se aseamănă foarte mult cu PHP-ul din toate punctele de vedere. Necunoașterea tuturor funcțiilor PHP poate fi depășită prin folosirea HELP-ului care se instalează odată cu aplicația.
Această aplicație are mai mult o valoare comercială, decât una de instruire, deoarece costul unei astfel de aplicații care se face într-o altă aplicație care folosește baze de date (Visual Fox Pro, Oracle, Fox Pro, Visual Basic) poate să ajungă la câteva mii de dolari sau chiar să depășească acest prag. Marele avantaj al acestei aplicații este faptul că folosește instrumente de tip Open Source, care nu necesită licențiere.
Anexe
Script-urile folosite în cadrul aplicației
add_user.php
<?php
session_start();
header("Cache-control: private"); //IE 6 Fix
include "library.php";
require_login();
?>
<html>
<body background="images/pencil.jpg">
<div align="center"><big><font color=#2313EC><h1>Formular adaugare abonat in baza de date</h1></font></big></div><br><br>
<form method="post" action="add_user_valid.php">
<?php
$an=date(y);
$anul_mare=date(Y);
$luna=date(m);
$ziua=date(j); // ziua curenta fara zero-ul din fata pentru zilele 1-9
$select_anul[$an]="selected";
$select_luna[$luna]="selected";
$select_ziua[$ziua]="selected";
//$_SESSION['tip_abonat']=$tip_abonat;
if(($_SESSION['erori']=="da")&&($erori_completare!="nu")){
print "<font color=#FF0000><b><i>ERORI la completarea formularului</i></b></font>\n";
if((!isset($nume))&&($_SESSION['mesaj_nume'])){
print "<br>\n";
$mesaj_nume=$_SESSION['mesaj_nume'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_nume</font>\n";
}
if((!isset($prenume))&&($_SESSION['mesaj_prenume'])){
print "<br>\n";
$mesaj_prenume=$_SESSION['mesaj_prenume'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_prenume</font>\n";
}
if((!isset($oras))&&($_SESSION['mesaj_oras'])){
print "<br>\n";
$mesaj_oras=$_SESSION['mesaj_oras'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_oras</font>\n";
}
if((!isset($strada))&&($_SESSION['mesaj_strada'])){
print "<br>\n";
$mesaj_strada=$_SESSION['mesaj_strada'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_strada</font>\n";
}
if((!isset($numar))&&($_SESSION['mesaj_numar'])){
print "<br>\n";
$mesaj_numar=$_SESSION['mesaj_numar'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_numar</font>\n";
}
if((!isset($serie))&&($_SESSION['mesaj_serie'])){
print "<br>\n";
$mesaj_serie=$_SESSION['mesaj_serie'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_serie</font>\n";
}
if((!isset($nrbuletin))&&($_SESSION['mesaj_nrbuletin'])){
print "<br>\n";
$mesaj_nrbuletin=$_SESSION['mesaj_nrbuletin'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_nrbuletin</font>\n";
}
if((!isset($cnp))&&($_SESSION['mesaj_cnp'])){
print "<br>\n";
$mesaj_cnp=$_SESSION['mesaj_cnp'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_cnp</font>\n";
}
if((!isset($sectia))&&($_SESSION['mesaj_sectia'])){
print "<br>\n";
$mesaj_sectia=$_SESSION['mesaj_sectia'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_sectia</font>\n";
}
if((!isset($judet))&&($_SESSION['mesaj_judet'])){
print "<br>\n";
$mesaj_judet=$_SESSION['mesaj_judet'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_judet</font>\n";
}
if((!isset($data))&&($_SESSION['mesaj_data'])){
print "<br>\n";
$mesaj_data=$_SESSION['mesaj_data'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_data</font>\n";
}
if(($_SESSION['mesaj_ziua'])){
print "<br>\n";
$mesaj_ziua=$_SESSION['mesaj_ziua'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_ziua</font>\n";
}
if(($_SESSION['mesaj_ziua1'])){
print "<br>\n";
$mesaj_ziua1=$_SESSION['mesaj_ziua1'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_ziua1</font>\n";
}
if(($_SESSION['mesaj_an'])){
print "<br>\n";
$mesaj_an=$_SESSION['mesaj_an'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_an</font>\n";
}
if(($_SESSION['mesaj_luna'])){
print "<br>\n";
$mesaj_luna=$_SESSION['mesaj_luna'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_luna</font>\n";
}
if(($_SESSION['mesaj_ziua_mare'])){
print "<br>\n";
$mesaj_ziua_mare=$_SESSION['mesaj_ziua_mare'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_ziua_mare</font>\n";
}
if(($_SESSION['mesaj_serviciu'])){
print "<br>\n";
$mesaj_serviciu=$_SESSION['mesaj_serviciu'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_serviciu</font>\n";
}
if((!isset($numefirma))&&($_SESSION['mesaj_numefirma'])){
print "<br>\n";
$mesaj_numefirma=$_SESSION['mesaj_numefirma'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_numefirma</font>\n";
}
if((!isset($reprezentant))&&($_SESSION['mesaj_reprezentant'])){
print "<br>\n";
$mesaj_reprezentant=$_SESSION['mesaj_reprezentant'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_reprezentant</font>\n";
}
if((!isset($nrinreg))&&($_SESSION['mesaj_nrinreg'])){
print "<br>\n";
$mesaj_nrinreg=$_SESSION['mesaj_nrinreg'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_nrinreg</font>\n";
}
if((!isset($codfiscal))&&($_SESSION['mesaj_codfiscal'])){
print "<br>\n";
$mesaj_codfiscal=$_SESSION['mesaj_codfiscal'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_codfiscal</font>\n";
}
if(($_SESSION['mesaj_data_eroare'])){
print "<br>\n";
$mesaj_data_eroare=$_SESSION['mesaj_data_eroare'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_data_eroare</font>\n";
}
if(($_SESSION['mesaj_data_an'])){
print "<br>\n";
$mesaj_data_an=$_SESSION['mesaj_data_an'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_data_an</font>\n";
}
if(($_SESSION['mesaj_data_luna'])){
print "<br>\n";
$mesaj_data_luna=$_SESSION['mesaj_data_luna'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_data_luna</font>\n";
}
if(($_SESSION['mesaj_data_zi'])){
print "<br>\n";
$mesaj_data_zi=$_SESSION['mesaj_data_zi'];
print "<font color=#F10E4D><sup>*</sup></font><font color=#FF8000>$mesaj_data_zi</font>\n";
}
print "<br>\n";
}
else{
print "<font color=#F10E4D><font color=#F10E4D><sup>*</sup></font> Campuri obligatorii</font><br><br>\n";
}
if(($_SESSION['tip_abonat']=="Persoana fizica")||($tip_abonat=="Persoana fizica")){
print " <CENTER><b><big>DATE CONTACT</big></b>\n";
print "</CENTER><HR WIDTH=700 ALIGN=center>\n";
print "<P>\n";
if((!isset($nume))||(!isset($prenume))){
print "<table>\n";
print "<tr>\n";
if(!isset($_SESSION['nume'])){
$nume=$_SESSION['nume'];
print "<td>Nume:</td><td><input type=\"Text\" name=\"nume\" value=\"$nume\" maxlength=20 title='Aici introduceti numele abonatului'> <font color=#F10E4D><sup>*</sup></font></td></tr>\n";
}
if(!isset($_SESSION['prenume'])){
$prenume=$_SESSION['prenume'];
print "<td>Prenume:</td><td><input type=\"Text\" name=\"prenume\" value=\"$prenume\" maxlength=20 title='Aici introduceti prenumele abonatului'> <font color=#F10E4D><sup>*</sup></font></td>\n";
}
print "</tr></table><br><br>\n";
}
if((!isset($oras))||(!isset($strada))||(!isset($numar))){
print "<B>Domiciliul:</B><br><br>\n";
print "<table><tr>\n";
if(!isset($_SESSION['oras'])){
$oras=$_SESSION['oras'];
print "<td>Oras (comuna):</td><td><input type=\"Text\" size=\"20\" name=\"oras\" value=\"$oras\" maxlength=16 title='Aici introduceti localitatea'> <font color=#F10E4D><sup>*</sup></font></td>\n";
}
if(!isset($_SESSION['strada'])){
$strada=$_SESSION['strada'];
print "<td>strada:</td><td><input type=\"Text\" size=\"20\" name=\"strada\" value=\"$strada\" maxlength=25 title='Aici introduceti numele strazii'> <font color=#F10E4D><sup>*</sup></font></td>\n";
}
if(!isset($_SESSION['numar'])){
$numar=$_SESSION['numar'];
print "<td>numar:</td><td><input type=\"Text\" size=\"20\" maxlength=5 name=\"numar\" value=\"$numar\" title='Aici introduceti numarul strazii'> <font color=#F10E4D><sup>*</sup></font></td>\n";
}
print "</tr><tr>\n";
$telefon=$_SESSION['telefon'];
print "<td>Telefon:</td><td><input type=\"Text\" size=\"20\" maxlength=20 name=\"telefon\" value=\"$telefon\" title='Aici introduceti numarul de telefon'></td>\n";
$bloc=$_SESSION['bloc'];
print "<td>Bloc:</td><td><input type=\"Text\" size=\"20\" maxlength=3 name=\"bloc\" value=\"$bloc\" title='Aici introduceti numarul blocului'></td>\n";
$scara=$_SESSION['scara'];
print "<td>Scara:</td><td><input type=\"Text\" size=\"20\" maxlength=3 name=\"scara\" value=\"$scara\" title='Aici introduceti numarul scarii'></td>\n";
print "</tr><tr>\n";
$etaj=$_SESSION['etaj'];
print "<td>Etaj:</td><td><input type=\"Text\" size=\"20\" maxlength=3 name=\"etaj\" value=\"$etaj\" title='Aici introduceti etajul'></td>\n";
$apartament=$_SESSION['apartament'];
print "<td>Apartament:</td><td><input type=\"Text\" size=\"20\" maxlength=4 name=\"apartament\" value=\"$apartament\" title='Aici introduceti numarul apartamentului'></td>\n";
$copostal=$_SESSION['codpostal'];
print "<td>Cod postal:</td><td><input type=\"Text\" size=\"20\" maxlength=8 name=\"codpostal\" value=\"$codpostal\" title='Aici introduceti codul postal al orasului(comunei)'></td>\n";
print "</tr>\n";
print "</table> <br><br><br>\n";
}
if((!isset($serie))||(!isset($nrbuletin))||(!isset($cnp))||(!isset($sectia))||(!isset($judet))||(!isset($data))){
print "<B>Date buletin:</B><br><br>\n";
print "<table><tr>\n";
if(!isset($_SESSION['serie'])){
$serie=$_SESSION['serie'];
print "<td>Serie:</td><td><input type=\"Text\" size=\"20\" name=\"serie\" value=\"$serie\" maxlength=2 title='Aici introduceti seria buletinului (doua litere cu majuscula)'> <font color=#F10E4D><sup>*</sup></font></td>\n";
}
if(!isset($_SESSION['nrbuletin'])){
$nrbuletin=$_SESSION['nrbuletin'];
print "<td>Numar buletin:</td><td><input type=\"Text\" size=\"20\" maxlength=6 name=\"nrbuletin\" value=\"$nrbuletin\" title='Aici introduceti numarul buletinului (6 cifre)'> <font color=#F10E4D><sup>*</sup></font></td>\n";
}
if(!isset($_SESSION['cnp'])){
$cnp=$_SESSION['cnp'];
print "<td>CNP:</td><td><input type=\"Text\" size=\"20\" maxlength=13 name=\"cnp\" value=\"$cnp\" title='Aici introduceti codul numeric personal (13 cifre)'> <font color=#F10E4D><sup>*</sup></font></td>\n";
print "</tr><tr>\n";
}
if(!isset($_SESSION['sectia'])){
$sectia=$_SESSION['sectia'];
print "<td>eliberat de:</td><td><input type=\"Text\" size=\"20\" name=\"sectia\" value=\"$sectia\" title='Aici introduceti sectia care a eliberat buletinul'> <font color=#F10E4D><sup>*</sup></font></td>\n";
}
if(!isset($_SESSION['judet'])){
$judet=$_SESSION['judet'];
print "<td>Judet:</td><td><input type=\"Text\" size=\"20\" maxlength=20 name=\"judet\" value=\"$judet\" title='Aici introduceti judetul'> <font color=#F10E4D><sup>*</sup></font></td>\n";
}
if((!isset($_SESSION['data']))||($_SESSION['mesaj_data_eroare'])||($_SESSION['mesaj_data_an'])||($_SESSION['mesaj_data_luna'])||($_SESSION['mesaj_data_zi'])){
$data=$_SESSION['data'];
print "<td>la data de:</td><td><input type=\"Text\" size=\"20\" maxlength=10 name=\"data\" value=\"\" title='Aici introduceti anul eliberarii actului de identitate'>(format AAAA-LL-ZZ) <font color=#F10E4D><sup>*</sup></font></td>\n";
print "</tr></table> <br><br><br>\n";
session_unregister("mesaj_data_eroare");
session_unregister("mesaj_data_an");
session_unregister("mesaj_data_luna");
session_unregister("mesaj_data_zi");
}
}
if((($_SESSION['mesaj_ziua'])||($_SESSION['mesaj_ziua1'])||($_SESSION['mesaj_an'])||($_SESSION['mesaj_luna'])||($_SESSION['mesaj_ziua_mare']))||((!isset($_SESSION['serviciu']))||($_SESSION['serviciu']=="nesetat"))){
print "<p><P><p><CENTER><b><big>INFORMATII CONTRACT</big></b></CENTER>\n";
print "<HR WIDTH=700 ALIGN=center><br><br>\n";
session_unregister("mesaj_ziua");
session_unregister("mesaj_ziua1");
print "<table><tr>\n";
print "<td>Data inceperii contractului:</td><td>Anul:<select name=anul size=1>\n";
print "<option $select_anul[04]>2004\n";
print "<option $select_anul[05]>2005\n";
print "<option $select_anul[06]>2006\n";
print "<option $select_anul[07]>2007\n";
print "<option $select_anul[08]>2008\n";
print "<option $select_anul[09]>2009\n";
print "<option $select_anul[10]>2010\n";
print "</select>\n";
print "</td><td>luna:</td><td><select name=luna size=1>\n";
print "<option $select_luna[01]>ianuarie\n";
print "<option $select_luna[02]>februarie\n";
print "<option $select_luna[03]>martie\n";
print "<option $select_luna[04]>aprilie\n";
print "<option $select_luna[05]>mai\n";
print "<option $select_luna[06]>iunie\n";
print "<option $select_luna[07]>iulie\n";
print "<option $select_luna[08]>august\n";
print "<option $select_luna[09]>septembrie\n";
print "<option $select_luna[10]>octombrie\n";
print "<option $select_luna[11]>noiembrie\n";
print "<option $select_luna[12]>decembrie\n";
print "</select></td><td>ziua:</td><td><select name=ziua size=1> \n";
for($i=1;$i<=9;$i++) print "<option $select_ziua[$i]>0$i\n";
for($i=10;$i<=31;$i++) print "<option $select_ziua[$i]>$i\n";
print "</select> <font color=#F10E4D><sup>*</sup></font></td></tr>\n";
print "<tr>\n";
print "<td>Data finalizarii contractului:</td><td>Anul:<select name=anul1 size=1>\n";
print "<option $select_anul[04]>2004\n";
print "<option $select_anul[05]>2005\n";
print "<option $select_anul[06]>2006\n";
print "<option $select_anul[07]>2007\n";
print "<option $select_anul[08]>2008\n";
print "<option $select_anul[09]>2009\n";
print "<option $select_anul[10]>2010\n";
print "</select>\n";
print "</td><td>luna:</td><td><select name=luna1 size=1>\n";
print "<option $select_luna[01]>ianuarie\n";
print "<option $select_luna[02]>februarie\n";
print "<option $select_luna[03]>martie\n";
print "<option $select_luna[04]>aprilie\n";
print "<option $select_luna[05]>mai\n";
print "<option $select_luna[06]>iunie\n";
print "<option $select_luna[07]>iulie\n";
print "<option $select_luna[08]>august\n";
print "<option $select_luna[09]>septembrie\n";
print "<option $select_luna[10]>octombrie\n";
print "<option $select_luna[11]>noiembrie\n";
print "<option $select_luna[12]>decembrie\n";
print "</select></td><td>ziua:</td><td><select name=ziua1 size=1> \n";
for($i=1;$i<=9;$i++) print "<option $select_ziua[$i]>0$i\n";
for($i=10;$i<=31;$i++) print "<option $select_ziua[$i]>$i\n";
print "</select> <font color=#F10E4D><sup>*</sup></font></td></tr>\n";
print "</table>\n";
print "\n";
session_unregister("mail");
session_unregister("dialup");
session_unregister("config");
session_unregister("mailsuplimentar");
session_unregister("suport");
session_unregister("design");
session_unregister("publicare");
session_unregister("domeniu");
session_unregister("mailhost");
session_unregister("webhost");
$set_mail=$_SESSION['set_mail'];
$set_dialup=$_SESSION['set_dialup'];
$set_config=$_SESSION['set_config'];
$set_mailsuplimentar=$_SESSION['set_mailsuplimentar'];
$set_suport=$_SESSION['set_suport'];
$set_design=$_SESSION['set_design'];
$set_publicare=$_SESSION['set_publicare'];
$set_domeniu=$_SESSION['set_domeniu'];
$set_mailhost=$_SESSION['set_mailhost'];
$set_webhost=$_SESSION['set_webhost'];
print "<table><tr><td><b><i>Tip servicii:<font color=#F10E4D><sup>*</sup></font></i></b></td>\n";
print " <td><table><tr><td><input type=checkbox name=mail $set_mail value=\"mail\"> E-mail</td><td><input type=checkbox $set_dialup name=dialup value=\"dialup\"> Dial-up</td><td><input type=checkbox $set_config name=config value=\"config\"> Configurare software client</td></tr>\n";
print " <tr><td><input type=checkbox name=mailsuplimentar $set_mailsuplimentar value=\"mailsuplimentar\"> Conturi e-mail suplimentare</td><td><input type=checkbox name=suport $set_suport value=\"suport\"> Suport tehnic la cerere</td><td><input type=checkbox name=design $set_design value=\"design\"> Design pagini web</td></tr>\n";
print " <tr><td><input type=checkbox name=publicare $set_publicare value=\"publicare\"> Publicare pagini web</td><td><input type=checkbox name=domeniu $set_domeniu value=\"domeniu\"> Inregistrare domeniu propriu</td><td><input type=checkbox name=mailhost $set_mailhost value=\"mailhost\"> MailHost</td></tr>\n";
print " <tr><td cospan=3><input type=checkbox name=webhost $set_webhost value=\"webhost\"> WebHost</td></tr>\n";
print " </table>\n";
print " </td>\n";
print " </tr>\n";
print "</table>\n";
print "<br>\n";
$set_standard=$_SESSION['set_standard'];
$set_protocol=$_SESSION['set_protocol'];
if(!isset($_SESSION['abonat'])) $set_standard="checked";
print "<table><tr><td>Tip abonat:</td><td><table><tr><td><input type=radio name=abonat $set_standard value=\"standard\"> Standard</td></tr>\n";
print " <tr><td><input type=radio name=abonat $set_protocol value=\"protocol\"> Protocol</td></tr>\n";
print " </table>\n";
print "</td></tr></table>\n";
?>
<table><tr><td>Observatii:</td><td><textarea name=observatii cols=40 rows=5></textarea></td></tr></td>
</table><br><br>
<?php
print "<input name=\"tip_abonat\" type=\"hidden\" value=\"$tip_abonat\">\n";
}
}
if(($_SESSION['tip_abonat']=="Persoana juridica")||($tip_abonat=="Persoana juridica")){
print " <CENTER><b><big>DATE CONTACT</big></b>\n";
print "</CENTER><HR WIDTH=700 ALIGN=center>\n";
print "<P>\n";
if((!isset($numefirma))||(!isset($reprezentant))){
print "<table>\n";
print "<tr>\n";
if(!isset($_SESSION['numefirma'])){
print "<td>Denumirea firmei:</td><td><input type=\"Text\" name=\"numefirma\" maxlength=50 title='Aici introduceti denumirea firmei'> <font color=#F10E4D><sup>*</sup></font></td>\n";
}
if(!isset($_SESSION['reprezentant'])){
print "<td>Reprezentant firma:</td><td><input type=\"Text\" name=\"reprezentant\" maxlength=50 title='Aici introduceti numele reprezentantului firmei'> <font color=#F10E4D><sup>*</sup></font></td></tr>\n";
}
print "<td>E-mail:</td><td><input type=\"Text\" name=\"email\" maxlength=30 title='Aici introduceti e-mail-ul firmei'></td>\n";
print "<td>Web address:</td><td><input type=\"Text\" name=\"web\" maxlength=30 title='Aici introduceti adresa de web a firmei'></td>\n";
print "</tr>\n";
print "</table><br><br>\n";
}
if((!isset($oras))||(!isset($strada))||(!isset($numar))){
print "<B>Sediul firmei:</B><br><br>\n";
print "<table><tr>\n";
if(!isset($_SESSION['oras'])){
$oras=$_SESSION['oras'];
print "<td>Oras (comuna):</td><td><input type=\"Text\" size=\"20\" name=\"oras\" value=\"$oras\" maxlength=16 title='Aici introduceti localitatea'> <font color=#F10E4D><sup>*</sup></font></td>\n";
}
if(!isset($_SESSION['strada'])){
$strada=$_SESSION['strada'];
print "<td>strada:</td><td><input type=\"Text\" size=\"20\" name=\"strada\" value=\"$strada\" maxlength=25 title='Aici introduceti numele strazii'> <font color=#F10E4D><sup>*</sup></font></td>\n";
}
if(!isset($_SESSION['numar'])){
$numar=$_SESSION['numar'];
print "<td>numar:</td><td><input type=\"Text\" size=\"20\" maxlength=5 name=\"numar\" value=\"$numar\" title='Aici introduceti numarul strazii'> <font color=#F10E4D><sup>*</sup></font></td>\n";
}
print "</tr><tr>\n";
$telefon=$_SESSION['telefon'];
print "<td>Telefon:</td><td><input type=\"Text\" size=\"20\" maxlength=20 name=\"telefon\" value=\"$telefon\" title='Aici introduceti numarul de telefon'></td>\n";
$bloc=$_SESSION['bloc'];
print "<td>Bloc:</td><td><input type=\"Text\" size=\"20\" maxlength=3 name=\"bloc\" value=\"$bloc\" title='Aici introduceti numarul blocului'></td>\n";
$scara=$_SESSION['scara'];
print "<td>Scara:</td><td><input type=\"Text\" size=\"20\" maxlength=3 name=\"scara\" value=\"$scara\" title='Aici introduceti numarul scarii'></td>\n";
print "</tr><tr>\n";
$etaj=$_SESSION['etaj'];
print "<td>Etaj:</td><td><input type=\"Text\" size=\"20\" maxlength=3 name=\"etaj\" value=\"$etaj\" title='Aici introduceti etajul'></td>\n";
$apartament=$_SESSION['apartament'];
print "<td>Apartament:</td><td><input type=\"Text\" size=\"20\" maxlength=4 name=\"apartament\" value=\"$apartament\" title='Aici introduceti numarul apartamentului'></td>\n";
$copostal=$_SESSION['codpostal'];
print "<td>Cod postal:</td><td><input type=\"Text\" size=\"20\" maxlength=8 name=\"codpostal\" value=\"$codpostal\" title='Aici introduceti codul postal al orasului(comunei)'></td>\n";
print "</tr>\n";
print "</table> <br><br><br>\n";
}
if((!isset($nrinreg))||(!isset($codfiscal))){
print "<B>Date identificare persoana juridica:</B><br><br>\n";
print "<table><tr>\n";
if(!isset($_SESSION['nrinreg'])){
print "<td>Numar inregistrare la Registrul Comertului:</td><td><input type=\"Text\" size=\"30\" name=\"nrinreg\" maxlength=20 title='Aici introduceti numarul de inregistrare la Registrul Comertului al firmei'><font color=#F10E4D><sup>*</sup></font></td>\n";
}
if(!isset($_SESSION['codfiscal'])){
print "<td>Codul fiscal:</td><td><input type=\"Text\" size=\"30\" maxlength=15 name=\"codfiscal\" title='Aici introduceti codul fiscal al firmei'><font color=#F10E4D><sup>*</sup></font></td>\n";
print "</tr>\n";
}
print "<tr><td>Cont:</td><td><input type=\"Text\" size=\"30\" maxlength=30 name=\"cont\" title='Aici introduceti numarul contului din banca'></td>\n";
print "<td>Banca:</td><td><input type=\"Text\" size=\"30\" maxlength=30 name=\"banca\" title='Aici introduceti numele bancii'></td>\n";
print "</tr></table> <br><br><br>\n";
}
if((($_SESSION['mesaj_ziua'])||($_SESSION['mesaj_ziua1'])||($_SESSION['mesaj_an'])||($_SESSION['mesaj_luna'])||($_SESSION['mesaj_ziua_mare']))||((!isset($_SESSION['serviciu']))||($_SESSION['serviciu']=="nesetat"))){
print "<p><P><p><CENTER><b><big>INFORMATII CONTRACT</big></b></CENTER>\n";
print "<HR WIDTH=700 ALIGN=center><br><br>\n";
session_unregister("mesaj_ziua");
session_unregister("mesaj_ziua1");
print "<table><tr>\n";
print "<td>Data inceperii contractului:</td><td>Anul:<select name=anul size=1>\n";
print "<option $select_anul[04]>2004\n";
print "<option $select_anul[05]>2005\n";
print "<option $select_anul[06]>2006\n";
print "<option $select_anul[07]>2007\n";
print "<option $select_anul[08]>2008\n";
print "<option $select_anul[09]>2009\n";
print "<option $select_anul[10]>2010\n";
print "</select>\n";
print "</td><td>luna:</td><td><select name=luna size=1>\n";
print "<option $select_luna[01]>ianuarie\n";
print "<option $select_luna[02]>februarie\n";
print "<option $select_luna[03]>martie\n";
print "<option $select_luna[04]>aprilie\n";
print "<option $select_luna[05]>mai\n";
print "<option $select_luna[06]>iunie\n";
print "<option $select_luna[07]>iulie\n";
print "<option $select_luna[08]>august\n";
print "<option $select_luna[09]>septembrie\n";
print "<option $select_luna[10]>octombrie\n";
print "<option $select_luna[11]>noiembrie\n";
print "<option $select_luna[12]>decembrie\n";
print "</select></td><td>ziua:</td><td><select name=ziua size=1> \n";
for($i=1;$i<=9;$i++) print "<option $select_ziua[$i]>0$i\n";
for($i=10;$i<=31;$i++) print "<option $select_ziua[$i]>$i\n";
print "</select> <font color=#F10E4D><sup>*</sup></font></td></tr>\n";
print "<tr>\n";
print "<td>Data finalizarii contractului:</td><td>Anul:<select name=anul1 size=1>\n";
print "<option $select_anul[04]>2004\n";
print "<option $select_anul[05]>2005\n";
print "<option $select_anul[06]>2006\n";
print "<option $select_anul[07]>2007\n";
print "<option $select_anul[08]>2008\n";
print "<option $select_anul[09]>2009\n";
print "<option $select_anul[10]>2010\n";
print "</select>\n";
print "</td><td>luna:</td><td><select name=luna1 size=1>\n";
print "<option $select_luna[01]>ianuarie\n";
print "<option $select_luna[02]>februarie\n";
print "<option $select_luna[03]>martie\n";
print "<option $select_luna[04]>aprilie\n";
print "<option $select_luna[05]>mai\n";
print "<option $select_luna[06]>iunie\n";
print "<option $select_luna[07]>iulie\n";
print "<option $select_luna[08]>august\n";
print "<option $select_luna[09]>septembrie\n";
print "<option $select_luna[10]>octombrie\n";
print "<option $select_luna[11]>noiembrie\n";
print "<option $select_luna[12]>decembrie\n";
print "</select></td><td>ziua:</td><td><select name=ziua1 size=1> \n";
for($i=1;$i<=9;$i++) print "<option $select_ziua[$i]>0$i\n";
for($i=10;$i<=31;$i++) print "<option $select_ziua[$i]>$i\n";
print "</select> <font color=#F10E4D><sup>*</sup></font></td></tr>\n";
print "</table>\n";
print "\n";
session_unregister("mail");
session_unregister("dialup");
session_unregister("config");
session_unregister("mailsuplimentar");
session_unregister("suport");
session_unregister("design");
session_unregister("publicare");
session_unregister("domeniu");
session_unregister("mailhost");
session_unregister("webhost");
$set_mail=$_SESSION['set_mail'];
$set_dialup=$_SESSION['set_dialup'];
$set_config=$_SESSION['set_config'];
$set_mailsuplimentar=$_SESSION['set_mailsuplimentar'];
$set_suport=$_SESSION['set_suport'];
$set_design=$_SESSION['set_design'];
$set_publicare=$_SESSION['set_publicare'];
$set_domeniu=$_SESSION['set_domeniu'];
$set_mailhost=$_SESSION['set_mailhost'];
$set_webhost=$_SESSION['set_webhost'];
print "<table><tr><td><b><i>Tip servicii:<font color=#F10E4D><sup>*</sup></font></i></b></td>\n";
print " <td><table><tr><td><input type=checkbox name=mail $set_mail value=\"mail\"> E-mail</td><td><input type=checkbox $set_dialup name=dialup value=\"dialup\"> Dial-up</td><td><input type=checkbox $set_config name=config value=\"config\"> Configurare software client</td></tr>\n";
print " <tr><td><input type=checkbox name=mailsuplimentar $set_mailsuplimentar value=\"mailsuplimentar\"> Conturi e-mail suplimentare</td><td><input type=checkbox name=suport $set_suport value=\"suport\"> Suport tehnic la cerere</td><td><input type=checkbox name=design $set_design value=\"design\"> Design pagini web</td></tr>\n";
print " <tr><td><input type=checkbox name=publicare $set_publicare value=\"publicare\"> Publicare pagini web</td><td><input type=checkbox name=domeniu $set_domeniu value=\"domeniu\"> Inregistrare domeniu propriu</td><td><input type=checkbox name=mailhost $set_mailhost value=\"mailhost\"> MailHost</td></tr>\n";
print " <tr><td cospan=3><input type=checkbox name=webhost $set_webhost value=\"webhost\"> WebHost</td></tr>\n";
print " </table>\n";
print " </td>\n";
print " </tr>\n";
print "</table>\n";
print "<br>\n";
$set_standard=$_SESSION['set_standard'];
$set_protocol=$_SESSION['set_protocol'];
if(!isset($_SESSION['abonat'])) $set_standard="checked";
print "<table><tr><td>Tip abonat:</td><td><table><tr><td><input type=radio name=abonat $set_standard value=\"standard\"> Standard</td></tr>\n";
print " <tr><td><input type=radio name=abonat $set_protocol value=\"protocol\"> Protocol</td></tr>\n";
print " </table>\n";
print "</td></tr></table>\n";
?>
<table><tr><td>Observatii:</td><td><textarea name=observatii cols=40 rows=5></textarea></td></tr></td>
</table><br><br>
<?php
print "<input name=\"tip_abonat\" type=\"hidden\" value=\"$tip_abonat\">\n";
}
}
?>
<center>
<INPUT TYPE=SUBMIT VALUE="Validare date">
</center>
</form>
</body>
</html>
add_user_valid.php
<?php
session_start();
header("Cache-control: private"); //IE 6 Fix
include "library.php";
include "connect.inc";
require_login();
$erori=0;
function validare_fizica(){
global $erori;
global $nume, $prenume,$oras,$strada,$numar,$serie,$telefon,$bloc,$scara,$etaj,$apartament,$codpostal,$nrbuletin, $cnp, $sectia, $judet, $data,
$numar_contract, $anul, $anul1, $luna, $luna1, $ziua, $ziua1,$mail,$dialup,$config,$mailsuplimentar,
$suport,$design,$publicare,$domeniu,$mailhost,$webhost,$abonat;
####valideaza nume
if(!trim($nume)) {
$_SESSION['mesaj_nume']="Campul nume este obligatoriu."; $erori++;
}
else {
$_SESSION['nume']=$nume;
}
####valideaza prenume
if(!trim($prenume)) {
$_SESSION['mesaj_prenume']='Campul prenume este obligatoriu.'; $erori++;
}
else {
$_SESSION['prenume']=$prenume;
}
#valideaza oras
if(!trim($oras)) {
$_SESSION['mesaj_oras']='Campul oras este obligatoriu.'; $erori++;
}
else {
$_SESSION['oras']=$oras;
}
####valideaza strada
if(!trim($strada)) {
$_SESSION['mesaj_strada']='Campul strada este obligatoriu.'; $erori++;
}
else {
$_SESSION['strada']=$strada;
}
####valideaza numar strada
if(!trim($numar)) {
$_SESSION['mesaj_numar']='Campul numar strada este obligatoriu.'; $erori++;
}
else {
$_SESSION['numar']=$numar;
}
#valideaza serie buletin
if(!trim($serie)) {
$_SESSION['mesaj_serie']='Campul serie buletin este obligatoriu.'; $erori++;
}
else {
$_SESSION['serie']=$serie;
}
####valideaza numar buletin
if(!trim($nrbuletin)) {
$_SESSION['mesaj_nrbuletin']='Campul numar buletin este obligatoriu.'; $erori++;
}
else {
$_SESSION['nrbuletin']=$nrbuletin;
}
####valideaza cnp
if(!trim($cnp)) {
$_SESSION['mesaj_cnp']='Campul CNP este obligatoriu.'; $erori++;
}
else {
$_SESSION['cnp']=$cnp;
}
####valideaza sectia
if(!trim($sectia)) {
$_SESSION['mesaj_sectia']='Campul sectie este obligatoriu.'; $erori++;
}
else {
$_SESSION['sectia']=$sectia;
}
#valideaza judet
if(!trim($judet)) {
$_SESSION['mesaj_judet']='Campul judet este obligatoriu.'; $erori++;
}
else {
$_SESSION['judet']=$judet;
}
####valideaza data eliberarii buletin
if(!trim($data)) {
$_SESSION['mesaj_data']='Campul data eliberarii buletin este obligatoriu.'; $erori++;
}
else {
$_SESSION['data']=$data;
}
####valideaza data eliberarii buletinului
$data_an=substr($data,0,4);
$data_luna=substr($data,5,2);
$data_zi=substr($data,8,2);
if(strlen($data)!=10){
$_SESSION['mesaj_data_eroare']='Lungimea datei eliberarii buletinului este invalida!';
}
else {
if(($data_an>2100)||($data_an<1900)){
$_SESSION['mesaj_data_an']='Anul eliberarii buletinului este mai mare ca anul 2100 sau mai mic decat 1900. Aberant!';
$erori++;
}
else {
$_SESSION['mesaj_data_an']="";
}
if(($data_luna>12)||($data_luna<1)){
$_SESSION['mesaj_data_luna']='Luna eliberarii buletinului invalida!';
$erori++;
}
else {
$_SESSION['mesaj_data_luna']="";
}
if((($data_an%4)==0)&&($data_luna==2)&&($data_ziua>29)){
$_SESSION['mesaj_data_ziua']='Luna februarie are doar 29 de zile:data eliberarii buletinului';
$erori++;
}else if((!($data_an%4)==0)&&($data_luna==2)&&($data_zi>28)){
$_SESSION['mesaj_data_ziua']='Luna februarie are doar 28 de zile:data eliberarii buletinului';
$erori++;
}
if(($data_zi>31)||($data_zi<1)){
$_SESSION['mesaj_data_zi']='Zilele lunilor sunt cuprinse intre 1 si 31:data eliberarii buletinului';
}
else{
if(($data_luna==4)&&($data_zi>30)){
$_SESSION['mesaj_data_zi']='Luna aprilie are doar 30 de zile:data eliberarii buletinului';
$erori++;
}
if(($data_luna==6)&&($data_zi>30)){
$_SESSION['mesaj_data_zi']='Luna iunie are doar 30 de zile:data eliberarii buletinului';
$erori++;
}
if(($data_luna==9)&&($data_zi>30)){
$_SESSION['mesaj_data_zi']='Luna septembrie are doar 30 de zile:data eliberarii buletinului';
$erori++;
}
if(($data_luna==11)&&($data_zi>30)){
$_SESSION['mesaj_data_zi']='Luna noiembrie are doar 30 de zile:data eliberarii buletinului';
$erori++;
}
}
}
// validare servicii
$_SESSION['mail']=$mail;
if($_SESSION['mail']=='mail'){
$_SESSION['set_mail']="checked";
}
else{
$_SESSION['set_mail']="";
}
$_SESSION['dialup']=$dialup;
if($_SESSION['dialup']=='dialup'){
$_SESSION['set_dialup']="checked";
}
else{
$_SESSION['set_dialup']="";
}
$_SESSION['config']=$config;
if($_SESSION['config']=='config'){
$_SESSION['set_config']="checked";
}
else{
$_SESSION['set_config']="";
}
$_SESSION['mailsuplimentar']=$mailsuplimentar;
if($_SESSION['mailsuplimentar']=='mailsuplimentar'){
$_SESSION['set_mailsuplimentar']="checked";
}
else{
$_SESSION['set_mailsuplimentar']="";
}
$_SESSION['suport']=$suport;
if($_SESSION['suport']=='suport'){
$_SESSION['set_suport']="checked";
}
else{
$_SESSION['set_suport']="";
}
$_SESSION['design']=$design;
if($_SESSION['design']=='design'){
$_SESSION['set_design']="checked";
}
else{
$_SESSION['set_design']="";
}
$_SESSION['publicare']=$publicare;
if($_SESSION['publicare']=='publicare'){
$_SESSION['set_publicare']="checked";
}
else{
$_SESSION['set_publicare']="";
}
$_SESSION['domeniu']=$domeniu;
if($_SESSION['domeniu']=='domeniu'){
$_SESSION['set_domeniu']="checked";
}
else{
$_SESSION['set_domeniu']="";
}
$_SESSION['mailhost']=$mailhost;
if($_SESSION['mailhost']=='mailhost'){
$_SESSION['set_mailhost']="checked";
}
else{
$_SESSION['set_mailhost']="";
}
$_SESSION['webhost']=$webhost;
if($_SESSION['webhost']=='webhost'){
$_SESSION['set_webhost']="checked";
}
else{
$_SESSION['set_webhost']="";
}
if((!isset($_SESSION['mail']))&&(!isset($_SESSION['dialup']))&&(!isset($_SESSION['config']))&&(!isset($_SESSION['mailsuplimentar']))&&(!isset($_SESSION['suport']))&&(!isset($_SESSION['design']))&&(!isset($_SESSION['publicare']))&&(!isset($_SESSION['domeniu']))&&(!isset($_SESSION['mailhost']))&&(!isset($_SESSION['webhost']))){
$_SESSION['serviciu']="nesetat";
$_SESSION['mesaj_serviciu']="Alegeti cel putin un serviciu!";$erori++;
}
else if(($_SESSION['serviciu']=="setat")||((isset($_SESSION['mail']))||(isset($_SESSION['dialup']))||(isset($_SESSION['config']))||(isset($_SESSION['mailsuplimentar']))||(isset($_SESSION['suport']))||(isset($_SESSION['design']))||(isset($_SESSION['publicare']))||(isset($_SESSION['domeniu']))||(isset($_SESSION['mailhost']))||(isset($_SESSION['webhost'])))){
$_SESSION['serviciu']="setat";
$_SESSION['mesaj_serviciu']="";
}
switch($luna){
case "ianuarie":{$luna=1;
break;
}
case "februarie":{$luna=2;
break;
}
case "martie":{$luna=3;
break;
}
case "aprilie":{$luna=4;
break;
}
case "mai":{$luna=5;
break;
}
case "iunie":{$luna=6;
break;
}
case "iulie":{$luna=7;
break;
}
case "august":{$luna=8;
break;
}
case "septembrie":{$luna=9;
break;
}
case "octombrie":{$luna=10;
break;
}
case "noiembrie":{$luna=11;
break;
}
case "decembrie":{$luna=12;
break;
}
}
switch($luna1){
case "ianuarie":{$luna1=1;
break;
}
case "februarie":{$luna1=2;
break;
}
case "martie":{$luna1=3;
break;
}
case "aprilie":{$luna1=4;
break;
}
case "mai":{$luna1=5;
break;
}
case "iunie":{$luna1=6;
break;
}
case "iulie":{$luna1=7;
break;
}
case "august":{$luna1=8;
break;
}
case "septembrie":{$luna1=9;
break;
}
case "octombrie":{$luna1=10;
break;
}
case "noiembrie":{$luna1=11;
break;
}
case "decembrie":{$luna1=12;
break;
}
}
################## valideaza numarul de zile functie de luna selectata PENTRU DATA CABLARII ######################
if($anul>$anul1){
$_SESSION['mesaj_an']='Anul incheierii contractului este mai mare decat anul finalizarii contractului';
$erori++;
}
else if($anul<=$anul1){
$_SESSION['mesaj_an']="";
}
if(($luna>$luna1)&&($anul>=$anul1)){
$_SESSION['mesaj_luna']='Luna incheierii contractului este mai mare decat luna finalizarii contractului';
$erori++;
}
else {
$_SESSION['mesaj_luna']="";
}
if(($ziua>$ziua1)&&($luna>=$luna1)&&($anul>=$anul1)){
$_SESSION['mesaj_ziua_mare']='Ziua incheierii contractului este mai mare decat ziua finalizarii contractului';
$erori++;
}
else if($ziua<=$ziua1){
$_SESSION['mesaj_ziua_mare']="";
}
if((($anul%4)==0)&&($luna==2)&&($ziua>29)){
$_SESSION['mesaj_ziua']='Luna februarie are doar 29 de zile';
$erori++;
}else if((!($anul%4)==0)&&($luna==2)&&($ziua>28)){
$_SESSION['mesaj_ziua']='Luna februarie are doar 28 de zile';
$erori++;
}
if(($luna==4)&&($ziua>30)){
$_SESSION['mesaj_ziua']='Luna aprilie are doar 30 de zile';
$erori++;
}
if(($luna==6)&&($ziua>30)){
$_SESSION['mesaj_ziua']='Luna iunie are doar 30 de zile';
$erori++;
}
if(($luna==9)&&($ziua>30)){
$_SESSION['mesaj_ziua']='Luna septembrie are doar 30 de zile';
$erori++;
}
if(($luna==11)&&($ziua>30)){
$_SESSION['mesaj_ziua']='Luna noiembrie are doar 30 de zile';
$erori++;
}
################## valideaza numarul de zile functie de luna selectata PENTRU DATA INCHEIERII CONTRACTLUI ######################
if((($anul1%4)==0)&&($luna1==2)&&($ziua1>29)){
$_SESSION['mesaj_ziua1']='Luna februarie are doar 29 de zile';
$erori++;
}else if(!(($anul1%4)==0)&&($luna1==2)&&($ziua1>28)){
$_SESSION['mesaj_ziua1']='Luna februarie are doar 28 de zile';
$erori++;
}
if(($luna1==4)&&($ziua1>30)){
$_SESSION['mesaj_ziua1']='Luna aprilie are doar 30 de zile';
$erori++;
}
if(($luna1==6)&&($ziua1>30)){
$_SESSION['mesaj_ziua1']='Luna iunie are doar 30 de zile';
$erori++;
}
if(($luna1==9)&&($ziua1>30)){
$_SESSION['mesaj_ziua1']='Luna septembrie are doar 30 de zile';
$erori++;
}
if(($luna1==11)&&($ziua1>30)){
$_SESSION['mesaj_ziua1']='Luna noiembrie are doar 30 de zile';
$erori++;
}
if($abonat=='standard'){
$_SESSION['abonat']='standard';
$_SESSION['set_standard']="checked";
}
else {
$_SESSION['abonat']='protocol';
$_SESSION['set_protocol']="checked";
}
}
function validare_juridica(){
global $erori;
global $numefirma,$reprezentant,$oras,$strada,$numar,$telefon,$bloc,$scara,$etaj,$apartament,$codpostal,$nrinreg, $codfiscal,$data,
$numar_contract, $anul, $anul1, $luna, $luna1, $ziua, $ziua1,$mail,$dialup,$config,$mailsuplimentar,
$suport,$design,$publicare,$domeniu,$mailhost,$webhost,$abonat;
####valideaza demunire firma
if(!trim($numefirma)) {
$_SESSION['mesaj_numefirma']="Campul denumire firma este obligatoriu."; $erori++;
}
else {
$_SESSION['numefirma']=$numefirma;
}
####valideaza numele reprezentantului
if(!trim($reprezentant)) {
$_SESSION['mesaj_reprezentant']="Campul denumire firma este obligatoriu."; $erori++;
}
else {
$_SESSION['reprezentant']=$reprezentant;
}
#valideaza oras
if(!trim($oras)) {
$_SESSION['mesaj_oras']='Campul oras este obligatoriu.'; $erori++;
}
else {
$_SESSION['oras']=$oras;
}
####valideaza strada
if(!trim($strada)) {
$_SESSION['mesaj_strada']='Campul strada este obligatoriu.'; $erori++;
}
else {
$_SESSION['strada']=$strada;
}
####valideaza numar strada
if(!trim($numar)) {
$_SESSION['mesaj_numar']='Campul numar strada este obligatoriu.'; $erori++;
}
else {
$_SESSION['numar']=$numar;
}
#valideaza numar inregistrare la Reg. Com.
if(!trim($nrinreg)) {
$_SESSION['mesaj_nrinreg']='Campul numar inregistrare la Registrul Comertului este obligatoriu.'; $erori++;
}
else {
$_SESSION['nrinreg']=$nrinreg;
}
####valideaza cod fiscal
if(!trim($codfiscal)) {
$_SESSION['mesaj_codfiscal']='Campul cod fiscal este obligatoriu.'; $erori++;
}
else {
$_SESSION['codfiscal']=$codfiscal;
}
//validare servicii
$_SESSION['mail']=$mail;
if($_SESSION['mail']=='mail'){
$_SESSION['set_mail']="checked";
}
else{
$_SESSION['set_mail']="";
}
$_SESSION['dialup']=$dialup;
if($_SESSION['dialup']=='dialup'){
$_SESSION['set_dialup']="checked";
}
else{
$_SESSION['set_dialup']="";
}
$_SESSION['config']=$config;
if($_SESSION['config']=='config'){
$_SESSION['set_config']="checked";
}
else{
$_SESSION['set_config']="";
}
$_SESSION['mailsuplimentar']=$mailsuplimentar;
if($_SESSION['mailsuplimentar']=='mailsuplimentar'){
$_SESSION['set_mailsuplimentar']="checked";
}
else{
$_SESSION['set_mailsuplimentar']="";
}
$_SESSION['suport']=$suport;
if($_SESSION['suport']=='suport'){
$_SESSION['set_suport']="checked";
}
else{
$_SESSION['set_suport']="";
}
$_SESSION['design']=$design;
if($_SESSION['design']=='design'){
$_SESSION['set_design']="checked";
}
else{
$_SESSION['set_design']="";
}
$_SESSION['publicare']=$publicare;
if($_SESSION['publicare']=='publicare'){
$_SESSION['set_publicare']="checked";
}
else{
$_SESSION['set_publicare']="";
}
$_SESSION['domeniu']=$domeniu;
if($_SESSION['domeniu']=='domeniu'){
$_SESSION['set_domeniu']="checked";
}
else{
$_SESSION['set_domeniu']="";
}
$_SESSION['mailhost']=$mailhost;
if($_SESSION['mailhost']=='mailhost'){
$_SESSION['set_mailhost']="checked";
}
else{
$_SESSION['set_mailhost']="";
}
$_SESSION['webhost']=$webhost;
if($_SESSION['webhost']=='webhost'){
$_SESSION['set_webhost']="checked";
}
else{
$_SESSION['set_webhost']="";
}
if((!isset($_SESSION['mail']))&&(!isset($_SESSION['dialup']))&&(!isset($_SESSION['config']))&&(!isset($_SESSION['mailsuplimentar']))&&(!isset($_SESSION['suport']))&&(!isset($_SESSION['design']))&&(!isset($_SESSION['publicare']))&&(!isset($_SESSION['domeniu']))&&(!isset($_SESSION['mailhost']))&&(!isset($_SESSION['webhost']))){
$_SESSION['serviciu']="nesetat";
$_SESSION['mesaj_serviciu']="Alegeti cel putin un serviciu!";
$erori++;
}
else if(($_SESSION['serviciu']=="setat")||((isset($_SESSION['mail']))||(isset($_SESSION['dialup']))||(isset($_SESSION['config']))||(isset($_SESSION['mailsuplimentar']))||(isset($_SESSION['suport']))||(isset($_SESSION['design']))||(isset($_SESSION['publicare']))||(isset($_SESSION['domeniu']))||(isset($_SESSION['mailhost']))||(isset($_SESSION['webhost'])))){
$_SESSION['serviciu']="setat";
$_SESSION['mesaj_serviciu']="";
}
switch($luna){
case "ianuarie":{$luna=1;
break;
}
case "februarie":{$luna=2;
break;
}
case "martie":{$luna=3;
break;
}
case "aprilie":{$luna=4;
break;
}
case "mai":{$luna=5;
break;
}
case "iunie":{$luna=6;
break;
}
case "iulie":{$luna=7;
break;
}
case "august":{$luna=8;
break;
}
case "septembrie":{$luna=9;
break;
}
case "octombrie":{$luna=10;
break;
}
case "noiembrie":{$luna=11;
break;
}
case "decembrie":{$luna=12;
break;
}
}
switch($luna1){
case "ianuarie":{$luna1=1;
break;
}
case "februarie":{$luna1=2;
break;
}
case "martie":{$luna1=3;
break;
}
case "aprilie":{$luna1=4;
break;
}
case "mai":{$luna1=5;
break;
}
case "iunie":{$luna1=6;
break;
}
case "iulie":{$luna1=7;
break;
}
case "august":{$luna1=8;
break;
}
case "septembrie":{$luna1=9;
break;
}
case "octombrie":{$luna1=10;
break;
}
case "noiembrie":{$luna1=11;
break;
}
case "decembrie":{$luna1=12;
break;
}
}
################## valideaza numarul de zile functie de luna selectata PENTRU DATA CABLARII ######################
if($anul>$anul1){
$_SESSION['mesaj_an']='Anul incheierii contractului este mai mare decat anul finalizarii contractului';
$erori++;
}
else if($anul<=$anul1){
$_SESSION['mesaj_an']="";
}
if(($luna>$luna1)&&($anul>=$anul1)){
$_SESSION['mesaj_luna']='Luna incheierii contractului este mai mare decat luna finalizarii contractului';
$erori++;
}
else {
$_SESSION['mesaj_luna']="";
}
if(($ziua>$ziua1)&&($luna>=$luna1)&&($anul>=$anul1)){
$_SESSION['mesaj_ziua_mare']='Ziua incheierii contractului este mai mare decat ziua finalizarii contractului';
$erori++;
}
else if($ziua<=$ziua1){
$_SESSION['mesaj_ziua_mare']="";
}
if((($anul%4)==0)&&($luna==2)&&($ziua>29)){
$_SESSION['mesaj_ziua']='Luna februarie are doar 29 de zile';
$erori++;
}else if((!($anul%4)==0)&&($luna==2)&&($ziua>28)){
$_SESSION['mesaj_ziua']='Luna februarie are doar 28 de zile';
$erori++;
}
if(($luna==4)&&($ziua>30)){
$_SESSION['mesaj_ziua']='Luna aprilie are doar 30 de zile';
$erori++;
}
if(($luna==6)&&($ziua>30)){
$_SESSION['mesaj_ziua']='Luna iunie are doar 30 de zile';
$erori++;
}
if(($luna==9)&&($ziua>30)){
$_SESSION['mesaj_ziua']='Luna septembrie are doar 30 de zile';
$erori++;
}
if(($luna==11)&&($ziua>30)){
$_SESSION['mesaj_ziua']='Luna noiembrie are doar 30 de zile';
$erori++;
}
################## valideaza numarul de zile functie de luna selectata PENTRU DATA INCHEIERII CONTRACTLUI ######################
if((($anul1%4)==0)&&($luna1==2)&&($ziua1>29)){
$_SESSION['mesaj_ziua1']='Luna februarie are doar 29 de zile';
$erori++;
}else if(!(($anul1%4)==0)&&($luna1==2)&&($ziua1>28)){
$_SESSION['mesaj_ziua1']='Luna februarie are doar 28 de zile';
$erori++;
}
if(($luna1==4)&&($ziua1>30)){
$_SESSION['mesaj_ziua1']='Luna aprilie are doar 30 de zile';
$erori++;
}
if(($luna1==6)&&($ziua1>30)){
$_SESSION['mesaj_ziua1']='Luna iunie are doar 30 de zile';
$erori++;
}
if(($luna1==9)&&($ziua1>30)){
$_SESSION['mesaj_ziua1']='Luna septembrie are doar 30 de zile';
$erori++;
}
if(($luna1==11)&&($ziua1>30)){
$_SESSION['mesaj_ziua1']='Luna noiembrie are doar 30 de zile';
$erori++;
}
if($abonat=='standard'){
$_SESSION['abonat']='standard';
$_SESSION['set_standard']="checked";
}
else {
$_SESSION['abonat']='protocol';
$_SESSION['set_protocol']="checked";
}
}
if($tip_abonat=="Persoana fizica"){
validare_fizica();
}
if($tip_abonat=="Persoana juridica"){
validare_juridica();}
if($erori>0){
$_SESSION['erori']="da";
$goto = "add_user.php?tip_abonat=$tip_abonat";
header("Location: $goto");
}
else if ($erori==0) {$_SESSION['erori']="nu";}
connect();
?>
<html>
<body bgcolor=#FFB366>
<form name="make_contract" method="post" action="make_contract.php" target=_blank>
<?php
if($tip_abonat=="Persoana fizica"){
print "<div align=\"center\"><big><font color=#2313EC><h2><i>Validare abonat</font> <font color=#FF0000>$nume $prenume</i></h2></font></big></div><br><br>\n";
}
else {
print "<div align=\"center\"><big><font color=#2313EC><h2><i>Validare abonat</font> <font color=#FF0000>$numefirma</i></h2></font></big></div><br><br>\n";
}
$data_incepere_contract=$anul."-".$luna."-".$ziua;
$data_finalizare_contract=$anul1."-".$luna1."-".$ziua1;
$abonat=$_SESSION['abonat'];
if($_SESSION['mail']){
$serviciu="mail";
}
if(($_SESSION['dialup'])&&($serviciu)){
$serviciu=$serviciu.","."dial-up";
}
else if(($_SESSION['dialup'])&&(!$serviciu)){
$serviciu="dial-up";
}
if(($_SESSION['config'])&&($serviciu)){
$serviciu=$serviciu.","."configurare software client";
}
else if(($_SESSION['config'])&&(!$serviciu)){
$serviciu="configurare software client";
}
if(($_SESSION['mailsuplimentar'])&&($serviciu)){
$serviciu=$serviciu.","."conturi postale suplimentare";
}
else if(($_SESSION['mailsuplimentar'])&&(!$serviciu)){
$serviciu="conturi postale suplimentare";
}
if(($_SESSION['suport'])&&($serviciu)){
$serviciu=$serviciu.","."suport tehnic la cerere";
}
else if(($_SESSION['suport'])&&(!$serviciu)){
$serviciu="suport tehnic la cerere";
}
if(($_SESSION['design'])&&($serviciu)){
$serviciu=$serviciu.","."design pagini web";
}
else if(($_SESSION['design'])&&(!$serviciu)){
$serviciu="design pagini web";
}
if(($_SESSION['publicare'])&&($serviciu)){
$serviciu=$serviciu.","."publicare pagini web";
}
else if(($_SESSION['publicare'])&&(!$serviciu)){
$serviciu="publicare pagini web";
}
if(($_SESSION['domeniu'])&&($serviciu)){
$serviciu=$serviciu.","."inregistrare domeniu propriu";
}
else if(($_SESSION['domeniu'])&&(!$serviciu)){
$serviciu="inregistrare domeniu propriu";
}
if(($_SESSION['mailhost'])&&($serviciu)){
$serviciu=$serviciu.","."mailhost";
}
else if(($_SESSION['mailhost'])&&(!$serviciu)){
$serviciu="mailhost";
}
if(($_SESSION['webhost'])&&($serviciu)){
$serviciu=$serviciu.","."webhost";
}
else if(($_SESSION['webhost'])&&(!$serviciu)){
$serviciu="webhost";
}
if(($tip_abonat=="Persoana fizica")&&($_SESSION['erori']=="nu")){
print "<table><tr>\n";
print "<td colspan=2><i><b>$tip_abonat</b></i></td></tr>\n";
print "<td>Nume:</td><td><i><b>$nume</b></i></td></tr>\n";
print "<td>Prenume:</td><td><i><b>$prenume</b></i></td></tr>\n";
print "<td>Oras:</td><td><i><b>$oras</b></i></td></tr>\n";
print "<td>strada:</td><td><i><b>$strada</b></i></td></tr>\n";
print "<td>numar:</td><td><i><b>$numar</b></i></td></tr>\n";
print "<td>Telefon:</td><td><i><b>$telefon</b></i></td></tr>\n";
print "<td>Bloc:</td><td><i><b>$bloc</b></i></td></tr>\n";
print "<td>Scara:</td><td><i><b>$scara</b></i></td></tr>\n";
print "<td>Etaj</td><td><i><b>$etaj</b></i></td></tr>\n";
print "<td>Apartament:</td><td><i><b>$apartament</b></i></td></tr>\n";
print "<td>Cod Postal:</td><td><i><b>$codpostal</b></i></td></tr>\n";
print "<td>Serie:</td><td><i><b>$serie</b></i></td></tr>\n";
print "<td>Numar buletin:</td><td><i><b>$nrbuletin</b></i></td></tr>\n";
print "<td>CNP:</td><td><i><b>$cnp</b></i></td></tr>\n";
print "<td>Eliberat de:</td><td><i><b>$sectia</b></i></td></tr>\n";
print "<td>Judet:</td><td><i><b>$judet</b></i></td></tr>\n";
print "<td>La data de</td><td><i><b>$data</b></i></td></tr>\n";
print "<td>Data inceperii contractului:</td><td><i><b>$data_incepere_contract</b></i></td></tr>\n";
print "<td>Data finalizarii contractului:</td><td><i><b>$data_finalizare_contract</b></i></td></tr>\n";
print "<td>Servicii selectate:</td><td><i><b>$serviciu</b></i></td></tr>\n";
print "</tr></table>\n";
$query="INSERT INTO identity values('','$tip_abonat','$nume', '','$prenume', '','','$oras', '$strada','$numar', '$telefon', '$bloc', '$scara', '$etaj', '$apartament', '$codpostal', '$serie', '$nrbuletin','$cnp','$data','$sectia','','','','$judet','','')";
$result=mysql_query($query);
$query1="INSERT INTO contract values('','$data_incepere_contract', '$data_finalizare_contract','$serviciu', '$abonat','$observatii','')";
$result1=mysql_query($query1);
}
else if(($tip_abonat=="Persoana juridica")&&($_SESSION['erori']=="nu")){
print "<table><tr>\n";
print "<td colspan=2><i><b>$tip_abonat</b></i></td></tr>\n";
print "<td>Denumirea firmei:</td><td><i><b>$numefirma</b></i></td></tr>\n";
print "<td>Reprezentantul firmei:</td><td><i><b>$reprezentant</b></i></td></tr>\n";
print "<td>E-mail:</td><td><i><b>$email</b></i></td></tr>\n";
print "<td>Web address:</td><td><i><b>$web</b></i></td></tr>\n";
print "<td>Oras:</td><td><i><b>$oras</b></i></td></tr>\n";
print "<td>strada:</td><td><i><b>$strada</b></i></td></tr>\n";
print "<td>numar:</td><td><i><b>$numar</b></i></td></tr>\n";
print "<td>Telefon:</td><td><i><b>$telefon</b></i></td></tr>\n";
print "<td>Bloc:</td><td><i><b>$bloc</b></i></td></tr>\n";
print "<td>Scara:</td><td><i><b>$scara</b></i></td></tr>\n";
print "<td>Etaj</td><td><i><b>$etaj</b></i></td></tr>\n";
print "<td>Apartament:</td><td><i><b>$apartament</b></i></td></tr>\n";
print "<td>Cod Postal:</td><td><i><b>$codpostal</b></i></td></tr>\n";
print "<td>Judet:</td><td><i><b>$judet</b></i></td></tr>\n";
print "<td>Numar inregistrare la Registrul Comertului:</td><td><i><b>$nrinreg</b></i></td></tr>\n";
print "<td>Cod fiscal:</td><td><i><b>$codfiscal</b></i></td></tr>\n";
print "<td>Cont:</td><td><i><b>$cont</b></i></td></tr>\n";
print "<td>Banca:</td><td><i><b>$banca</b></i></td></tr>\n";
print "<td>Data inceperii contractului:</td><td><i><b>$data_incepere_contract</b></i></td></tr>\n";
print "<td>Data finalizarii contractului:</td><td><i><b>$data_finalizare_contract</b></i></td></tr>\n";
print "<td>Servicii selectate:</td><td><i><b>$serviciu</b></i></td></tr>\n";
print "</tr></table>\n";
$query="INSERT INTO identity values('','$tip_abonat','', '$numefirma','', '$email','$web','$oras', '$strada','$numar', '$telefon', '$bloc', '$scara', '$etaj', '$apartament', '$codpostal', '', '','','','','$nrinreg','$codfiscal','$reprezentant','$judet','$cont','$banca')";
$result=mysql_query($query);
$query1="INSERT INTO contract values('','$data_incepere_contract', '$data_finalizare_contract','$serviciu', '$abonat','$observatii','')";
$result1=mysql_query($query1);
}
print "<center>\n";
$nume=$_SESSION['nume'];
$strada=$_SESSION['strada'];
$numar=$_SESSION['numar'];
$query2="SELECT id FROM identity WHERE nume='$nume' AND strada='$strada' AND numar='$numar' AND cnp='$cnp'";
$result2=mysql_query($query2);
$myrow=mysql_fetch_row($result2);
print "<input name=\"tip_abonat\" type=\"hidden\" value=\"$tip_abonat\">\n";
print "<input name=\"nume\" type=\"hidden\" value=\"$nume\">\n";
print "<input name=\"prenume\" type=\"hidden\" value=\"$prenume\">\n";
print "<input name=\"oras\" type=\"hidden\" value=\"$oras\">\n";
print "<input name=\"strada\" type=\"hidden\" value=\"$strada\">\n";
print "<input name=\"numar\" type=\"hidden\" value=\"$numar\">\n";
print "<input name=\"bloc\" type=\"hidden\" value=\"$bloc\">\n";
print "<input name=\"scara\" type=\"hidden\" value=\"$scara\">\n";
print "<input name=\"etaj\" type=\"hidden\" value=\"$etaj\">\n";
print "<input name=\"apartament\" type=\"hidden\" value=\"$apartament\">\n";
print "<input name=\"telefon\" type=\"hidden\" value=\"$telefon\">\n";
print "<input name=\"numefirma\" type=\"hidden\" value=\"$numefirma\">\n";
print "<input name=\"reprezentant\" type=\"hidden\" value=\"$reprezentant\">\n";
print "<input name=\"nrinreg\" type=\"hidden\" value=\"$nrinreg\">\n";
print "<input name=\"codfiscal\" type=\"hidden\" value=\"$codfiscal\">\n";
print "<input name=\"cont\" type=\"hidden\" value=\"$cont\">\n";
print "<input name=\"banca\" type=\"hidden\" value=\"$banca\">\n";
print "<input name=\"serie\" type=\"hidden\" value=\"$serie\">\n";
print "<input name=\"nrbuletin\" type=\"hidden\" value=\"$nrbuletin\">\n";
print "<input name=\"sectia\" type=\"hidden\" value=\"$sectia\">\n";
print "<input name=\"data\" type=\"hidden\" value=\"$data\">\n";
print "<input name=\"cnp\" type=\"hidden\" value=\"$cnp\">\n";
print "<input name=\"judet\" type=\"hidden\" value=\"$judet\">\n";
print "<input name=\"telefon\" type=\"hidden\" value=\"$telefon\">\n";
print "<input name=\"serviciu\" type=\"hidden\" value=\"$serviciu\">\n";
print "<input name=\"nrcontract\" type=\"hidden\" value=\"$myrow[0]\">\n";
print "<br>\n";
print "<INPUT TYPE=SUBMIT VALUE=\"Realizeaza contract\"></form>\n";
print "</center>\n";
?>
</body>
</html>
make_contract.php
<?
// check we have the parameters we need
if( !isset($nume) )
{
echo "<h1>Error:</h1>This page was called incorrectly";
}
else
{
//generate the headers to help a browser choose the correct application
header( "Content-type: application/msword" );
header( "Content-Disposition: filename=fact.rtf");
$date = date( "d.m.Y" );
// open our template file
$filename = "docs/contract.rtf";
$fp = fopen ( $filename, "r" );
//read our template into a variable
$output = fread( $fp, filesize( $filename ) );
fclose ( $fp );
// replace the place holders in the template with our data
$output = str_replace( "<<nrcontract>>", $nrcontract, $output );
$output = str_replace( "<<nume>>", strtoupper($nume), $output );
$output = str_replace( "<<prenume>>", strtoupper($prenume), $output );
$output = str_replace( "<<telefon>>", $telefon, $output );
$output = str_replace( "<<servicii>>", $serviciu, $output );
if($fax!=''){
$output = str_replace( "<<fax>>", $fax, $output );
}
else $output = str_replace( "<<fax>>", '-', $output );
if($bloc!=''){
$bloc=", bloc $bloc";
}
if($scara!=''){
$scara=", scara $scara";
}
if($etaj!=''){
$etaj=", etaj $etaj";
}
if($apartament!=''){
$apartament=", apartament $apartament";
}
if($telefon!=''){
$telefon=", telefon $telefon";
}
if(($cont!='')&&($banca!='')){
$cont_banca=", avand contul $cont deschis la $banca";
}
$numefirma1=strtoupper($numefirma);
$domiciliu_firma="cu sediul în $oras, Str $strada nr $numar$bloc$scara$etaj$apartament$telefon, înregistrata
la Registrul Comertului cu nr. $nrinreg, cod fiscal $codfiscal$cont_banca, reprezentata de $reprezentant, in calitate de beneficiar al serviciilor Internet";
$domiciliu_persoana="cu domiciliul în $oras, Str $strada nr $numar$bloc$scara$etaj$apartament$telefon, legitimat cu buletin/carte de identitate seria $serie
numar $nrbuletin eliberat de $sectia la data de $data, CNP $cnp, judet $judet in calitate de beneficiar al serviciilor Internet\n";
$numefizica=strtoupper($nume)." ".strtoupper($prenume);
$numejuridica=strtoupper($numefirma);
if($tip_abonat=="Persoana fizica"){
$output = str_replace( "<<numesolicitant>>", $numefizica, $output );
$output = str_replace( "<<domiciliu>>", $domiciliu_persoana, $output );
}
if($tip_abonat=="Persoana juridica"){
$output = str_replace( "<<numesolicitant>>", $numejuridica, $output );
$output = str_replace( "<<domiciliu>>", $domiciliu_firma, $output );
}
$output = str_replace( "<<data_azi>>", $date, $output );
// send the generated document to the browser
echo $output;
}
?>
search_user.php
<?php
session_start();
header("Cache-control: private"); //IE 6 Fix
include "library.php";
require_login();
destroy();
?>
<html>
<head>
<title></title>
</head>
<body bgcolor=#000537>
<?php
print "<form method=\"post\" action=\"search_user_result.php\"> \n";
print "<div align=\"center\"><big><font color=#FFFFB9><i><h3>Cautare in baza de date</font></h3></i></font></big></div><br><br>\n";
print "<table align=\"center\">\n";
print "<tr>\n";
print "<td><font color=#FFFFB9>Nume:</font></td><td><input type=\"Text\" name=\"nume\" maxlength=30 title='Aici introduceti numele pe care doriti sa il cautati in baza de date'></td></tr>\n";
print "<td><font color=#FFFFB9>Strada:</font></td><td><input type=\"Text\" name=\"strada\" maxlength=20 title='Aici introduceti numele strazii'></td></tr>\n";
print "</table><br><br>\n";
print "<table align=\"center\"><tr><td>\n";
print "<CENTER><INPUT TYPE=image src=\"images/search.gif\" height=\"18\" VALUE=\"submit\" alt=\"Cautare\"></CENTER> \n";
print "</form>\n";
print "</td><td>\n";
print "<form method=\"post\" action=\"show_user.php\"> \n";
print "<CENTER><INPUT TYPE=image src=\"images/back.gif\" height=\"18\" VALUE=\"submit\" alt=\"Inapoi\"></CENTER> \n";
print "</form>\n";
print "</td></tr></table>\n";
?>
</body>
</html>
search_user_result.php
<?php
session_start();
header("Cache-control: private"); //IE 6 Fix
include "library.php";
include "connect.inc";
require_login();
?>
<html>
<head>
<title></title>
</head>
<body bgcolor=#000537>
<?php
connect();
print "<div align=\"center\"><big><font color=#FFFFB9><i><h3>Rezultatele cautarii in baza de date</font></h3></i></font></big></div><br><br>\n";
$forma="Persoana fizica";
$forma1="Persoana juridica";
$query="SELECT nume,prenume,oras,strada,id,forma FROM identity WHERE forma LIKE '$forma' AND nume LIKE '%$nume%' AND strada LIKE '%$strada%' $sql_order";
$result=mysql_query($query);
$query1="SELECT numefirma,web,oras,strada,id,forma FROM identity WHERE forma LIKE '$forma1' AND numefirma LIKE '%$nume%' AND strada LIKE '%$strada%' $sql_order";
$result1=mysql_query($query1);
if(!isset($sort)||($sort=="desc")){
$sort="asc";
$sortare="crescator";
}
else if($sort=="asc"){
$sort="desc";
$sortare="descrescator";
}
$lungime=mysql_num_rows($result);
$lungime1=mysql_num_rows($result1);
if($lungime>0){
print "<center><b><i><font size=4 color=#FFFFFF>Persoane fizice</font></i></b></center><br>\n";
echo "<table ALIGN='CENTER' bgcolor=#CCCCCC border=1 cellspacing=0 cellpadding=5 bordercolor=#FFFFFF>\n";
echo "<tr><th>Nr.crt.</th>
<th><a href=\"search_user_result.php?sort=$sort&sql_order=+ORDER+BY+nume+$sort\" title='Ordoneaza $sortare dupa nume'>Nume</a></th>
<th><a href=\"search_user_result.php?sort=$sort&sql_order=+ORDER+BY+prenume+$sort\" title='Ordeaza $sortare dupa prenume'>Prenume</a></th>
<th><a href=\"search_user_result.php?sort=$sort&sql_order=+ORDER+BY+oras+$sort\" title='Ordeaza $sortare dupa oras'>Oras</a></th>
<th><a href=\"search_user_result.php?sort=$sort&sql_order=+ORDER+BY+strada+$sort\" title='Ordeaza $sortare dupa strada'>Strada</a></th>
<th align='center' colspan=\"2\">Actiuni</th>
</tr>\n";
$n=1;
$contor=1;
for($i=0; $i<$lungime; $i++){
$myrow=mysql_fetch_row($result);
$id=$myrow[4];
$edit="<a href=\"edit_user.php?id=$id\"><img width=\"20\" height=\"20\" src=\"images/edit.jpg\" alt=\"Editare\" title=\"Editare\" border=\"0\"></a>";
$delete="<a href=\"del_user.php?id=$id\"><img width=\"20\" height=\"20\" src=\"images/delete.jpg\" alt=\"Sterge\" title=\"Sterge\" border=\"0\" onClick=\"return delete_user();\"></a>";
if($n%2==0){ #ptr linii pare
printf("<tr bgcolor=#2696D9><td align='center'><font> %s </font></td><td align=\"center\"><font>%s </font></td><td align=\"center\"><font>%s </font></td><td align =\"center\"><font>%s </font></td><td align=\"center\"><font>%s </font></td><td bgcolor=#F0F0F0 align=\"center\"><font>%s </font></td><td bgcolor=#F0F0F0 align=\"center\"><font>%s </font></td>",
$contor, $myrow[0], $myrow[1], $myrow[2],$myrow[3],$edit,$delete);
$contor++;
}
else if($n%2!=0){
#ptr linii impare
printf("<tr bgcolor=#A7BEAD><td align='center'><font> %s </font></td><td align=\"center\"><font>%s </font></td><td align=\"center\"><font>%s </font></td><td align =\"center\"><font>%s </font></td><td align=\"center\"><font>%s </font></td><td bgcolor=#F0F0F0 align=\"center\"><font>%s </font></td><td bgcolor=#F0F0F0 align=\"center\"><font>%s </font></td>",
$contor, $myrow[0], $myrow[1], $myrow[2],$myrow[3],$edit,$delete);
$contor++;
}
$n++;
}
print "</table>\n";
print "<br><br>\n";
}
if($lungime1>0){
print "<center><b><i><font size=4 color=#FFFFFF>Persoane juridice</font></i></b></center><br>\n";
echo "<table ALIGN='CENTER' bgcolor=#CCCCCC border=1 cellspacing=0 cellpadding=5 bordercolor=#FFFFFF>\n";
echo "<tr><th>Nr.crt.</th>
<th><a href=\"search_user_result.php?sort=$sort&sql_order=+ORDER+BY+numefirma+$sort\" title='Ordoneaza $sortare dupa denumire firma'>Denumire firma</a></th>
<th><a href=\"search_user_result.php?sort=$sort&sql_order=+ORDER+BY+web+$sort\" title='Ordeaza $sortare dupa site firma'>Web</a></th>
<th><a href=\"search_user_result.php?sort=$sort&sql_order=+ORDER+BY+oras+$sort\" title='Ordeaza $sortare dupa oras'>Oras</a></th>
<th><a href=\"search_user_result.php?sort=$sort&sql_order=+ORDER+BY+strada+$sort\" title='Ordeaza $sortare dupa strada'>Strada</a></th>
<th align='center' colspan=\"2\">Actiuni</th>
</tr>\n";
$n=1;
$contor=1;
for($i=0; $i<$lungime1; $i++){
$myrow1=mysql_fetch_row($result1);
$id=$myrow1[4];
$edit="<a href=\"edit_user.php?id=$id\"><img width=\"20\" height=\"20\" src=\"images/edit.jpg\" alt=\"Editare\" title=\"Editare\" border=\"0\"></a>";
$delete="<a href=\"del_user.php?id=$id\"><img width=\"20\" height=\"20\" src=\"images/delete.jpg\" alt=\"Sterge\" title=\"Sterge\" border=\"0\" onClick=\"return delete_user();\"></a>";
if($n%2==0){ #ptr linii pare
printf("<tr bgcolor=#2696D9><td align='center'><font> %s </font></td><td align=\"center\"><font>%s </font></td><td align=\"center\"><font>%s </font></td><td align =\"center\"><font>%s </font></td><td align=\"center\"><font>%s </font></td><td bgcolor=#F0F0F0 align=\"center\"><font>%s </font></td><td bgcolor=#F0F0F0 align=\"center\"><font>%s </font></td>",
$contor, $myrow1[0], $myrow1[1], $myrow1[2],$myrow1[3],$edit,$delete);
$contor++;
}
else if($n%2!=0){
#ptr linii impare
printf("<tr bgcolor=#A7BEAD><td align='center'><font> %s </font></td><td align=\"center\"><font>%s </font></td><td align=\"center\"><font>%s </font></td><td align =\"center\"><font>%s </font></td><td align=\"center\"><font>%s </font></td><td bgcolor=#F0F0F0 align=\"center\"><font>%s </font></td><td bgcolor=#F0F0F0 align=\"center\"><font>%s </font></td>",
$contor, $myrow1[0], $myrow1[1], $myrow1[2],$myrow1[3],$edit,$delete);
$contor++;
}
$n++;
}
print "</table>\n";
print "<br><br>\n";
}
else if(($lungime==0)&&($lungime1==0)){
print "<div align=\"center\"><big><font color=#FF8000><i><h4>Cautarea nu a intors nici un rezultat. Mai incercati!!!</font></h4></i></font></big></div><br><br>\n";
}
print "<form method=\"post\" action=\"search_user.php\"> \n";
print "<CENTER><INPUT TYPE=image src=\"images/back.gif\" height=\"18\" VALUE=\"submit\" alt=\"Inapoi\"></CENTER> \n";
print "</form>\n";
?>
</body>
</html>
Bibliografie
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: . Aplicatie Informatica Pentru Managementul Serviciilor Internet (ID: 148948)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
