FOL9000

Die f9-Datenbank-Klasse

von

Nachdem es in den ersten Artikeln zu meinem Micro-Framework f9 um den RequestDispatcher und die View-Klassen ging, soll es nun mit einigen Beiträgen zu Klassen weitergehen, die ich — mit minimalen Anpassungen — schlicht aus anderen Frameworks übernommen habe. Den Anfang macht die Datenbank-Klasse — übernommen aus dem epiphany-Framework.

Weil die Datenbank-Klasse von Epiphany übernommen wurde, noch einmal der ausdrückliche Dank an die Autoren Jaisen Mathai und Kevin Hornschemeier für die großartige Grundlage!

Die Datenbank-Klasse des f9-Frameworks hat einen einfachen Sinn: Die Queries gegenüber dem normalen Vorgehen zu vereinfachen. Schön wäre dabei, wenn die Klasse nicht nur die Arbeit verringern würde, sondern auch semantisch eindeutiger und aussagekräftiger würde. Wenn also Code nicht nur eingespart würde, sondern der verbleibende Code auch die Funktion im Programm klarer spiegeln würde (als es z.B. mit reinem PDO-Code möglich wäre).

Das Datenbank-Modul des epiphany-Frameworks leistet dies perfekt, weshalb ich es fast ohne Änderungen übernommen habe. Die wenigen Änderungen beziehen sich fast ausschließlich auf eher nicht-funktionale Kleinigkeiten wie Formatierung, Namespace etc. Da der Code auch nicht sonderlich umfangreich ist, wird es auch nicht verwundern, wenn sich das Folgende recht stark an der Original-Dokumentation orientiert.

Namespace

Als Teil des f9-Frameworks liegt die Datenbank-Klasse im net\f9-Namespace. Will man sie benutzen, ist die entsprechende Klasse also zunächst per use einzubinden:

use net\f9\Database;

Datenbank-Instanz

Die f9-Datenbank-Klasse ist ein Singleton; eine Instanz der Datenbank erhält man deswegen nach folgendem Muster:

use net\f9\Database;

Database::getInstance(
  'mysql',          // Typ/DSN
  'my_db',          // Datenbank-Name
  'my_host',        // Host-Name
  'my_user',        // User-Name
  'my_pwd',         // Passwort
  'charset=utf-8'); // Optionen

(Wobei die Parameter natürlich alle nur Beispiele sind.) Wer schon einmal mit PDO gearbeitet hat, wird die Parameter sofort wiedererkennen und keine weitere Erklärung benötigen. Letztlich kapselt der f9-Aufruf auch nur einen new PDO(...)-Aufruf, sodass klar ist, dass und warum die Parameter identisch sind (und dass man bei Unklarheiten in der PDO-Doku nachschlagen kann).

Mit der Datenbank-Instanz kann nun begonnen werden, die Datenbank abzufragen bzw. Daten zu ändern.

Abfragen und Daten-Manipulation

Grundsätzlich gibt es drei Methoden zur Datenbank-Abfrage und -Manipulation:

  • one(),
  • all() und
  • execute()

one() wird benutzt, um ein einzelnes Ergebnis abzufragen (SELECT), z.B. einen User, einen Artikel etc. one() sollte benutzt werden, wenn die Datenbank mit Hilfe eines eindeutigen Kriteriums bzw. des Schlüssels abgefragt wird.

all() sollte hingegeben benutzt werden, wenn eine Menge von Ergebnissen erwartet wird.

Schließlich können mit execute() INSERTs, UPDATEs etc. abgesetzt werden.

Da die f9-Datenbank-Klasse intern PDO nutzt, können (besser: sollten) Prepared Statements eingesetzt werden.

Diese drei zentralen Methoden sind sich also sehr ähnlich und so dürfte es nicht verwundern, wenn sie auch alle die gleichen Argumente erwarten. Der erste Argument ist immer das SQL-Statement (string) während das zweite (optionale) Argument ggf. die Parameter für das Prepared Statement als assoziatives Array enthält.

IDs und Schlüssel

Neben den drei Query-Methoden gibt es noch eine vierte wichtige Methode. Wenn durch ein SQL-INSERT-Statement ein neuer Datensatz erzeugt wurde, liefert lastInsertId() den Schlüssel dieses neuen Datensatzes.

Beispiel

Das folgende Beispiel zeigt die simple Nutzung der Klasse:

$db = Database::getInstance(
  'mysql',          // Typ/DSN
  'my_db',          // Datenbank-Name
  'my_host',        // Host-Name
  'my_user',        // User-Name
  'my_pwd',         // Passwort
  'charset=utf-8'); // Optionen

$db->one("SELECT name FROM users WHERE id=:id", 
         array(':id' => '123'));

$db->all("SELECT name FROM users WHERE age > 23");

$db->execute("INSERT INTO users (name, age) VALUES ('heinz', 45)");
$heinzID = $db->lastInsertId();
  

Download

Ein eigenes Beispiel zum Downloaden dürfte wohl nicht nötig sein. Deshalb nur die Datenbank-Klasse:
[download id=“5″]

Das komplette f9-Framework mit allen Klassen und Beispielen:
[download id=“12″]

Schluss

Ich hätt ja gern noch etwas mehr geschrieben, aber mehr gibt’s nicht zu sagen. Die Klasse ist simpel, ihre Methode sind übersichtlich und in meinen eigenen Projekten waren sie bisher noch immer ausreichend; also eigentlich genau das, was man von einer micro-Framework-Klasse erwartet.

Kommentare sind geschlossen.