Die Apache Zeta Components Kolumne

Apache Zeta Components: Mit Database PHP-Schwachstellen ausbügeln
Kommentare

Diese Kolumne möchte ich einer Komponente widmen, die eigentlich recht unauffällig ist, aber in den meisten Projekten der Zeta Components verwendet wird: Database [1]. Als schlanke Erweiterung von PDO [2] bügelt diese Klassensammlung einige Schwachstellen der PHP-eigenen Datenbankabstraktion aus und bietet eine ausgeklügelte SQL-Abstraktion. Sie ermöglicht es Ihnen, Ihre Anwendung völlig unabhängig von der verwendeten SQL-Datenbank zu halten.

Um Database verwenden zu können, benötigen Sie natürlich zunächst das entsprechende Paket sowie die Base-Komponente. Sind Installation und Einbindung wie auf der Zeta-Website beschrieben [3] erfolgt, erzeugen Sie mithilfe der ezcDbFactory-Klasse eine neue Instanz von ezcDbHandler, passend für die aktuell verwendete Datenbank.

Listing 1
$db = ezcDbFactory::create( 'sqlite://' . __DIR__ . '/db.sqlite' );
function quoteColumn( ezcDbHandler $db, $column, $table ) 
{
    return $db->quoteIdentifier( $table ) . '.'
        . $db->quoteIdentifier( $column );
}
$select = $db->createSelectQuery();
$select->select( quoteColumn(
    $db, 'title', 'entries' ), quoteColumn( $db, 'name', 'authors' )
)->from(
    $db->quoteIdentifier( 'entries' )
)->leftJoin(
    $db->quoteIdentifier( 'authors' ),
    $select->expr->eq(
        quoteColumn( $db, 'author_id', 'entries' ),
        quoteColumn( $db, 'id', 'authors' )
    )
);
$statement = $select->prepare();
$statement->execute();
var_dump( $statement->fetchAll( PDO::FETCH_ASSOC ) );

Im Codebeispiel wird in der ersten Zeile ein Datenbank-Handler für eine SQLite-Datenbank erzeugt. Ersetzen Sie $db einfach durch einen Handler für eine andere Datenbank, wie MySQL oder Oracle, um Ihre Anwendung anzupassen. Als Nächstes wird im Beispiel eine kleine Hilfsfunktion definiert, die den weiteren Quellcode lesbarer macht: quoteColumn()versieht eine Kombination aus Spalten- und Tabellenname mit für die Datenbank passenden Escape-Zeichen.

Nun wird ein Objekt für eine SELECT-Anfrage erzeugt. Auf diesem Objekt arbeiten Sie mit einem so genannten „Fließenden Interface“ und schreiben SQL-Code mit PHP-Methodenaufrufen. Die SQL-Abstraktion übernimmt die Aufgabe, den passenden SQL-Code für die verwendete Datenbank zu erzeugen und emuliert gegebenenfalls fehlende Features. Ein Beispiel ist das bei MySQL und SQLite beliebte LIMIT für Oracle-Datenbanken.

Die Methodenaufrufe auf dem SELECT-Query-Objekt sind relativ selbsterklärend: Mit select()werden die zu selektierenden Spalten angegeben, die from()-Methode erzeugt den FROM-Teil der Anfrage. Auch Joins über mehrere Tabellen sind kein Problem, in diesem Fall ein LEFT JOIN. Der passende Methodenaufruf erwartet den Namen der zu verbindenden Tabelle und die JOIN-Bedingung. Jedes Query-Objekt stellt ein Attribut $expr bereit. Die darauf verfügbaren Methoden erlauben es Ihnen, verschiedenste Bestandteile von Ausdrücken zu erzeugen – im Beispiel wird die Methode eq()verwendet, um eine Gleichheitsbedingung zu erhalten. Zu jedem geladenen Eintrag wird hier also der Name des Autors angefragt.

Nach Modellierung der SQL-Anfrage wird auf dem SELECT-Objekt die Methode prepare()aufgerufen. Die Rückgabe ist ein Standard-PDO_Statement-Objekt, mit dem Sie nun die Anfrage an die Datenbank senden und die Resultate erhalten können.

ezcDatabase kann nicht nur SELECT- sondern auch INSERT-, UPDATE- und DELETE-Queries modellieren und unterstützt dabei verschiedenste praktische Features, wie das Binden von Werten und Parametern in Anfragen, verschachtelte Transaktionen und mehr. Sind Sie nicht sicher, welche Datenbank letztendlich beim Kunden zum Einsatz kommt, oder entwickeln Sie ein Produkt, welches mit verschiedensten Datenbanksystemen arbeiten können muss? Dann lohnt sich ein Blick in die Database-Komponente!

Tobias Schlitt ist Diplominformatiker (Uni) und arbeitet seit mehr als 10 Jahren in professionellen Webprojekten auf Basis von PHP. Als Open-Source-Enthusiast beteiligt er sich an verschiedensten Communityprojekten. Tobias ist Mitgründer der Qafoo GmbH (http://qafoo.com), die Teams dabei unterstützt, hochqualitative PHP-Anwendungen zu entwickeln. Hierzu zählt u. a. Consulting und Training zur Automatisierung, Continuous Intgration und Deployment, aber auch professionelle Leistungen rund um Zeta.
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -