Skip navigation.

ADOdb Tutorial (Deutsch)

Anmerkung zur deutschen Übersetzung: Diese Übersetzung basiert auf dem englischen
Original-Tutorial. An einigen Stellen haben wir sehr "freizügig" übersetzt - wir
hoffen das alles soweit verständlich ist und bitten kleinere Fehler zu entschuldigen
und verweisen auf das englischsprachige Original falls damit jemand Probleme haben
sollte ;-)

You say eether and I say eyether, You say neether and I say nyther; Eether, eyether, neether, nyther - Let's call the whole thing off !

You like potato and I like po-tah-to, You like tomato and I like to-mah-to; Potato, po-tah-to, tomato, to-mah-to - Let's call the whole thing off !

Ich liebe diesen Song, insbesondere die Version wo Louis Armstrong und Ella im Duet singen. Es geht darum, wie hart es für zwei sich liebende ist miteinander auszukommen. Es geht um Kompromisse und darum eine gemeinsame Basis zu finden, und das ist auch etwas worum es in diesem Artikel geht.

Mit PHP können dynamische Webseiten ohne viel Aufwand und mit "Fun" erstellt werden. Um Webseiten zu erstellen benötigen wir Datenbanken um Login Informationen, dynamische News und Beiträge von Diskussionsforen zu speichern. Beispielsweise verwenden wir MySQL für diese Aufgaben. Aber Ihre Firma ist dabei ja vielleicht so erfolgreich, das die Website erfolreicher ist als jemals jemand gedacht hätte. Sie stellen nun fest, das MySQL die Last nicht weiter ab kann und nicht weiter skalierungsfähig ist; Zeit also die Datenbank zu wechseln.

Bedauerlicherweise werden in PHP alle Datenbanken unterschiedlich angesprochen. Um zu MySQL eine Verbindung aufzubauen wird normal mysql_connect() verwendet; wenn Sie sich entscheiden auf Oracle oder Microsoft SQL Server umzusteigen, wird ocilogon() beziehungsweise mssql_connect() benötigt. Schlimm dabei ist, das auch die Parameter dieser Funktionen unterschiedlich sind. Die eine Datenbank spricht "po-tato", die andere "pota-to". Oh-oh.

Eine Datenbank-Übersetzung-Bibliothek wie ADODB kommt gelegen wenn Sie Portablität benötigen. Sie stellt eine einheitliche und einfache Schnittstelle (API) zur Verfügung um mit allen unterstützten Datenbanken auf gleiche Art und Weise zu kommunizieren.

ADODB steht für "Active Data Objects DataBase" (sorry, computer-menschen sind manchmal nicht sehr originel). ADODB unterstützt aktuell MySQL, PostgreSQL, Oracle, Interbase, Microsoft SQL Server, Access, FoxPro, Sybase, ODBC und ADO. Sie können die ADODB von http://adodb.sourceforge.net/ herunterladen.

MySQL Beispiel

Die am meist mit PHP eingesetzte Datenbank ist MySQL, so nehmen wir an das Sie mit folgendem Code vertraut sind. Er verbindet sich zu einer MySQL-Datenbank namens mydb am Server localhost und führt eine SQL-Anweisung aus. Das Ergebnis wird in einer Zeile pro Datensatz ausgegeben.

$db = mysql_connect("localhost", "root", "password"); mysql_select_db("mydb",$db); $result = mysql_query("SELECT * FROM mitarbeiter",$db); if ($result === false) die("failed"); while ($fields = mysql_fetch_row($result)) { for ($i=0, $max=sizeof($fields); $i < $max; $i++) { print $fields[$i].' '; } print "<br>n"; }

Der obrige Code wurde nach Sektion gefärbt. Der erste Abschnitt ist die Verbindungsphase, die zweite führt die SQL-Anweisung aus und die letzte gibt die Felder aus. Die while-Schleife behandelt die Datensätze (Zeilen) des Ergebnisses, während die for-Schleife die Felder eines Datensatzes (einer Zeile).

