php si xml

Upload: neogeo0

Post on 15-Jul-2015

148 views

Category:

Documents


4 download

TRANSCRIPT

Documente XML 1. Despre XMLXML vine de la Extensible Markup Language. XML e o forma de SGML (Standard Generalized Markup Language), pe scurt, acesta defineste o sintaxa pentru structurarea datelor (un limbaj) pe care si omul si calculatorul sa le poata citi. Fiind un curs de PHP, explicatiile despre XML vor fi mai putine, scurte si simple, cat e necesar pentru a se intelege ce e si cum poate fi utilizat cu PHP. Ca sa intelegeti cam ce este XML si ce se poate face cu el, ganditi-va ca e similar cu HTML-ul, dar fara aspect grafic, in sensul ca structura acestuia se formeaza pe baza unor tag-uri (elemente), precum , , etc. in HTML, si care pot contine atribute (sau identificatori), iar in acelasi timp este o mini baza de date, deoarece scopul documentelor XML e acela de a aranja si stoca date intr-o anumita ordine si structura erarhica care sa poata fi citite si prelucrate de un alt limbaj, precum PHP. Documentele XML pot fi create, scrise, folosind un editor simplu de texte (precum Notepad). Dupa cum puteti vedea in modelul de mai jos, un document XML e asemanator cu unul HTML (daca stiti deja acest limbaj). Datele sunt incadrate in niste tag-uri. Spre deosebire de HTML, in XML denumirea tag-urilor (tehnic elemente) nu e stricta, putand fi folosite nume alese de fiecare in functie de optiunea fiecaruia pentru recunoasterea datelor ce vor fi scrise, care respecta cateva reguli minime. Aceste reguli sunt: Documentul XML trebuie sa inceapa cu sintaxa: urmata de un element de baza (radacina) care va cuprinde toate celelalte elemente (precum ), in exemplu de mai jos Elementele trebuie sa aiba tag-uri de inchidere sau inchidere singulara (slash la sfarsitul tag-ului: ) si sa fie ierarhice, astfel e corect: ... sau ... (incorect sau ) Caracterele &, , ', " sunt restrictionate in interiorul datelor, putand fi folosite prin escapare, cu forma: &, , ', " XML este case-sensitive, astfel e diferit de , de aceea e indicat sa folositi litere mici la elemente si atribute pentru a evita confuzia. Exemplu de document XML: Editura Titlu carte O fraza din sectiunea acestui sub-capitol. Alta fraza din acelasi sub-capitol.

