Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP

Warum Sie das PDO von PHP für den Datenbankzugriff verwenden sollten

by
Read Time:14 minsLanguages:

German (Deutsch) translation by Federicco Ancie (you can also view the original English article)

Viele PHP-Programmierer haben gelernt, wie sie mit den Erweiterungen MySQL oder MySQLi auf Datenbanken zugreifen können. Ab PHP 5.1 gibt es einen besseren Weg. PHP Data Objects (PDO) bieten Methoden für vorbereitete Anweisungen und die Arbeit mit Objekten, die Sie weitaus produktiver machen!

Neu veröffentlichtes Tutorial

Alle paar Wochen besuchen wir einige der Lieblingsbeiträge unserer Leser aus der gesamten Geschichte der Website. Dieses Tutorial wurde erstmals im Mai 2010 veröffentlicht.


PDO Einführung

"PDO - PHP Data Objects - ist eine Datenbankzugriffsschicht, die eine einheitliche Methode für den Zugriff auf mehrere Datenbanken bietet."

Es berücksichtigt nicht die datenbankspezifische Syntax, kann jedoch dazu führen, dass das Wechseln von Datenbanken und Plattformen ziemlich einfach ist, indem in vielen Fällen einfach die Verbindungszeichenfolge gewechselt wird.

PDO - db abstraction layer

Dieses Tutorial ist nicht als vollständige Anleitung zu SQL gedacht. Es wurde hauptsächlich für Benutzer geschrieben, die derzeit die Erweiterung mysql oder mysqli verwenden, um den Sprung zu einem tragbareren und leistungsfähigeren PDO zu erleichtern.

Datenbankunterstützung

Die Erweiterung kann jede Datenbank unterstützen, für die ein PDO-Treiber geschrieben wurde. Zum Zeitpunkt dieses Schreibens sind die folgenden Datenbanktreiber verfügbar:

  • PDO_DBLIB (FreeTDS / Microsoft SQL Server / Sybase)
  • PDO_FIREBIRD (Firebird / Interbase 6)
  • PDO_IBM (IBM DB2)
  • PDO_INFORMIX (IBM Informix Dynamic Server)
  • PDO_MYSQL (MySQL 3.x / 4.x / 5.x)
  • PDO_OCI (Oracle Call Interface)
  • PDO_ODBC ( ODBC v3 (IBM DB2, unixODBC und win32 ODBC))
  • PDO_PGSQL (PostgreSQL)
  • PDO_SQLITE (SQLite 3 und SQLite 2)
  • PDO_4D (4D)

Alle diese Treiber sind nicht unbedingt auf Ihrem System verfügbar. Hier ist ein schneller Weg, um herauszufinden, welche Treiber Sie haben:


Anschließen

Unterschiedliche Datenbanken können leicht unterschiedliche Verbindungsmethoden haben. Im Folgenden wird die Methode zum Herstellen einer Verbindung mit einigen der beliebtesten Datenbanken gezeigt. Sie werden feststellen, dass die ersten drei identisch sind, außer dem Datenbanktyp - und dann hat SQLite eine eigene Syntax.

Connection String

Bitte beachten Sie den Try / Catch-Block - Sie sollten Ihre PDO-Operationen immer in einen Try / Catch-Vorgang einschließen und den Ausnahmemechanismus verwenden - mehr dazu in Kürze. Normalerweise stellen Sie nur eine einzige Verbindung her. Es sind mehrere aufgeführt, die Ihnen die Syntax zeigen. $DBH steht für 'Datenbankhandle' und wird in diesem Tutorial verwendet.

Sie können jede Verbindung schließen, indem Sie das Handle auf null setzen.

Weitere Informationen zu datenbankspezifischen Optionen und / oder Verbindungszeichenfolgen für andere Datenbanken erhalten Sie von PHP.net.


Ausnahmen und PDO