Hier ist der äquivalent Code in ADODB:

include("adodb.inc.php"); $db = NewADOConnection('mysql'); $db->Connect("localhost", "root", "password", "mydb"); $result = $db->Execute("SELECT * FROM mitarbeiter"); if ($result === false) die("failed"); while (!$result->EOF) { for ($i=0, $max=$result->FieldCount(); $i < $max; $i++) print $result->fields[$i].' '; $result->MoveNext(); print "<br>n"; }

Um das ganze nun nach Oracle zu portieren, braucht lediglich in der zweiten Zeile der Funktionsaufruf nach NewADOConnection('oracle') geändert werden. Sehen wir uns nun den Code genauer an.

Verbindungsaufbau zur Datenbank

include("adodb.inc.php"); $db = NewADOConnection('mysql'); $db->Connect("localhost", "root", "password", "mydb");

Der Verbindungsaufbau-Code ist ein bischen komplizierter als der MySQL-Code, da aber auch unsere Anforderungen höher sind. In ADODB verwenden wir einen objektorienten Ansatz um die Komplexität mehrerer Datenbanken zu verwalten. Wir haben unterschiedliche Klassen um unterschiedliche Datenbanken zu verwalten. Wenn Sie nicht mit der objektorientierten Programmierung vertraut sind, keine Angst - die Komplexität ist komplett versteckt in der Funktion NewADOConnection().

Um Speicher zu sparen, laden wir nur den PHP code der für die Datenbank benötigt wird zu der wir Verbindung aufnehmen möchten. Dies tun wir durch den Aufruf der Funktion NewADOConnection(Datenbanktreiber). Datenbanktreiber-Namen sind mysql, mssql, oracle, oci8, postgres, sybase, vfp, access, ibase und einige andere.

Anschließend erzeugen wir eine neue Instanz der Verbindungsklasse durch den Aufruf der Funktion NewADOConnection(). Abschließend verbinden wir uns zu der Datenbank durch $db->Connect().

Ausführung der SQL-Anweisung

$ergebnis = $db->Execute("SELECT * FROM employees"); if ($ergebnis === false) die("failed");

Die SQL-Anweisung zum Server zu schicken ist sehr einfach. Execute() gibt bei erfolgreicher Ausführung ein Datensatz-Objekt zurück. Sie sollten $ergebnis prüfen wie wir es getan haben.

Ein Umstand der unter Anfängern für Verwirrung sorgt ist die Tatsache das wir zwei Typen von Objekten in der ADODB haben: das Verbindungs-Objekt und das Datensatz-Objekt. Wann brauchen wir diese jeweils?

Das Verbindungs-Objekt ($db) ist verantwortlich für die Verbindung zur Datenbank, für die Formatierung Ihrer SQL-Anweisung und zur Abfrage des Datenbankservers. Das Datensatz-Objekt ($ergebnis) ist Verantwortlich zur Abholung der Daten sowie zur Vormatierung des Ergebnisses als Text oder als Array.

Die einzige Sache, die ich hinzufügen mußte, ist das ADODB verschiedene Hilfsfunktionen anbietet um INSERT und UPDATE Anweisungen einfacher zu machen, auf welche wir in der erweiteren Sektion eingehen werden.

Abfrage der Daten

while (!$ergebnis->EOF) { for ($i=0, $max=$ergebnis->FieldCount(); $i < $max; $i++) print $ergebnis->fields[$i].' '; $ergebnis->MoveNext(); print "<br>n"; }

Das Musterbeispiel um Daten abzuholen ist es dies wie beim lesen aus einer Datei zu tun. Für jede Zeile prüfen wir zunächst ob wir das Ende der Datei (End-of File, EOF) erreicht haben. Solange wir das Dateiende noch nicht erreicht haben, behandelt die innere Schleife für jeden Datensatz Feld für Feld. Anschließend wird der nächste Datensatz (Zeile) mit MoveNext ausgewählt.