- Acesta este o structura XML creata pentru stocarea ordonata a unor date despre carti. Datele astfel stocate (cum puteti vedea in exemplul de sus) pot fi relativ usor citite si intelese de om (putand fi modificate simplu daca e nevoie) dar si de un limbaj de programare (PHP, ASP) care le preia din fisierul .xml, le prelucreaza si le poate aranja, manipula si transmite catre o alta aplicatie, precum un navigator (browser) web. In practica se folosesc de obicei pentru stocarea datelor baze de date SQL, iar acest format XML este de preferat cand se doreste utilizarea acestor date de catre mai mullti agenti, in general in scop de citire; transmiterea fiind mai rapida si economica, de exemplu: Stiri, Meteo, Clasamente, etc. Aici apare rolul important al limbajului PHP, care, dupa ce a preluat aceste date din fisierul .xml (ce poate fi pe alt server) le poate include intr-o pagina HTML pentru a fi afisate in browser, sau introduce intro alta baza de date mai mare. PHP are functii speciale pentru citirea, recunoasterea si manipularea datelor din format XML si chiar pentru crearea, scrierea de documente XML (daca are permisiuni de scriere pe server). Vor fi aratate in tutorialele (lectiile urmatoare.

2. Documente XML si DTDCerintele, criteriile, pentru scrierea unui document XML corect sunt simple si minime. Totusi, un document XML valid si usor de inteles are nevoie sa urmeze anumite reguli stabilite, cunoscute generic ca DTD (Document Type Definition). Ca sa intelegeti ce este si la ce e nevoie DTD, studiati urmatorul exemplu in comparatie cu cel de sus. Titlu capitol O fraza din sectiunea acestui sub-capitol. Alta fraza din acelasi sub-capitol.

- La prima vedere pare similar, dar, desi datele esentiale transmise sunt aceleasi, structura poate fi diferita. Se observa elemente cu alte denumiri si adaugarea de atribute. Pentru a folosi datele din documentele XML, trebuie sa le cunoasteti structura aranjarii lor si forma ierarhica, astfel puteti adauga noi date (de exemplu aici carti) care trebuie sa respecte acelasi format. Iar in cazul unor documente mai mari, cu ierarhii mai multe, intelegerea lor devine mai greoaie si va dura mai mult timp. Aici intervine rolul DTD, o forma de explicare pe scurt a structurii aranjarii datelor si relatia dintre ele. Adica, scrierea sub forma unei liste a specificatiilor exacte despre cum sunt elementele legate intre ele, ce tip si nume au fiecare si ce atribute sunt necesare. De exemplu, pentru modelul de sus, daca cineva doreste sa-l foloseasca si sa adauge noi carti, am putea scrie o descriere astfel: Obiectul radacina al acestu document este "book"

"book" are doar un atribut "title" "book" e compus direct din doua elemente: "publisher" si chapter" "publisher" are doar un atribut "name" "chapter" are un atribut "number" si doua elemente "chapter_title" si "p" "p" poate contine mai multe elemente "sentence"

- Astfel, dand o copie a acestei liste oricui are nevoie de acest document XML, va ajuta la intelegerea mai rapida si usoara a structurii datelor pentru a le folosi sau adauga corect altele noi. Se poate lucra in PHP cu datele din XML dupa ce a fost inteleasa structura lor. Setul de reguli DTD (Document Type Definition) poate fi specificat (scris) direct in documentul XML (precum documentatiile in PHP), intr-un tag special !DOCTYPE (document type declaration) si cu o sintaxa specifica. Exemplu listei de sus este pentru intelegerea de catre alte persoane, dar exista o sintaxa standard DTD care se adauga de obicei la inceputul fisierului XML. Pentru obiectul acestui curs nu e nevoie de cunostinte mai multe despre asta, vedeti totusi cum e in exemplul urmator. Ca sa intelegeti cum se poate adauga setul de reguli standard DTD direct in XML, vedeti exemplul urmator (partea scrisa ingrosat). recipe name CDATA #REQUIRED> ingredients (#PCDATA)> directions (#PCDATA)> servings (#PCDATA)>

Legume Paine Adauga la pachet 12

-

Documentul XML e impartit in 3 sectiuni. Prima sectiune e linia standard XML. A doua sectiune e setul intern de reguli DTD, marcat cu linii care incep cu (document type declaration), 'recipe" fiint obiectul (elementul) radacina. Daca aveti mai multe documente cu aceeasi structura, se poate folosi un singur DTD dintr-un fisier extern, decat in fiecare, mai usor de actualizat in urma unei modificari. Si in cazul utilizarii unui DTD extern, trebuie folosit !DOCTYPE care sa precizeze locatia acestuia. Iata 2 exemple, in primul, SYSTEM indica locatia pe server, iar in al doilea, PUBLIC specifica un DTD standardizat (intalnnit si in documente HTML sau XHTML): si

In cazul aceluiasi DTD de mai sus, dar in fisier extern, "recipe.dtd" ar arata astfel: recipe name CDATA #REQUIRED> ingredients (#PCDATA)> directions (#PCDATA)> servings (#PCDATA)>

Fara !DOCTYPE si paranteze patrate. Prin urmare, un document XML valid este acela care are un format corect, respecta minimile reguli de sintaxa, dar contine si un DTD. Aceasta a fost partea teoretica, de scurta introducere in formatul XML, in tutorialul urmatoar e prezentate aspectul practic si modul de lucru cu PHP.

Lucru cu XML - DOMPentru exemplele prezentate e nevoie de PHP 5+ 1. Module de lucru cu XML Pentru a prelucra in PHP datele dintr-un document XML trebuie ca acesta sa aibe structura si sintaxa corecta comform standardului XML, nu e nevoie sa fie strict valid, adica sa contina si DTD (vedeti explicatii despre asta in lectia precedenta), dar indicat e sa fie si valid. Sunt trei moduri (module) pentru lucrul cu XML: SimpleXML, DOM (Document Object Model) si SAX (Simple API for XML); toate trei sunt incluse in PHP. Fiecare are avantaje si minusuri, pot fi folosite oricare din ele pentru a lucra cu datele din XML, pt. a crea, extinde si modifica documente XML. In continuare iata cate ceva, pe scurt, despre aceste module, dupa care va fi explicat DOM, iar in lectia urmatoare si celelalte doua. SAX SAX este mai usor de invatat, dar trateaza in esenta XML ca un sir de date. Acest lucru face dificila adaugarea de noi elemente sau atribute, ori modificarea unuia anume. SAX e util pt. lucruri repetitive ce pot fi aplicate tuturor elementelor de acelasi tip. De exemplu, inlocuirea uni anumit element cu tag HTML pt. a transforma XML in HTML. DOM Extensiile PHP DOM citesc documentul XML si creaza pe baza acestuia, in memorie, un obiect cu o structura ierarhica de tip arbore, incepand cu un element (sau obiect) numit Nod (Node), elementele (obiectele) care sunt cuprinse (incadrate) in acesta se numesc Copii (Children) ai acestui obiect, iar elementele care-l cuprind (contin) pe el se numesc Parinti (Parents). Cu functiile specifice DOM se poate obtine, modifica sau crea oricare din aceasta ierarhie sau continutul, textul din ele. Apoi aceste date se pot folosi independent, fiecare unde este necesar. Dezavantajul poate fi faptul ca foloseste mai multe resurse, memorie.

DOM trebuie sa aibe in memorie tot arborele ierarhic inainte de a incepe analiza documentului XML, fapt ce afecteaza procesarea documentelor XML ce depasesc memoria alocata, dar se poate depasi aceasta limitare prin folosirea unui spatiu de pe hard-disc ca memorie. SimpleXML SimpleXML lucreaza cel mai bine pentru deschiderea si citirea rapida a datelor unui document XML, converteste elementele si atributele din XML in variabile native PHP (siruri, matrice) care pot fi utilizate dupa cum se face normal cand sunt scrise in PHP. SimpleXML foloseste mai putina memorie decat DOM, economiseste resurse si timp prin faptul ca necesita putine linii de cod, executa mai putine apelari decat fac SAX si DOM. Minusul acestuia sunt unele probleme ce pot apare cand e vorba de elemente imbricate mai adanc. 2. DOM XML Document Object Model (DOM) e un modul complet pentru crearea, editarea si manipularea datelor din documentele XML. Deoarece aceste date sunt retinute in memorie sub forma de arbore ierarhic, e recomandat ca documentul XML sa fie valid. Fiecare element e transformat intr-un Obiect si e vazut ca un Nod ce poate avea Continut, Parinti si Copii; incepand cu elementul radacina. La randul lor, fiecare din acestia putand fi un Nod si interpretat ca un Obiect separat, devenind totul o structura legata dar si individuala. Aceasta structura poate fi modificata cu functii speciale (dintr-o librarie de functii cum e "gnome-libxml2" care sunt implementate in PHP) si rescrisa iar intr-un format XML. Exemplu 1 - Creare document XML cu PHP Pentru a intelege despre ce e vorba, vom lua un exemplu practic. Vom crea cu PHP un document XML cat mai simplu, folosind functiile DOM XML. Etapele de lucru sunt urmatoarele: 1. Se creaza in memorie un nou obiect XML. 2. Se creaza si adauga cateva elemente, un atribut si un continut text. Aici alcatuim o structura cu tag-uri HTML 3. Se vor scrie (salva) datele intr-un fisier .xml (denumit "exemplu_dom.xml") pe server (PHP trebuie sa aiba permisiuni de scriere pe server). Codul PHP pentru crearea acestuia este urmatorul. Explicatiile necesare le gasiti in cod.

Copiati acest script intr-un fisier .php si apelati-l din browser, daca va crea cu succes fisierul "exemplu_dom.xml" va afisa un mesaj afirmativ. Ca sa vedeti rezultatul, deschideti acest fisier cu un editor de text (sau un browser). Exemplu 2 - Modificare document XML cu PHP Dupa ce e creat, sau aveti deja un document XML, poate apare necesitatea de a modifica ceva la el, schimbarea continutului unui element, adaugarea unui element nou, sau altele. In urmatorul exemplu puteti invata cum se poate face cu PHP DOM cateva modificari la datele dintr-un document XML si salvate in alt fisier .xml. Va fi folosit documentul creat in primul exemplu, la care va fi modificat continutul text din elementul (tag-ul) 'p' si va fi adaugat un alt element 'div' in acelasi parinte unde e si 'p'. Explicatiile necesare le gasiti in cod. Etapele sunt urmatoarele: 1. Se creaza un nou obiect in memorie si se adauga in el datele dintr-un document XML existent. 2. Se preia si parcurg elementele (care devin Nod-uri) din documentul adaugat. 3. Cand parcurgerea ajunge la elementul caruia dorim sa-i adaugam un nou continut text, adauga (modifica) pe cel existent, creaza un nou element cu nume si text pe care-l adauga dupa cel modificat (in acelasi parinte)load($file); $get_elms = $doc->getElementsByTagName("*"); $nr_elms = $get_elms->length; // Calea si numele fisierului .xml // // // // Creaza un nou obiect in memorie Incarca datele din $file in obiectul nou creat Preia toate elementele ("*") stocate in obiect Obtine numarul de elemente (Nodes) preluate

// Parcurge variabila cu obiectul ce stocheaza elementele (Nod-urile) for($i = 0; $iitem($i); $element = $node->nodeName; // Preia fiecare Nod din parcurgere // Obtine numele elementului

// Daca elementul este 'p', ii adauga alt continut text if($element=='p') { $node->nodeValue = 'Un continut text nou'; // Creaza noul element dupa 'p' (in elementul Parinte unde se afla si 'p'), cu nume si continut text $element_nou = $doc->createElement('div', 'Acesta este elementul nou adaugat'); $node->parentNode->appendChild($element_nou); // Adauga in elementul parinte noul element creat

} }