PDO kann Ausnahmen verwenden, um Fehler zu behandeln. Dies bedeutet, dass alles, was Sie mit PDO tun, in einen Try / Catch-Block eingeschlossen werden sollte. Sie können PDO in einen von drei Fehlermodi zwingen, indem Sie das Fehlermodusattribut in Ihrem neu erstellten Datenbankhandle festlegen. Hier ist die Syntax:

Unabhängig davon, welchen Fehlermodus Sie festgelegt haben, führt eine Fehlerverbindung immer zu einer Ausnahme, und das Erstellen einer Verbindung sollte immer in einem Try / Catch-Block enthalten sein.

PDO::ERRMODE_SILENT

Dies ist der Standardfehlermodus. Wenn Sie es in diesem Modus belassen, müssen Sie nach Fehlern suchen, wie Sie es wahrscheinlich gewohnt sind, wenn Sie die Erweiterungen mysql oder mysqli verwendet haben. Die beiden anderen Methoden eignen sich besser für die DRY-Programmierung.

PDO::ERRMODE_WARNING

Dieser Modus gibt eine Standard-PHP-Warnung aus und ermöglicht dem Programm, die Ausführung fortzusetzen. Es ist nützlich zum Debuggen.

PDO::ERRMODE_EXCEPTION

Dies ist der Modus, den Sie in den meisten Situationen wünschen sollten. Es wird eine Ausnahme ausgelöst, mit der Sie Fehler ordnungsgemäß behandeln und Daten ausblenden können, die möglicherweise dazu beitragen, dass jemand Ihr System ausnutzt. Hier ist ein Beispiel für die Ausnutzung von Ausnahmen:

Die select-Anweisung enthält einen absichtlichen Fehler. Dies führt zu einer Ausnahme. Die Ausnahme sendet die Details des Fehlers an eine Protokolldatei und zeigt dem Benutzer eine freundliche (oder nicht so freundliche) Nachricht an.


Einfügen und aktualisieren

Das Einfügen neuer Daten oder das Aktualisieren vorhandener Daten ist eine der häufigsten Datenbankoperationen. Bei Verwendung von PDO ist dies normalerweise ein zweistufiger Prozess. Alles, was in diesem Abschnitt behandelt wird, gilt gleichermaßen für UPDATE- und INSERT-Operationen.

2 to 3 step insert and update

Hier ist ein Beispiel für die grundlegendste Art der Einfügung:

Sie können dieselbe Operation auch mit der Methode exec() mit einem Aufruf weniger ausführen. In den meisten Situationen verwenden Sie die längere Methode, um vorbereitete Anweisungen nutzen zu können. Selbst wenn Sie es nur einmal verwenden, können Sie durch die Verwendung vorbereiteter Anweisungen vor SQL-Injection-Angriffen geschützt werden.

Vorbereitete Aussagen

Die Verwendung vorbereiteter Anweisungen schützt Sie vor SQL-Injection.

Eine vorbereitete Anweisung ist eine vorkompilierte SQL-Anweisung, die mehrmals ausgeführt werden kann, indem nur die Daten an den Server gesendet werden. Es hat den zusätzlichen Vorteil, dass die in den Platzhaltern verwendeten Daten automatisch vor SQL-Injection-Angriffen geschützt werden.

Sie verwenden eine vorbereitete Anweisung, indem Sie Platzhalter in Ihre SQL aufnehmen. Hier drei Beispiele: eines ohne Platzhalter, eines mit unbenannten Platzhaltern und eines mit benannten Platzhaltern.

Sie möchten die erste Methode vermeiden. es ist hier zum Vergleich. Die Wahl der Verwendung von benannten oder unbenannten Platzhaltern wirkt sich darauf aus, wie Sie Daten für diese Anweisungen festlegen.

Unbenannte Platzhalter

Hier gibt es zwei Schritte. Zunächst weisen wir den verschiedenen Platzhaltern Variablen zu (Zeilen 2-4). Dann weisen wir diesen Platzhaltern Werte zu und führen die Anweisung aus. Um einen weiteren Datensatz zu senden, ändern Sie einfach die Werte dieser Variablen und führen Sie die Anweisung erneut aus.