Das Array $result->fields[] wird durch die PHP Datenbank-Erweiterung bereitgestellt. Einge Datenbank-Erweiterungen indizieren das Array allerdings nicht nach Feldnamen. Um eine Indizierung nach Feldnamen zu erzwingen, das sind inhaltsorientierte Arrays - benutzen Sie bitte die globale Variable $ADODB_FETCH_MODE.

$ADODB_FETCH_MODE = ADODB_FETCH_NUM; $rs1 = $db->Execute('select * from table'); $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; $rs2 = $db->Execute('select * from table'); print_r($rs1->fields); # shows array([0]=>'v0',[1] =>'v1') print_r($rs2->fields); # shows array(['col1']=>'v0',['col2'] =>'v1')

Wie Sie in diesem Beispiel sehen können, benutzen beide Datensätze unterschiedliche Abhohlmoduse basierend durch die Einstellung $ADODB_FETCH_MODE wenn der Datensatz durch die Execute-Funktion "erzeugt" wird.

ADOConnection

Objekt, das die Verbindung zur Datenbank abbildet, SQL-Anweisungen ausführt und etliche nützliche Funktionen zur Standarisierung von SQL-Anweisungen wie Verknüpfungen, Datumsformatierungen usw. enthält.

Andere nützliche Funktionen

$recordset->Move($pos) bewegt den internen Zeiger zum angegebenen Datensatz. ADODB unterstützt die Vorwärtsbewegung für alle Datenbanken. Einige Datenbanken unterstützen allerdings keine Rückwärtsbewegung. Dies ist normal kein Problem da sie immer Datensätze cachen können um Rückwärtsbeweungen zu simulieren.

$recordset->RecordCount() gibt die Anzahl an Datensätze, welche die SQL-Anweisung zurückgegeben hat, zurück. Einige Datenbanken werden -1 zurückgeben da diese die Funktion nicht unterstützen.

$recordset->GetArray() gibt das Ergebnis als Array zurück.

rs2html($recordset) ist eine Funktion welche eine HTML-Tabelle basierend auf dem Parameter $recordset generiert. Ein Beispiel mit den relevanten Zeilen in Fettschrift:

include('adodb.inc.php'); include('tohtml.inc.php'); /* includes the rs2html function */ $conn = &ADONewConnection('mysql'); $conn->PConnect('localhost','userid','password','database'); $rs = $conn->Execute('select * from table'); rs2html($rs); /* recordset to html table */

Da sind viele weitere Hilfsfunktion welche in der Dokumentation ausführlich beschrieben sind: http://phplens.com/adodb/.

Erweitertes Material

Insers und Updates

Gehen wir davon aus Sie möchten die folgenden Daten in eine Datenbank ablegen.

ID = 3 TheDate=mktime(0,0,0,8,31,2001) /* 31st August 2001 */ Note= sugar why don't we call it off

Wenn Sie zu einer anderen Datenbank wechsel, wird Ihr "insert" nicht länger funktionieren.

Das erste Problem ist, das jede Datenbank unterschiedliche standards beim Datumsformat hat. MySQL erwartet das YYYY-MM-DD Format, während andere Datenbanken andere Standards haben. ADODB hat eine Funktion namens DBDate() die entsprechende Konvertierungen von einem Datum ins richtige Format vornimmt.

Das nächste Problem ist das "don't" in dem Text, welches speziell kodiert werden muß. In MySQL können wir "don't" benutzen, in einigen anderen Datenbanken (Sybase, Access, Microsoft SQL Server u.a.) muß "don''t" benutzt werden. Die Funktion qstr() erledigt dieses Dilema.

Wie werden diese Funktionen verwendet? So wie hier:

$sql = "INSERT INTO table (id, thedate,note) values (" . $ID . ',' . $db->DBDate($TheDate) .',' . $db->qstr($Note).")"; $db->Execute($sql);

