Drupal 7 – Werken met databases via PHP PDO
Met de overgang naar Drupal 7 stappen we over op de nieuwe Drupal Database Abstraction Layer API, die is gebaseerd op PDO. PDO wordt al lange tijd gebruikt in het Zend Framework en in vele andere PHP-frameworks. Alles werkte prima in Drupal 6 met gewone SQL-query’s — dus waarom hebben we iets nieuws nodig?
Laten we eerst begrijpen wat PDO precies is.
Werken met de database in Drupal 7 – Les 1 – Drupal Database API
Als je eerder modules hebt geschreven voor Drupal 6, zal het voor jou niet moeilijk zijn om over te stappen naar de nieuwe Database API van Drupal 7. De nieuwe DB API werkt op basis van de PHP-extensie PDO, waardoor het met verschillende databases kan werken, zoals MySQL, PostgreSQL, MSSQL en mogelijk Oracle. Wat eenvoud betreft, is het even wennen aan de nieuwe syntaxis — het schrijven van ruwe SQL-query’s blijft voor velen vertrouwd.
Hier is een stukje uit de officiële documentatie:
Werken met de database in Drupal 7 – les 2 – Databaseconfiguratie
Het belangrijkste mechanisme om een databaseverbinding te definiëren in Drupal is de array $databases in het bestand settings.php. Zoals de naam al aangeeft, kun je via $databases meerdere databaseverbindingen configureren. Het ondersteunt ook het definiëren van meerdere targets (doelen). Een verbinding wordt pas geopend (de verbinding wordt pas werkelijk aangemaakt) wanneer een stuk code voor het eerst een query naar de database uitvoert.
Werken met de database in Drupal 7 – les 3 – Statistische query’s (SELECT)
De meest gebruikte vorm van een query in Drupal is de statische query. Een statische query wordt letterlijk doorgestuurd naar de database. Alleen een SELECT-query kan statisch zijn.
Gebruik statische query’s uitsluitend voor zeer eenvoudige bewerkingen. Wanneer je complexe, dynamisch opgebouwde of later aan te passen query’s moet schrijven, gebruik dan dynamische query’s.
Een eenvoudige manier om een statische query uit te voeren is via de querymethode:
Werken met de database in Drupal 7 – les 4 – Dynamische query’s (SELECT)
We zijn nu aangekomen bij het meest interessante deel van de Database API van Drupal: dynamische query’s. Ze worden “dynamisch” genoemd omdat Drupal de querystring automatisch uitbreidt tijdens de uitvoering. Alle query’s voor invoegen (INSERT), bijwerken (UPDATE), verwijderen (DELETE) of samenvoegen (MERGE) kunnen dynamisch zijn. Ook SELECT-query’s kunnen dynamisch of statisch zijn, maar het is aan te raden om ook voor SELECT-query’s dynamische query’s te gebruiken.
Werken met de database in Drupal 7 – les 5 – Extenders (uitbreidingen)
Select-query’s in Drupal ondersteunen zogenaamde extenders (uitbreidingen). Een extender maakt het mogelijk om extra functionaliteit toe te voegen aan een query tijdens de uitvoering. Deze functionaliteit kan bestaan uit aanvullende methoden of wijzigingen in het gedrag van bestaande methoden.
Werken met de database in Drupal 7 – les 6 – Een query dynamisch wijzigen (hook_query_alter)
Een belangrijk kenmerk van dynamische SELECT-query’s is dat andere modules deze query’s “on the fly” kunnen wijzigen. Dit maakt het mogelijk voor andere modules om hun eigen instructies aan een query toe te voegen, waardoor ze het gedrag van de query kunnen beïnvloeden of bijvoorbeeld toegangsbeperkingen op nodes kunnen toepassen. Er zijn drie componenten voor het dynamisch wijzigen van query’s: tagging, meta data en hook_query_alter().
Werken met de database in Drupal 7 – les 7 – Het verwerken van queryresultaten (fetch)
Een SELECT-query retourneert altijd een resultaat met nul of meer records. Er zijn verschillende manieren om de resultaten van een query te verwerken, afhankelijk van wat je ermee wilt doen.
De meest gebruikelijke manier is door middel van een foreach()-lus:
Werken met de database in Drupal 7 – les 8 – Insertquery’s (INSERT INTO)
Insertquery’s moeten altijd gebruikmaken van de querybuilder. Sommige databases vereisen speciale handlers voor LOB’s (Large Objects, zoals TEXT in MySQL) en BLOB’s (Binary Large Objects). Daarom is een abstractielaag noodzakelijk, zodat de specifieke database-driver deze correct kan afhandelen.
Insertquery’s beginnen met de functie db_insert():
Werken met de database in Drupal 7 – les 9 – Updatequery’s (UPDATE)
Updatequery’s moeten altijd gebruikmaken van de querybuilder. Verschillende databases hebben specifieke handlers voor LOB’s (Large Objects, zoals TEXT in MySQL) en BLOB’s (Binary Large Objects), waardoor een abstractielaag nodig is om per driver deze specifieke bewerkingen correct te verwerken.
Updatequery’s beginnen met de functie db_update():