Datenbankzugriff mit ezSQL

Aus THM-Wiki
Wechseln zu: Navigation, Suche

Die Klasse ezSQL von Justin Vincent ermöglicht den einfachen Zugriff auf Ergebnismengen von Datenbankabfragen. In eStudy verwenden wir die Version 1.26 mit ein paar kleinen Anpassungen. Die vollständige Dokumentation finden Sie in der Datei ez_sql_1.26.zip im Verzeichnis doku im CVS.

Das Objekt dieser Klasse heißt $db und wird bereits in der Datei common/init.inc.php angelegt. Sie müssen es in jeder Methode mit

global $db;

verfügbar machen.

Denken Sie bitte an die Anwendung der Methode toMysql() aus der Data-Klasse, wie unter Klassen zur allgemeinen Verwendung beschrieben.

Anfragen und Ergebnismengen

Es stehen je nach Anwendungszweck mehrere Methoden der Klasse zur Verfügung, denen jeweils der SQL-String übergeben wird:

  • $db->get_results(): Die Methode eignet sich am besten für Anfragen, die mehrere Spalten und Zeilen zurückgeben.
  • $db->get_row(): Diese Methode ist für Anfragen geeignet, die nur eine Zeile mit mehreren Spalten zurückgibt.
  • $db->get_col(): Hier wird nur eine Spalte mit mehreren Zeilen zurückgegeben.
  • $db->get_var(): Wenn nur ein Wert aus einer Zeile und Spalte benötigt wird, ist diese Methode am sinnvollsten.
  • $db->query(): Für alle Abfragen, die keine Werte zurückliefern (INSERT, UPDATE, DELETE, ...) sollte diese Methode verwendet werden.

Den Methoden get_results() und get_row() kann als zweiter Parameter eine Konstante mitgegeben werden, die bestimmt, welche Form das Ergebnis-Array hat:

  • OBJECT: Das Ergebnis-Array enthält Standard-Objekte, dessen Attribute die Tabellen-Spalten darstellen. Das ist der Standardwert und braucht nicht angegeben zu werden.
  • ARRAY_A: Das Ergebnis-Array enthält für jeden Datensatz ein assoziatives Array, dessen Schlüssel aus den Namen der Tabellen-Spalten bestehen.
  • ARRAY_N: Das Ergebnis-Array enthält für jeden Datensatz ein Array mit numerischen Schlüsseln.

Weitere Informationen zur letzten Abfrage

Je nach Art der letzten Abfrage stehen dazu weitere Informationen zur Verfügung:

  • $db->num_rows: Anzahl der zurückgelieferten Zeilen.
  • $db->insert_id: Wurde in der letzten INSERT- oder REPLACE-Abfrage ein auto_increment-Wert eingefügt, ist der Wert in dieser Variablen verfügbar.
  • $db->rows_affected: Anzahl der veränderten Zeilen bei verändernden Abfragen (INSERT, UPDATE, DELETE, REPLACE).

Fehlerbehandlung

Das $db-Objekt existiert über die gesamte Laufzeit des Scriptes hinweg. Während dieser Zeit werden alle vom Datenbankserver gemeldeten Fehler im Array $EZSQL_ERROR gespeichert. Wenn Sie feststellen wollen, ob eine Datenbankoperation erfolgreich war, genügt es also nicht, abzufragen, ob das Array leer ist. Es könnte darin auch ein Fehler stehen, der bereits vorher aufgetreten ist.

Die Prozedur ist also etwas umständlicher. Zunächst müssen Sie das Array in Ihrer Methode verfügbar machen:

global $db, $EZSQL_ERROR;

Speichern Sie dann kurz vor Ihrer Abfrage die Anzahl der Fehler in einer Variablen:

$errorCount = count($EZSQL_ERROR);

Nach der Ausführung Ihrer Abfrage überprüfen Sie nun, ob ein weiterer Fehler hinzugekommen ist:

if (count($EZSQL_ERROR) > $errorCount) {
    // Fehler...
} else {
    // Alles OK, weitermachen...
}

Während der Entwicklungszeit werden alle SQL-Fehler im Browser angezeigt. Sie sollten die Ursachen für diese Fehler stets beseitigen und nicht darauf vertrauen, dass sie in Produktionsumgebungen abgeschaltet sind oder sie gar selbst in Ihren Modulen abschalten.

Alle fehlerverursachenden Abfragen werden außerdem in Log-Dateien gespeichert. Sie finden diese im Verzeichnis logs.

Alternativen

Im Modul Lernquiz wird die PEAR-Bibliothek DB_DataObjects verwendet, welche sich komfortabler verwenden lässt und bei der Fehlerabfrage keine Race-Conditions provoziert.