// Daca poate salva noul continut XML (din obiectul $doc) intr-un fisier .xml // Preia continutul si intr-un sir (cu "saveXML()") pt. a afisa rezultatul obtinut if($doc->save('exemplu2_dom.xml')) { echo htmlentities($doc->saveXML()); } // Daca doriti rescrierea primului document XML, inlocuiti 'exemplu2_dom.xml' cu numele aceluia ?>

Obs. O lista cu mai multe functii utile in lucrul cu DOM si XML in PHP gasiti la pagina -> Functii DOM XML In tutorialul urmator este explicat utilizarea modulului SAX

Lucru cu XML - SAXSAX (Simple API for XML) este utilizat pe scara larga pentru a analiza documente XML. E un API bazat pe evenimente. Functiile pentru aceste evenimente nu sunt standard, ci sunt create de utilizator. Utilizatorul creaza un numar de functii ce sunt apelate cand este recunoscut un anumit eveniment. Analiza documentelor XML cu SAX este unidirectionala. In timp ce analiza parcurge datele XML, sunt recunoscute bucati din XML precum: elemente, atribute, continut text, fiecare fiind un eveniment, iar datele asociate unui eveniment sunt transmise la o functie creata de utilizator, dupa ce functia termina operatiile analiza XML-ului continua. Datele care au fost analizate anterior nu pot fi recitite decat incepand iar parsarea. Avantajul principal fata de DOM este faptul ca SAX foloseste mai putina memorie si procesarea datelor poate fi mai rapida. DOM trebuie sa aibe in memorie tot arborele ierarhic inainte de a incepe analiza documentului XML, fapt ce afecteaza procesarea documentelor XML ce depasesc memoria alocata, (dar se poate depasi aceasta limitare in cazul DOM prin folosirea unui spatiu de pe hard-disc ca memorie). In schimb, cantitatea de memorie folosita de SAX depinde de adancimea imbricarii elementelor si de cantitatea de date a atributelor dintr-un element, ambele fiind mai mici decat marimea arborelui, ceea ce-l face o alternativa mai buna in cazul documentelor XML mari dar cu adancime de imbricare mai mica. 1. Utilizarea SAX Utilizarea SAX depinde in general de scopul prelucrarii documentului XML, deoarece utilizatorul scrie functiile necesare, dar sunt cativa pasi comuni: 1. Determinarea evenimentelor care se doresc folosite. 2. Scrierea functiilor ce vor fi apelate pentru fiecare eveniment, de cele mai multe ori pentru scrierea datelor, inceputul si sfarsitul unui eveniment. 3. Crearea unui parser folosind "xml_parser_create()" si apoi apelarea lui cu "xml_parse()". 4. Eliberarea memoriei cu "xml_parser_free().".

