Schöne Arbeit, Max.
Wenn ich mir das so beschaue, nimmt ADODB einem richtig viel Arbeit ab.
Danke, dass du für uns das Thema aufbereitet hast.
Die ADODB-Bibliothek für PHP
Die ADODB (kurz nur noch ADO) ist ein Database Abstraction Layer - also ein Vermittler zwischen Datenbank und Programmiersprache. Ziel ist es, möglichst keine speziellen Abfragen und Objekte einer bestimmten Datenbank zu nutzen, so dass man theoretisch einfach von MySQL auf Postgres oder Oracle wechseln könnte, ohne etwas am PHP-Code zu ändern.
Vorweg: In der Praxis habe ich das noch nie zu 100% hinbekommen, aber nahe drangekommen ist es
Voraussetzung zum Nachvollziehen dieses Tutorials sind Grundkenntnisse in OOP.
In diesem Tutorial gibt es keine Beispieldatenbanken - es geht ja immerhin darum, die eigenen Datenbanken damit anzusprechen.
Ebenfalls Voraussetzung ist PHP ab Version 5 - Unter PHP4 funktioniert es wohl nicht mehr (ist aber ungetestet).
Einbinden der ADODB und Konfiguration
Die ADODB-Bibliothek existiert bereits im PEAR-Repository, jedoch nur selten in der aktuellsten Version.
Ergo sollten wir nach Möglichkeit die Bibliothek einfach mit dem PHP-Projekt zusammenpacken und selber einbinden.
Die Bibliothek bekommt man hier:
http://adodb.sourceforge.net/#download
Nach dem Entpacken des Archivs erhält man einen Ordner "adodb5". Diesen legen wir nun zu unserem Projekt - da wo es halt gut liegt und mit dem restlichen Projektlayout harmoniert.
Wer den Namen des Ordners doof findet, kann ihn selbstverständlich auch umbenennen.
In meinem Beispiel heißt der Ordner "adodb5" und liegt im gleichen Verzeichnis wie die restlichen PHP-Dateien.
Nun müssen wir die ADODB-Bibliotheken noch einbinden und konfigurieren.
Und schon sind wir mit der Datenbank verbunden!PHP-Code:<?php
// ### Einbinden der ADODB-Klassen
require_once("./adodb5/adodb.inc.php");
// ### Objektinstanz erzeugen und Verbindung konfigurieren
$oDB = ADONewConnection("mysql");
// ### Verbindung herstellen
// ### Angabe von Server, Benutzername, Kennwort und Datenbankname
$oDB->Connect("localhost", "root", "passwort", "datenbank");
// ### Wenn Verbindung fehlschlägt, brechen wir hier ab
if(!$oDB->IsConnected())
die("Datenbankverbindung fehlgeschlagen!");
Der Wert, der ADONewConnection() übergeben wird, muss der passenden Datenbanksoftware entsprechen.
Hier ist es MySQL, wer ein anderes Backend nutzt, findet hier passende Verbindungsparameter:
http://phplens.com/lens/adodb/docs-adodb.htm#connect_ex
Auch Liebhaber von PostgresSQL, Oracle, MSSQL, SQLite und wie sie nicht alle heißen, können also auf diese Bibliothek zurückgreifen.
Wir starten eine Abfrage
Jetzt können wir uns Daten aus der Datenbank holen
Dafür gibt es in der ADO die Methode Execute():
Hiermit bekommen wir ein ADO-Objekt zurück, mit dem wir uns schon durch die Daten wühlen können.PHP-Code:$Daten = $oDB->Execute("SELECT * FROM `Tabelle`");
Je nach Geschmack, kann man dieses Objekt weiterverwenden oder man holt sich die Daten als Array.
Für letzteres nutzt man die Methode GetRows();
Was man verwendet ist hauptsächlich Geschmackssache - bei sehr großen Datenmengen empfiehlt es sich aber, bei dem Objekt zu bleiben, da sich die Arbeitsspeichernutzung bei der Verwendung von Arrays deutlich erhöht.PHP-Code:$ArrayDaten = $oDB->Execute("SELECT * FROM `Tabelle`")->GetRows();
Als nächstes wollen wir die Daten auch ausgeben.
Ich werde direkt sowohl die Vorgehensweise mit dem Objekt, als auch mit dem Array beschreiben:
Ausgabe unter Verwendung des Objektes:
Einige Erläuterungen zu EOF, MoveFirst und MoveNext:PHP-Code:
$TabDaten = $oDB->Execute("SELECT * FROM `Tabelle`");
// ### Wenn $TabDaten false ist, ist die Abfrage fehlgeschlagen.
if($TabDaten !== false)
{
// ### Zum ersten geholten Datensatz springen
$TabDaten->MoveFirst();
// ### Alle Daten bis zum letzten Datensatz (dann ist EOF == true) durchlaufen
while($TabDaten->EOF != true)
{
// ### Ausgabe der Tabellenfelder
echo $TabDaten->Fields("FeldName1")."<br />";
echo $TabDaten->Fields("FeldName2");
// ### Zum nächsten Datensatz springen
$TabDaten->MoveNext();
}
}
Die Eigenschaft EOF (=End Of File) gibt an, ob der Zeiger bereits hinter dem letzten Datensatz liegt,
also definitiv nichts mehr weiter kommen kann.
MoveFirst() setzt den Zeiger auf den ersten Datensatz, MoveNext() springt zum nächsten.
Vergisst man innerhalb einer while-Schleife das "MoveNext()", hat man übrigens eine gar wunderbare Endlosschleife
Ich habe mir aber sagen lassen, dass es inzwischen Server gibt, die so dermaßen Power haben, dass sie eine Endlosschleife innerhalb von 10 Sekunden abarbeiten können
Abfrage mit dem Array:
PHP-Code:
// ### Daten holen
$TabDaten = $oDB->Execute("SELECT * FROM `Tabelle`");
// ### Leeres Array erzeugen - dann moppert foreach nicht rum ;-)
$ArrayDaten = array();
// ### Kein Fehler aufgetreten -> Array holen
if($TabDaten !== false)
$ArrayDaten = $TabDaten->GetRows();
// ### Ausgabe aller Datensätze
foreach($ArrayDaten as $Datensatz)
{
echo $Datensatz['FeldName1']."<br />";
echo $Datensatz['FeldName2'];
}
Daten einfügen
Richtig Arbeit abnehmen kann uns die ADO aber so richtig beim Einfügen neuer Datensätze.
Hierfür benötigen wir lediglich ein Array, dessen Felder die gleichen Namen haben, wie die Felder aus der Tabelle.
Beispiel:
Wir haben in der Tabelle die Felder
ID (INT, auto_increment)
Vorname (varchar)
Nachname (varchar)
PLZ (INT)
Ort (varchar)
Und in diese Felder fügen wir nun diese Daten ein:
So einfach kann es seinPHP-Code:
$InsertArray = array();
// ### Hier sind die Daten
// ### Normalerweise muss man "ID" nicht extra definieren, da es ja ein AutoIncrement-Feld ist.
// ### Das ist nur zur Sicherheit...
$InsertArray['ID'] = null;
$InsertArray['Vorname'] = "Heinz";
$InsertArray['Nachname'] = "Testheimer";
$InsertArray['PLZ'] = 4711;
$InsertArray['Ort'] = "Öderdorf-Langenweiler";
// ### Das hier ist der Insert
$oDB->AutoInsert("TabellenName", $InsertArray, "INSERT");
Ein Update geht ähnlich einfach, im folgenden Beispiel nehmen wir mal an,
dass der Datensatz über ein Formular geändert wurde und die UserID (=Datensatz-ID)
über $_GET['ID'] übergeben wird.
PHP-Code:
$InsertArray = array();
// ### Die aktualisierten Daten, wir setzen nur den Vornamen und die Postleitzahl neu
$InsertArray['Vorname'] = "Hubert";
$InsertArray['PLZ'] = 0815;
// ### Hier wird der Datensatz aktualisiert,
// ### hier steht in der Variable $_GET['UserID'] die ID des zu aktualisierenden Datensatzes.
$oDB->AutoExecute("TabellenName", $InsertArray, "UPDATE", "ID = ".intval($_GET['UserID']);
Ein einfaches Formularbeispiel:
Hier sollen die eingegebenen Daten einfach 1:1 in die Datenbank geschrieben werden.
Jawoll, das ist allesPHP-Code:
<form name="testformular" action="form.php" method="POST">
<input type="text" name="Data[Vorname]"><br />
<input type="text" name="Data[Nachame]"><br />
<input type="text" name="Data[PLZ]"><br />
<input type="text" name="Data[Ort]"><br />
<input type="submit" value="Speichern">
</form>
<?php
// ### Wir haben schon vorher die Verbindung hergestellt...
// ### Und jetzt nehmen wir direkt die POST-Daten.
// ### Angabe von Tabellen-Name, Array mit den Daten, Methode, zus. WHERE-Anweisung, Update erzwingen, MagicQoutes benutzen
$oDB->AutoExecute("TabellenName", $_POST[Data], "INSERT", false, false, true);
?>
Die ADODB achtet hierbei auch direkt auf die Sicherheit und escaped die Daten aus dem Array, um SQL-Injections zu verhindern.
Fehlersuche
Wenn es mal einfach nicht klappen will, könnten SQL-Fehler Schuld daran sein.
Die Entwickler der ADODB haben das berücksichtigt und eine Debug-Funktion hinzugefügt.
Die vollständigen SQL-Strings und eventuelle Fehler werden ausgegeben, wenn man diese folgendermaßen aktivert:
Zusätzlich kann man auch die Datei "adodb-errorhandler.inc.php" mit require('./adodb5/adodb-errorhandler.inc.php'); einbinden.PHP-Code:$oDB->debug = true;
$oDB->Execute('SELECT `nichtexistentesfeld` FROM `falschetabelle`');
$oDB->debug = false;
Dann wird bei jedem SQL-Fehler ein Fatal Error geschmissen und das Script bricht mit der MySQL-Fehlermeldung ab.
In Teil 2 schreiben wir uns innerhalb weniger Minuten unsere eigene Shoutbox
Fehler bitte an mich per PN, Mail oder in diesem Thread!
Schöne Arbeit, Max.
Wenn ich mir das so beschaue, nimmt ADODB einem richtig viel Arbeit ab.
Danke, dass du für uns das Thema aufbereitet hast.
»Man sollte alles so einfach wie möglich sehen - aber auch nicht einfacher.«
-Albert E.
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)