ADODB unterstützt auch $connection->Affected_Rows() (gibt die Anzahl von Datensätzen zurück welche vom letztten "update" oder "delete" betroffen wurden) und $recordset->Insert_ID() (gibt die letzte "autoincrement" Zahl welche bei einer "insert"-Anweisung erzeugt wurde zurück). Aber seien Sie gewarnt, das nicht alle Datenbanken diese beiden Funktionen unterstützen.

MetaTypen Sie können mehr Informationen über jedes der angeforderten Felder herausfinden (Ich benutze die Wörter "fields" und "columns" abwechselnd) durch den Aufruf der Datensatzobjekt-Funktion FetchField($fieldoffset). Diese gibt ein Objekt mit drei Eigenschaften zurück: name, type und max_length.

Zum Beispiel: $recordset = $conn->Execute("select adate from table");$f0 = $recordset->FetchField(0);

Dann wird $f0->name den Wert 'adata' enthalten, $f0->type wird 'date' enthalten. Wenn die maximale Länge max_length unbekannt oder nicht ermittelbar ist, wird diese auf -1 gesetzt.

Ein Problem in der Handhabung verschiedener Datenbanken ist das Datenbanken für die selben Typen unterschiedliche Namen vergibt. Zum Beispiel: ein Zeitstempel-Typ wird in einer Datenbank als "datetime" und in einer anderen Datenbank als "time" bezeichnet. Aus diesem Grund hat ADODB eine spezielle Funktion MetaType($type, $max_length) welche die Typen folgendermaßen standarisiert:

C: Zeichen und String-Typen (character and varchar types) X: Texte oder lange Stringes (beispielsweise mit mehr als 255 Bytes Größe) B: Binäre Daten, "blob" D: Datum T: Zeitstempel L: boolsches Flag I: Integerzahl N: numerische Zahl (float, double, money)

In dem obrigen Datums-Beispiel:

$recordset = $conn->Execute("select adate from table"); $f0 = $recordset->FetchField(0); $type = $recordset->MetaType($f0->type, $f0->max_length); print $type; /* sollte 'D' ausgeben*/

"Select Limit" und "Top"-Support

ADODB hat eine Funktion $connection->SelectLimit($sql,$nrows,$offset) welche es erlaubt nur einen bestimmten Bereich aus den Datensätzen anzufordern. Dies entspricht der properären "SELECT TOP" bei Microsoft Produkten und "SELECT...LIMIT" bei PostgreSQL und mySQL und wird bei Datenbanken welche dies nicht unterstützen simmuliert.

Caching-Unterstützung

ADODB erlaubt die Zwischenspeicherung (Caching) von Datensätzen in Ihrem Dateisystem und fordert Daten beim SQL-Server erst nach Ablauf einer definierten Zeitspanne erneut an: $connection->CacheExecute($secs2cache,$sql) und $connection->CacheSelectLimit($secs2cache,$sql,$nrows,$offset).

PHP4 "Session-Handler" Unterstützung

ADODB unterstützt außerdem PHP4 "Session-handlers". Sie können Ihre Session-Variablen in einer Datenbank speichern und so eine enorme Skalierung erreichen. Für weitere Informationen besuchen Sie bitte die Seite unter http://phplens.com/phpeverywhere/node/view/37

Ermutigung zum kommerziellen Einsatz Wenn Sie planen kommerzielle PHP-Applikationen zu schreiben welche Sie verkaufen möchten, sollten Sie auf ADODB setzen. Bei der Veröffentlichung wurde auf die "lesser GPL" gesetzt, welche einen legalen Einsatz in kommerziellen Applikationen erlaubt, während Ihr Code propertär bleibt. Über kommerziellen Einsatz der ADODB sind wir erfreut. Wir verwenden sie intern aus diesen Gründen !

Conclusion Als Dank für das Durchlesen dieses Artikels, hier sind die vollständigen Verse über "let's call the whole thing off".

tri: Thanks to b.ruecker#portunity.de (Björn Rücker) for the translation. Portunity provides a complete commercial Portal solution: The Portalsuite 2002 is the product line of the Portunity GmbH for creating and operating interactive internet presentations, portals and e-business solutions.