Urmatorul exemplu arta modul de creare si utilizare a acestor functii de baza. Ca model, va fi folosit urmatorul document XML, stocat intr-un fisier "exemplu_sax.xml": Un text din carte

Cu functiile definite mai jos, vor fi prelucrarte si afisate numele, atributele si continutul text din fiecare element al acxestui document XML. Documentatia din cod explica detaliat rolul si utilizarea fiecarei functii.valoare function startElement($parser, $name, $ar_attr) { // Aici pot fi prelucrate matricea cu atributele ($ar_attr) si numele elementului ($name) echo "$name - "; // Afiseaza numele elementului

// Daca matricea contine cel putin un atribut, o parcurge if(count($ar_attr)>0) { foreach($ar_attr as $atr=>$val) { echo " $atr => $val ,"; // Preia si afiseaza numele si } } }

valoarea fiecarui atribut

// Functie apelata la sfarsitul fiecarui element // Pe langa $parser (analizatorul), $name stocheaza numele elementului (la inchidere)

function endElement($parser, $name) {// Aici, daca se mai doreste de facut ceva dupa ce a ajuns la inchiderea elementului

print "\n"; }// Functie apelata de fiecare data cand sunt intalnite caractere de date (continut text) in element // Pe langa $parser (analizatorul), $value stocheaza valoarea elementului intalnit (continutul-text)

function characterData($parser, $value){ // Aici pot fi manipulate datele din $value echo "$value
"; // Afiseaza valoarea transmisa functiei }// Se defineste analizatoru care va fi apelat alaturi de functiile pentru evenimente (definite mai sus) // Pentru a utiliza standardul ISO-8859-1, se sterge parametru 'utf-8'

$simpleparser = xml_parser_create('utf-8');// Daca se doreste anularea preluarii cu majuscule (se sterge // din fata functiei) // xml_parser_set_option($simpleparser, XML_OPTION_CASE_FOLDING, 0); // Evenimentul care apeleaza functiile la inceputul si sfarsitul fiecarui element

xml_set_element_handler($simpleparser, "startElement", "endElement");// Eveniment ce apeleaza functia "characterData()" cand analiza ajunge la continutul din element

xml_set_character_data_handler($simpleparser, "characterData");// Deschide fisierul XML pentru citire

if($fo = fopen($file, "r")) { // Preia continutul fisierului intr-un sir while ($date_xml = fread($fo, filesize($file))) {// Transmite datele la parser (analizator)

if (!xml_parse($simpleparser, $date_xml, feof($fo))) {// Afiseaza eroarea aparuta daca analiza nu poate fi executata

echo xml_error_string(xml_get_error_code($simpleparser)); } } fclose($fo); }// Elibereaza memoria folosita pt deschiderea fisierului

else echo "Nu a putut citi $file"; // Elibereaza memoria folosita la parsare xml_parser_free($simpleparser); ?>

Acest script va afisa urmatorul rezultat: CARTI TITLU - TITLUL => Titlu Carte , ID => 1 , AUTOR - NUME => Nume Autor , TEXT - Un text din carte PRET - SUMA => 00 , Observati ca numele elementelor si atributelor sunt receptionate si returnate de SAX cu majuscule. In mod initial, SAX foloseste aceste nume cu majuscule iar formatul caracterelor e ISO-8859-1. Pentru a anula preluarea cu majuscule si folosirea unui alt format (US-ASCII sau UTF8) se poate utiliza functia "xml_parser_set_option()", care preia ca prim argument parserul creat, apoi o constanta: ML_OPTION_CASE_FOLDING sau XML_OPTION_TARGET_ENCODING pentru format; al treilea argument este optiunea acelei constante. De exemplu, pentru anularea preluarii cu majuscule si utilizarea coding-ului UTF-8, se foloseste urmatorul cod la definirea analizatorului: // Se defineste analizatoru $simpleparser = xml_parser_create(); // Anuleaza preluarea cu majuscule si foloseste formatul UTF-8 xml_parser_set_option($simpleparser, XML_OPTION_CASE_FOLDING, 0); xml_parser_set_option($simpleparser, XML_OPTION_TARGET_ENCODING, 'UTF8'); Pentru definirea formatului de codare, se poate specifica direct in functia "xml_parser_create('utf-8')". 2. Functii SAX Iata o lista cu cele mai importante functii SAX: xml_parser_create([format]) - Creaza parser-ul (analizatorul), pot fi create mai multe in acelasi script. Format e optional, 'utf-8' daca se doreste acesta. xml_parser_free(parser) - Elibereaza memoria folosita de parametru "parser", care a fost creat cu "xml_parser_create()". xml_parse(parser, "date_xml" [, final]) - Porneste analiza datelor XML, din "date_xml", cu analizatorul "parser". Parametru trei, "final" e optinal, precizeaza ultima bucata de date unde sa se termine analiza. xml_get_error_code(parser) - Daca procesarea esueaza, aceasta functie returneaza un cod de eroare din care se poate gasi cauza problemei. xml_error_string(errorcode) - Returneaza un sir care specifica eroarea gasita de "xml_get_error_code()", dat ca parametru. xml_set_element_handler(parser, start_element_handler, end_element_handler) - Aceasta functie seteaza evenimentele (functiile definite de utilizator) ce trebuiesc apelate la inceputul, apoi inchiderea, unui element.

xml_set_character_data_handler(parser, date_handler) - Seteaza evenimentul cu functia ce trebuie apelata cand analiza ajunge la contextul (continutul text) al elementului. xml_set_default_handler(parser, handler) - Seteaza evenimentul "default" care e apelat daca nu a fost definita o anume apelare pentru un eveniment.

In tutorialul urmator este explicat utilizarea modulului SimpleXML.

PHP - XML - SimpleXMLSimpleXML a aparut in PHP 5. Lucreaza ca si DOM, cu obiecte, preia tot documentul XML sub forma unui arbore ierarhic in memorie, dar spre deosebire de acesta, e mai flexibil si foloseste mai putina memorie deoarece elementele sunt stocate direct ca variabile PHP (de tip string si array) si astfel pot fi imediat utilizate. Foloseste un minim necesar de cod si are o forma intuitiva a datelor. In SimpleXML se lucreaza mult cu functii pentru Array, majoritatea datelor sunt stocate in variabile de tip array. Este util cand se doreste citirea catorva date dintr-un document XML, a carui structura o cunoasteti, si scrierea altora inapoi. Ca si in cazul DOM, este indicat ca documentul XML sa aibe un format corect facut, cel mai bine, valid. 1. Citire document XML cu SimpleXML La inceput se preia documentul XML dintr-un fisier (cu simplexml_load_file().) sau dintr-un sir (cu simplexml_load_string()) care este imediat adaugat sub forma de obiect in memorie. Apoi se face referire direct la oricare element din obiect, dupa cum puteti vedea in exemplul de mai jos (trebuie sa stiti structura datelor XML si elementele pe care doriti sa le folositi). Ca model, va fi folosit urmatorul document XML, stocat intr-un fisier "exemplu_simplexml.xml": Un text din carte Un alt paragraf din carte Un text din a doua carte Un alt paragraf din cea dea doua carte

- Urmatorul script preia si afisaza cateva date din acest document XML (explicatiile necesare sunt in cod).titlu; // Preia toate elementele cu nume "titlu" (intr-o variabila tip array) $text = $obj->titlu[0]->text; // Preia toate elementele cu nume "text" din primul element "titlu"

// Parcurge matricea cu $titlu si preia intr-un array elementele "autor" si "pret" din fiecare

for($i=0; $iautor; $pret[] = $titlu[$i]->pret; } // Afiseaza valoarea atributului "nume" din primul element "autor" echo $autor[0]['nume']. '
'; // Nume Autor

// Afiseaza valoarea atributului "suma" din al doilea element "pret" echo $pret[1]['suma']. '
'; // 00

// Parcurge matricea $text (cu elementele "text" din primul "titlu") // Afiseaza valoarea fiecaruia for($i=0; $i // Un text din carte - Un alt paragraf din carte

Testati singuri exemplul pentru a vedea rezultatul (folosind documentul XML "exemplu_simplexml.xml"). 2. Modificare document XML cu SimpleXML Pe langa a prelua si folosi date dintr-un document XML, cu SimpleXML se poate si adauga date noi in acel document. Pentru a modifica valorile unor elemente sau atribute deja existente, se identifica acel element (sau atribut - cheie in matricea elementului) in sistemul ierarhic, si i-se atribue o noua valoare (vedeti metoda in exemplu de mai jos). Daca studiati si testati urmatorul exemplu, puteti intelege cum se modifica document-ul XML (Scriptul va folosi acelasi fisier ca in primul exemplu, "exemplu_simplexml.xml").titlu; // Calea si numele fisierului .xml

// Preia toate elementele cu nume "titlu" (intr-o variabila tip array)

//Parcurge matricea cu $titlu si adauga, cu "addChild("inca un element in fiecare,denumit "stoc",cu val 1

for($i=0; $iaddChild('stoc', 1); } // Modifica valoarea atributului 'nume' din elementul "autor" al primul element "titlu" $titlu[0]->autor['nume'] = 'Nume Modificat'; // Folosind sistemul de lucru cu array, creaza inca un element "autor" (fiind al doilea cu acelasi nume, are indice [key] 1) $titlu[0]->autor[1] = 'Alt autor';// Tot cu sistemul de matrice, adauga in al doilea element "autor" inca o cheie 'atribut', cu o valoare, care vor deveni atributul elementului

$titlu[0]->autor[1]['atribut'] = 'Atribut_adaugat'; // Adauga datele XML intr-un sir $xml_doc = $obj->asXML(); echo htmlentities($xml_doc); ?> // Afiseaza documentul XML rezultat

O lista cu mai multe functii utile pentru lucrul cu SimpleXML gasiti la pagina -> Functii SimpleXML

PHP PDO - Introducere si Conectari la Baze de DatePDO (PHP Data Objects) este o extensie PHP pentru accesare baze de date in PHP. PDO foloseste caracteristicile OOP (Programare Orientata pe Obiecte) valabile incepand cu PHP 5.1. Deoarece PDO lucreaza cu clase si obiecte, trebuie sa fiti familiarizati cu modul de lucru al programarii orientate pe obiecte. PDO poate lucra cu urmatoarele tipuri de baze de date: MySQL PostgreSQL SQLite 2 & 3 Firebird Informix (IBM Informix Dynamic Server) ODBC Oracle DBLM: FreeTDS / Sybase / MS-SQL IBM (IBM DB2) Unul din avantajele PDO este acela ca se folosesc functii similare pentru interogarea si prelucrarea bazelor de date, indiferent de tipul lor (din cele mentionate mai sus). Script-urile care folosesc interfata PDO pentru conectare la baza de date efectueaza in general urmatoarele operatii:

1.

Conectare la serverul bazei de date, prin apelare new PDO(), obtinand un obiect pentru lucru cu acea baza de date. 2. Aplicare functii specifice PDO pt. efectuarea interogarilor la baza de date. 3. Retinerea si prelucrarea datelor returnate. 4. Deconectarea de la server. - Pentru a vedea daca PDO este valabil pentru baza dv. de date, se poate verifica cu phpinfo(), unde e o sectiune PDO, sau cu metoda PDO::getAvailableDrivers()foreach(PDO::getAvailableDrivers() as $driver) { echo $driver.''; }

1. Conectare la baza de date Orice interactiune cu o baza de date incepe prin conectarea la ea. In functie de tipul bazei de date se face intai conectarea, prin crearea unei instante de obiect cu new PDO(). Dupa conectare se aplica metodele PDO pentru retinerea si prelucrarea datelor, care in mare parte sunt aceleasi, indiferent de baza de date conectata. Iata cum se face conectarea la cateva din acestea: Conectare la MySQL

In variabila $dbh se creaza obiectul PDO in care vor fi stocate datele transmise de la serverul MySQL. La aceasta instanta de obiect vor fi aplicate metodele pentru prelucrarea datelor. Observati ca s-a folosit formula try() ... catch(), aceasta pentru a nu expune datele de conectare in cazul vreunei erori. De exemplu, folosind aceasta tehnica, daca numele bazei de date este incorect, returneaza ceva de genul: SQLSTATE[42000] [1049] Unknown database 'numebd' Daca numele sau parola sunt gresite, afiseaza ceva similar cu: SQLSTATE[28000] [1045] Access denied for user 'numele'@'localhost' (using password: YES) Dar, daca s-ar folosi direct:

Mesajul de eroare ar expune mai multe date, inclusiv parola, dupa cum se vede mai jos:Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[28000] [1045] Access denied for user 'numele'@'localhost' (using password: YES)' in E:\server\www\zzz.php:14 Stack trace: #0 E:\server\www\zzz.php(14): PDO>__construct('mysql:host=loca...', 'numele', 'parola') #1 {main} thrown in E:\server\www\zzz.php on line 7

Deci, este indicata aplicarea formulei try() ... catch(). Conectare PostgreSQL

Conectare la SQLite Cand PDO e folosit cu SQLite, trebuie specificata doar calea catre fisierul cu baza de date. Daca acesta nu exista, va incerca sa-l creeze.

Conectare la Firebird Firebird este o baza de date folosita pe Windows.

Conectare la Informix

Conectare la Oracle

Conectare la ODBC Exista mai multe conexiuni ODBC care pot fi create. Iata conectarea la o baza de date MS Access, numita "accounts".

Conectare la DBLIB O alta baza de date specifica Windows. Conectare la IBM Urmatorul exemplu arata conectarea la o baza de date IBM DB2 numita "accounts".

2. Inchiderea conexiunii cu baza de date In mod normal, PHP inchide conexiunea la baza de date dupa ce a fost executat tot scriptul. Dar deconectarea se poate face si intentionat, atribuind valoare null la obiectul PDO, dupa cum e prezentat in exemplu de mai jos. Instanta la acel obiect va fi distrusa, prin urmare, aceasta metoda trebuie adaugata dupa ce au fost scrise toate instructiunile care trebuie aplicate obiectului PDO. Deconectarea prin aceasta metoda este utila deoarece elibereaza memoria folosita.

In tutorialul urmator e prezentat modul de creare si adaugare date in tabel MySQL, INSERT, UPDATE si DELETE folosind metoda PDO exec().

PHP PDO - exec (INSERT, UPDATE, DELETE) MySQLDupa ce se realizeaza cu succes conectarea la baza de date (aici MySQL) si se creaza instanta de obiect PDO, poate fi utilizata pentru executia de interogari SQL. Interogarile SQL cu PDO pot fi facute in 2 moduri: direct (cu metodele "exec()" si "query()"), sau cu declaratiile prepare() ... execute(). Prima varianta e mai simpla si in aceasta lectie va fi prezentata metoda exec. Comenzile care modifica randuri din tabel, dar nu returneaza un set de rezultate cu randuri si coloane (INSERT, UPDATE), se transmit cu metoda exec(), aceasta returneaza numarul de randuri afectate, sau FALSE in caz de eroare. $count = $dbh->exec("Comanda SQL"); Interogarile care selecteaza randuri (SELECT) si returneaza un set de rezultate cu randuri si coloane se transmit cu metoda query(). In caz de eroare da FALSE. $res = $dbh->query("Interogare SQL");Pentru a lucra cu baze de date in PHP trebuie cunoscute interogarile specifice SQL, precum: CREATE TABLE, INSERT, SELECT, etc. Cu PDO, PHP transmite aceste comenzi sub forma de sir la MySQL, daca nu le cunoasteti, sunt prezentate in lectiile despre baze de date SQL, incepand cu Baze de date SQL.

1. Creare tabel MySQL Crearea unui tabel MySQL folosind PDO se face prin metoda "exec()" si instructiunea specifica SQL, "CREATE TABLE ...", sintaxa fiind: $obiectPDO->exec("CREATE TABLE `nume_tabel` (`coloana1` TIP, `coloana2` TIP, ...)"); Toate aceste instructiuni se adauga dupa cea de creare a obiectului PDO si conectare la MySQL.

In exemplu urmator se creaza in baza de date "teste" un tabel denumit "sites", cu 4 coloane: "id", "nume", "categorie" si "adresa".