Ergebnis 1 bis 7 von 7

Thema: Einfaches Arbeiten mit Datenbanken: ADODB für PHP

  1. #1
    TP-Moderator Avatar von maxi89
    Registriert seit
    Nov 2004
    Ort
    Mulpe an der Tunke
    Beiträge
    2.584

    Einfaches Arbeiten mit Datenbanken: ADODB für PHP

    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.
    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!");
    Und schon sind wir mit der Datenbank verbunden!
    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():

    PHP-Code:
    $Daten $oDB->Execute("SELECT * FROM `Tabelle`"); 
    Hiermit bekommen wir ein ADO-Objekt zurück, mit dem wir uns schon durch die Daten wühlen können.
    Je nach Geschmack, kann man dieses Objekt weiterverwenden oder man holt sich die Daten als Array.
    Für letzteres nutzt man die Methode GetRows();

    PHP-Code:
    $ArrayDaten $oDB->Execute("SELECT * FROM `Tabelle`")->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.


    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:
    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();
        }

    Einige Erläuterungen zu EOF, MoveFirst und 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:
    PHP-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"); 
    So einfach kann es sein
    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.

    PHP-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"falsefalsetrue);

    ?>
    Jawoll, das ist alles
    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:

    PHP-Code:
    $oDB->debug true;
    $oDB->Execute('SELECT `nichtexistentesfeld` FROM `falschetabelle`');
    $oDB->debug false
    Zusätzlich kann man auch die Datei "adodb-errorhandler.inc.php" mit require('./adodb5/adodb-errorhandler.inc.php'); einbinden.
    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!

  2. #2
    TP-Moderator Avatar von fuchzga
    Registriert seit
    Nov 2007
    Ort
    München
    Beiträge
    1.841
    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.

  3. #3
    TP-Junior
    Registriert seit
    Sep 2010
    Beiträge
    14
    Hallo maxi89,

    ich arbeite zwar schon eine ganze Weile mit AdoDB, was ich mich aber immer gefragt habe, wie siehts da eigendlich mit Sql-Injections aus?

    In deinem Tutorial baust du ein Select mit "Execute" auf und "GetRows()" am ende.
    Ich nutze hingen folgenden Aufbau:
    PHP-Code:
    $data $db->getRow("select * from table where id=?;"$_GET['id']); 
    Meine Frage ist nun, in wie weit "sichert" mich AdoDB vor Sqli ab und was kann ich noch zusätzlich dagegen tun?

    PS.: tolles Tutorial!

  4. #4
    TP-Moderator Avatar von maxi89
    Registriert seit
    Nov 2004
    Ort
    Mulpe an der Tunke
    Beiträge
    2.584
    Danke

    Für reine Integer-Werte (also ganze Zahlen ohne Komma etc...) kannst du einfach ein intval($_GET['id']) verwenden. Alles was nicht Zahl ist, fliegt dabei automatisch raus.
    Bei Strings nutzt du einfach das ADODB-Eigene qstr($_GET['id']) - da werden die bösen Zeichen escaped.

  5. #5
    TP-Junior
    Registriert seit
    Sep 2010
    Beiträge
    14
    Alles klar,

    kann man die wie z.b.
    PHP-Code:
    $db->EXECUTE("set names 'utf8'"); 
    dies auch global festlegen, sodass ich nicht zwingend alle selects/inserts/updates anpassen muss?

    Wenn nicht - is ja auch nicht so schlimm, macht man ja nur einmal ...

  6. #6
    TP-Moderator Avatar von maxi89
    Registriert seit
    Nov 2004
    Ort
    Mulpe an der Tunke
    Beiträge
    2.584
    SET NAMES funktioniert und sollte nach Möglichkeit direkt nach dem Herstellen der Verbindung ausgeführt werden.
    Ist das bezogen auf die SQL-Injections oder war das unabhängig davon gemeint um die Zeichencodierung festzulegen?

  7. #7
    TP-Junior
    Registriert seit
    Sep 2010
    Beiträge
    14
    Hallo,

    den code Schnipsel habe ich direkt nach der Verbindungsgerstellung gesetzt, ich hab das Beispiel nur gepostet, weil dies ja dafür sorgt das alle Verbindungen auf utf8 gesetzt werden, meine Frage (war vllt etwas ungünsig Formuliert) ob dies auch mit qstr() (dies global zu setzen für AdoDB) möglich wäre - ist also schon noch auf Sqli bezogen.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. AdoDb und Scrolling/Paging
    Von Master_T2 im Forum Traum-Dynamik
    Antworten: 1
    Letzter Beitrag: 16.05.2008, 11:29
  2. Einfaches Arbeiten mit externen Stylesheet-Dateien in Verbindung mit Dreamweaver?
    Von dannyl. im Forum Dreamweaver & andere Webeditoren
    Antworten: 1
    Letzter Beitrag: 28.06.2005, 07:29
  3. kennt einer sich mit ADODB aus?
    Von NiteStyle im Forum Traum-Dynamik
    Antworten: 2
    Letzter Beitrag: 23.09.2004, 11:27
  4. PEAR oder ADODB ?
    Von NeTHippie im Forum Traum-Dynamik
    Antworten: 2
    Letzter Beitrag: 04.12.2003, 17:06
  5. ADODB.Connection-Fehler
    Von storch im Forum Traum-Dynamik
    Antworten: 1
    Letzter Beitrag: 15.07.2002, 12:06

Stichworte

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51