Scheint dies für Anweisungen mit vielen Parametern etwas unhandlich? Es ist. Wenn Ihre Daten jedoch in einem Array gespeichert sind, gibt es eine einfache Verknüpfung:

Das ist leicht!

Die Daten im Array gelten in der angegebenen Reihenfolge für die Platzhalter. $data[0] geht in den ersten Platzhalter, $data[1] in den zweiten usw. Wenn Ihre Array-Indizes jedoch nicht in Ordnung sind, funktioniert dies nicht ordnungsgemäß und Sie müssen das Array neu indizieren.

Benannte Platzhalter

Sie könnten wahrscheinlich die Syntax erraten, aber hier ist ein Beispiel:

Sie können auch hier eine Verknüpfung verwenden, die jedoch mit assoziativen Arrays funktioniert. Hier ist ein Beispiel:

Die Schlüssel Ihres Arrays müssen nicht mit einem Doppelpunkt beginnen, sondern müssen ansonsten mit den genannten Platzhaltern übereinstimmen. Wenn Sie über ein Array von Arrays verfügen, können Sie diese durchlaufen und einfach die Ausführung mit jedem Datenarray aufrufen.

Eine weitere nette Funktion von benannten Platzhaltern ist die Möglichkeit, Objekte direkt in Ihre Datenbank einzufügen, vorausgesetzt, die Eigenschaften stimmen mit den benannten Feldern überein. Hier ist ein Beispielobjekt und wie Sie Ihre Einfügung durchführen würden:

Durch Umwandeln des Objekts in ein Array in der Ausführung werden die Eigenschaften als Array-Schlüssel behandelt.


Daten auswählen

Fetch data into arrays or objects

Daten werden über ->fetch() abgerufen, eine Methode Ihres Anweisungshandles. Bevor Sie fetch aufrufen, teilen Sie PDO am besten mit, wie die Daten abgerufen werden sollen. Sie haben folgende Möglichkeiten:

  • PDO::FETCH_ASSOC: Gibt ein Array zurück, das nach dem Spaltennamen indiziert ist
  • PDO::FETCH_BOTH (default): Gibt ein Array zurück, das sowohl nach Spaltenname als auch nach Nummer indiziert ist
  • PDO::FETCH_BOUND: Weist die Werte Ihrer Spalten den Variablen zu, die mit der Methode ->bindColumn() festgelegt wurden
  • PDO::FETCH_CLASS: Weist die Werte Ihrer Spalten den Eigenschaften der benannten Klasse zu. Die Eigenschaften werden erstellt, wenn keine übereinstimmenden Eigenschaften vorhanden sind
  • PDO::FETCH_INTO: Aktualisiert eine vorhandene Instanz der benannten Klasse
  • PDO::FETCH_LAZY: Kombiniert PDO::FETCH_BOTH/PDO::FETCH_OBJ und erstellt die Objektvariablennamen so, wie sie verwendet werden
  • PDO::FETCH_NUM: Gibt ein Array zurück, das nach Spaltennummer indiziert ist
  • PDO::FETCH_OBJ: Gibt ein anonymes Objekt mit Eigenschaftsnamen zurück, die den Spaltennamen entsprechen

In Wirklichkeit gibt es drei, die die meisten Situationen abdecken: FETCH_ASSOC, FETCH_CLASS und FETCH_OBJ. Um die Abrufmethode festzulegen, wird die folgende Syntax verwendet:

Sie können den Abruftyp auch direkt im Methodenaufruf ->fetch() festlegen.

FETCH_ASSOC

Dieser Abruftyp erstellt ein assoziatives Array, das nach dem Spaltennamen indiziert ist. Dies sollte jedem bekannt sein, der die Erweiterungen mysql / mysqli verwendet hat. Hier ist ein Beispiel für die Auswahl von Daten mit dieser Methode:

Die while-Schleife durchläuft die Ergebnismenge zeilenweise, bis sie abgeschlossen ist.

FETCH_OBJ

Dieser Abruftyp erstellt für jede Zeile der abgerufenen Daten ein Objekt der Standardklasse. Hier ist ein Beispiel:

