DOMTable
Gepost in /PHP ontwikkeling/Software op 03 Juli 2012Deze blog is geschreven door Christiaan Schaake
Introductie
De PHP DOM extentie maakt het mogelijk om XML via de DOM API te manipuleren. De classe DOMDocument representeerd een DOM XML. De classe DOMDocument heeft verschillende methoden om XML's in te lezen en weg te schrijven. Via de DOMTable extentie wordt het mogelijk om XML's rechtstreeks uit database tabellen te construeren en weg te schrijven.
DOMTable is een exentie op DOMDocument en bevat een 3-tal nieuwe methoden. De methoden selectXML, updateXML en deleteRecord. Met selectXML kan een table opgevraagd worden met een SQL query. Met updateXML kan de XML weer terug geschreven worden naar de database. De methode deleteRecord verwijderd een specifiek record uit de database.
Classe beschijving
De classe is DOMTable welke de classe DOMNode extend.
DOMTable extends DOMNode {
/* Methods */
__construct ( mysqli $mysqli [, string $version [, string $encoding ]] )
bool selectXML ( string $query [, bool $lock [, string $table]] )
bool updateXML ( void )
int deleteRecord ( DOMElement $record [,bool $safe] )
}
De constructor heeft minimaal een mysqli object nodig met een werkende connectie naar de database. De database connectie wordt door de classe en haar methoden zo gezet dat autocommit uit staat.
selectXML
De methode selectXML haalt middels een aangeboden SQL query data op uit een tabel. De methode ondersteund geen hierarchische data. De methode bevat een controle op de aangeboden query. Het resultaat van de query wordt als een eenvoudige XML structuur in de classe ingelezen. De classe kan met DOM methoden worden uitgelezen en/of bewerkt.
Het resultaat van de query wordt weergegeven in de volgende tabel structuur:
<rows><row>
<field1 primaryKey="primaryKey">1</field1>
<field2>data</field2>
</row>
<row>
<field1 primaryKey="primaryKey">2</field1>
<field2>data</field2>
</row>
</rows>
De root element van de XML krijgt de naam van de tabel met de toevoeging 's'. De root bevat 0 of meer elementen welke de naam van de tabel krijgen. De naam van de tabel wordt automatisch door de methode achterhaald. Indien de methode de naam van de tabel niet kan bepalen wordt de default 'row' gebruikt. De naam van de tabel is op 2 manieren te beïnvloeden:
- Via de query, bv. SELECT * FROM table AS newName
- Via de optionele 3e optie $table
De methodes updateXML en deleteRecord verwachten wel de werkelijke tabel naam.
Het resultaat van de query wordt automatisch vertaald naar XML waarden. Date en tijd wordt in het formaat date, time en datetime weggeschreven in de XML. Alle text data wordt voorzien van HTML escape codes.
updateXML
De methode updateXML schrijft alle records in het DOMTable object weg naar de database. Hiebij worden bestaande records overschreden en nieuwe records toegevoegd. De XML binnen het object DOMTable moet de structuur hebben als aangegeven in het voorgaande hoofdstuk. De naam van het child element van het root element moet de naam hebben van een bestaande tabel in de database. Alleen opgeven velden worden gewijzigd. Velden die niet aanwezig zijn in de XML worden niet gewijzigd. Tip: voor het wissen van kan het element leeg worden meegegeven.
Data in de XML wordt automatisch vertaald naar database veilige data. Bij data en tijd velden wordt de XML date, time of datetime vertaald naar dateTime. HTML escape characters worden verwijderd en opnieuw voorzien van MySQL escape characters.
Indien bij het ophalen van de data uit de database via de methode selectXML de optionele parameter $lock op true is gezet, heeft deze methode een copie van het resultaat bewaard. De methode updateXML controleer dan voor elke update of de huidige gegevens in het bewuste record ongewijzigd zijn. Dit is een implementatie van het Optimistic Locking pattern.
Indien het updaten of inserten van de XML niet lukt wordt de gehele actie teruggedraaid middels een rollback. Een rollback wordt ook uitgevoerd indien Optmistic Locking een tussentijds gewijzgd record signaleerd.
deleteRecord
De methode deleteRecord maakt het mogelijk om één specifiek record te verwijderen uit de database. De methode verwacht als input een XML record (child van het root element) als DOMElement behorende bij het aangeroepte object. Standaard selecteerd de methode alle records op basis van de primary key. Het is mogelijk dat er meerdere waarden gevonden worden of dat de data tussentijds is gewijzigd. Indien de optionele parameter $safe op true gezet wordt, selecteerd de methode alleen de records die volledig voldoen aan de data in het XML record.
De methode geeft het aantal records terug welke verwijderd zijn uit de database.