FETCH_CLASS

Die Eigenschaften Ihres Objekts werden festgelegt, bevor der Konstruktor aufgerufen wird. Das ist wichtig.

Mit dieser Abrufmethode können Sie Daten direkt in eine Klasse Ihrer Wahl abrufen. Wenn Sie FETCH_CLASS verwenden, werden die Eigenschaften Ihres Objekts festgelegt, bevor der Konstruktor aufgerufen wird. Lesen Sie das noch einmal, es ist wichtig. Wenn keine Eigenschaften vorhanden sind, die mit den Spaltennamen übereinstimmen, werden diese Eigenschaften (als öffentlich) für Sie erstellt.

Das bedeutet, wenn Ihre Daten nach dem Verlassen der Datenbank eine Transformation benötigen, kann dies automatisch von Ihrem Objekt durchgeführt werden, wenn jedes Objekt erstellt wird.

Stellen Sie sich als Beispiel eine Situation vor, in der die Adresse für jeden Datensatz teilweise verdeckt werden muss. Wir könnten dies tun, indem wir diese Eigenschaft im Konstruktor bearbeiten. Hier ist ein Beispiel:

Wenn Daten in diese Klasse abgerufen werden, werden bei der Adresse alle Kleinbuchstaben von a bis z durch den Buchstaben x ersetzt. Die Verwendung der Klasse und die Durchführung dieser Datentransformation ist nun vollständig transparent:

Wenn die Adresse '5 Rosebud' wäre, würden Sie '5 Rxxxxxx' als Ihre Ausgabe sehen. Natürlich kann es Situationen geben, in denen der Konstruktor aufgerufen werden soll, bevor die Daten zugewiesen werden. PDO hat Sie auch dafür abgedeckt.

Wenn Sie nun das vorherige Beispiel mit diesem Abrufmodus (PDO::FETCH_PROPS_LATE) wiederholen, wird die Adresse NICHT verdeckt, da der Konstruktor aufgerufen und die Eigenschaften zugewiesen wurden.

Wenn Sie es wirklich brauchen, können Sie schließlich Argumente an den Konstruktor übergeben, wenn Sie Daten in Objekte mit PDO abrufen:

Wenn Sie für jedes Objekt unterschiedliche Daten an den Konstruktor übergeben müssen, können Sie den Abrufmodus innerhalb der Abrufmethode festlegen:


Einige andere hilfreiche Methoden

Dies soll zwar nicht alles in PDO abdecken (es ist eine riesige Erweiterung!) Es gibt noch einige weitere Methoden, die Sie kennen sollten, um grundlegende Dinge mit PDO zu tun.

Die Methode ->lastInsertId() wird immer für das Datenbankhandle und nicht für das Anweisungshandle aufgerufen und gibt die automatisch inkrementierte ID der zuletzt von dieser Verbindung eingefügten Zeile zurück.

Die Methode ->exec() wird für Operationen verwendet, die keine anderen Daten als die betroffenen Zeilen zurückgeben können. Das Obige sind zwei Beispiele für die Verwendung der exec-Methode.

Die Methode ->quote() zitiert Zeichenfolgen, damit sie sicher in Abfragen verwendet werden können. Dies ist Ihr Fallback, wenn Sie keine vorbereiteten Anweisungen verwenden.

Die Methode ->rowCount() gibt eine Ganzzahl zurück, die die Anzahl der von einer Operation betroffenen Zeilen angibt. In mindestens einer bekannten Version von PDO funktioniert die Methode laut [diesem Fehlerbericht] (http://bugs.php.net/40822) nicht mit select-Anweisungen. Wenn Sie dieses Problem haben und PHP nicht aktualisieren können, können Sie die Anzahl der Zeilen wie folgt ermitteln:


Abschluss

Ich hoffe, dies hilft einigen von Ihnen, von den Erweiterungen mysql und mysqli zu migrieren. Was denkst du? Gibt es jemanden von euch da draußen, der den Wechsel vornehmen könnte?

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.