The text: "PDO does not allow you to use MySQL's support for Multiple Statements" is outdated.
Since v5.3, PHP intoduced multiple statement support into PDO (by PDO_MYSQLND driver replacing the previous PDO_MYSQL).
Dieser Abschnitt bietet eine Einführung in die Möglichkeiten, die bei der Entwicklung einer PHP-Anwendung, die mit einer MySQL-Datenbank interagieren soll, zur Verfügung stehen.
Was ist eine API?
Eine Schnittstelle zur Programmierung von Anwendungen (Application Programming Interface, API) definiert die Klassen, Methoden, Funktionen und Variablen, die eine Anwendung aufrufen muss, um die gewünschte Aufgabe zu erfüllen. Im Falle von PHP-Anwendungen, die mit Datenbanken kommunizieren müssen, werden die erforderlichen APIs in der Regel über PHP-Erweiterungen bereitgestellt.
APIs können entweder prozedural oder objektorientiert sein. Bei einer prozeduralen API werden Funktionen aufgerufen, um Aufgaben auszuführen, während bei einer objektorientierten API Klassen instanziiert und dann die Methoden der resultierenden Objekte aufgerufen werden. Von den beiden ist die letztere in der Regel die bevorzugte Schnittstelle, da sie moderner ist und zu besser strukturiertem Code führt.
Wenn eine PHP-Anwendung geschrieben wird, die sich mit dem MySQL-Server verbinden muss, stehen mehrere APIs zur Verfügung. In diesem Dokument wird beschrieben, welche Möglichkeiten es gibt und welche die beste Wahl für die jeweilige Anwendung ist.
Was ist ein Konnektor?
Der Begriff Konnektor, wie er in der MySQL-Dokumentation verwendet wird, bezieht sich auf Software, die es ermöglicht, von einer Anwendung aus eine Verbindung zum MySQL-Datenbankserver herzustellen. MySQL bietet Konnektoren für verschiedene Sprachen, darunter PHP.
Wenn eine PHP-Anwendung mit einem Datenbankserver kommunizieren soll, muss PHP-Code geschrieben werden, der die Verbindung zum Datenbankserver, die Abfrage der Datenbank und andere datenbankbezogene Funktionen ermöglicht. Es wird eine Software benötigt, die die API für die Kommunikation zwischen der Anwendung und dem Datenbankserver zur Verfügung stellt und gegebenenfalls andere zwischengeschaltete Bibliotheken verwendet. Diese Software wird allgemein als Konnektor bezeichnet, weil sie es der Anwendung ermöglicht, sich mit einem Datenbankserver zu verbinden.
Was ist ein Treiber?
Ein Treiber ist ein Stück Software, das für die Kommunikation mit einem bestimmten Typ von Datenbankserver entwickelt wurde. Der Treiber kann auch eine Bibliothek aufrufen, z. B. die MySQL Client Library oder den MySQL Native Driver. Diese Bibliotheken implementieren das Low-Level-Protokoll, das für die Kommunikation mit dem MySQL-Datenbankserver verwendet wird.
So verwendet beispielsweise die Datenbankabstraktionsschicht PHP Data Objects (PDO) einen von mehreren datenbankspezifischen Treibern. Einer der verfügbaren Treiber ist der PDO-MYSQL-Treiber, der eine Schnittstelle zum MySQL-Server bietet.
Manchmal werden die Begriffe Konnektor und Treiber synonym verwendet, was verwirrend sein kann. In der MySQL-Dokumentation ist der Begriff "Treiber" für Software reserviert, die den datenbankspezifischen Teil eines Konnektor-Pakets bereitstellt.
Was ist eine Erweiterung?
In der PHP-Dokumentation wird häufig der Begriff Erweiterung verwendet. Der PHP-Code besteht aus einem Kern und optionalen Erweiterungen der Kernfunktionalität. Zu den PHP-Erweiterungen für MySQL gehören mysqli und der PDO-Treiber für MySQL, die mit Hilfe des PHP-Frameworks für Erweiterungen implementiert werden.
Damit die Funktionen einer Erweiterung von PHP-Programmierern programmtechnisch genutzt werden können, stellt diese in der Regel eine API zur Verfügung. Allerdings stellen nicht alle Erweiterungen, die das Framework für PHP-Erweiterungen verwenden, dem PHP-Programmierer eine API zur Verfügung.
Der PDO-Treiber für MySQL beispielsweise stellt dem PHP-Programmierer keine API zur Verfügung, sondern eine Schnittstelle zur darüber liegenden PDO-Schicht.
Die Begriffe API und Erweiterung sollten nicht als gleichbedeutend angesehen werden, da eine Erweiterung dem Programmierer nicht unbedingt eine API zur Verfügung stellt.
Was sind die wichtigsten PHP-APIs, die für die Verwendung von MySQL zur Verfügung stehen?
Wenn eine Verbindung zu einem MySQL-Datenbankserver hergestellt werden soll, gibt es im Wesentlichen zwei Optionen für die API:
Die PHP-Erweiterung mysqli
PHP Data Objects (PDO)
Jede hat ihre eigenen Vor- und Nachteile. Die folgende Diskussion soll eine kurze Einführung in die wichtigsten Aspekte der einzelnen APIs geben.
Was ist die PHP-Erweiterung mysqli?
Die Erweiterung mysqli
, auch bekannt als MySQL
improved, wurde entwickelt, um die Vorteile der neuen
Funktionen, die in MySQL-Systemen ab Version 4.1.3 zur Verfügung stehen,
nutzen zu können. mysqli
ist in PHP ab Version 5
enthalten.
mysqli
bietet viele Vorteile, aber die wichtigsten
Verbesserungen gegenüber mysql
sind:
Objektorientierte Schnittstelle
Unterstützung für vorbereitete Anweisungen
Unterstützung für Mehrfachanweisungen
Unterstützung für Transaktionen
Verbesserte Debugging-Funktionen
Zusätzlich zur objektorientierten Schnittstelle bietet die Erweiterung auch eine prozedurale Schnittstelle.
Die Erweiterung mysqli
wird mit Hilfe des PHP-Frameworks
für Erweiterungen erstellt; der Quellcode befindet sich im Verzeichnis
ext/mysqli.
Weitere Informationen über die Erweiterung mysqli
sind
unter Mysqli zu finden.
Was ist PDO?
PHP Data Objects, oder PDO, ist eine Abstraktionsschicht für Datenbanken speziell für PHP-Anwendungen. PDO bietet eine einheitliche API, die unabhängig von der Art des Datenbankservers ist, mit dem sich die Anwendung verbindet. Wenn die PDO-API verwendet wird, könnte man theoretisch den verwendeten Datenbankserver wechseln, beispielsweise von Firebird zu MySQL, und müsste nur geringfügige Änderungen am PHP-Code vornehmen.
Andere Beispiele für Datenbankabstraktionsschichten sind JDBC für Java-Anwendungen und DBI für Perl.
PDO hat zwar seine Vorteile, z. B. eine klare, einfache und portierbare API, aber sein Hauptnachteil ist, dass es nicht möglich ist, alle verbesserten Features zu nutzen, die in den neuesten Versionen des MySQL-Servers verfügbar sind. Beispielsweise können mit PDO nicht die Mehrfachanweisungen von MySQL genutzt werden.
PDO wird mit Hilfe des PHP-Frameworks für Erweiterungen erstellt; der Quellcode befindet sich im Verzeichnis ext/pdo.
Weitere Informationen über PDO sind unter PDO zu finden.
Was ist der PDO-MYSQL-Treiber?
Der PDO-MYSQL-Treiber ist zumindest aus der Sicht eines PHP-Programmiers keine API im eigentlichen Sinne. Genau genommen befindet sich der PDO-MYSQL-Treiber in der Schicht unter PDO selbst und bietet eine MySQL-spezifische Funktionalität. Der Programmierer ruft zwar die PDO-API auf, aber PDO verwendet den PDO-MYSQL-Treiber, um mit dem MySQL-Server zu kommunizieren.
Der PDO-MYSQL-Treiber ist einer von mehreren verfügbaren PDO-Treibern. Daneben gibt es unter anderem PDO-Treiber für die Datenbankserver Firebird und PostgreSQL.
Der PDO-MYSQL-Treiber wird mit Hilfe des PHP-Frameworks für Erweiterungen erstellt; er stellt dem PHP-Programmierer keine API zur Verfügung. Der Quellcode befindet sich im Verzeichnis ext/pdo_mysql.
Weitere Informationen über den PDO-MYSQL-Treiber sind unter MySQL (PDO) zu finden.
Was ist PHPs MySQL Native Driver?
Um mit dem MySQL-Datenbankserver zu kommunizieren, verwenden
mysqli
und der PDO-MYSQL-Treiber jeweils eine
Low-Level-Bibliothek, die das erforderliche Protokoll implementiert. In der
Vergangenheit war die einzige verfügbare Bibliothek die MySQL Client
Library, auch bekannt als libmysqlclient
.
Die Schnittstelle von libmysqlclient
wurde jedoch
ursprünglich für C-Anwendungen entwickelt und ist daher nicht für die
Kommunikation mit PHP-Anwendungen optimiert. Aus diesem Grund wurde für
PHP-Anwendungen der MySQL Native Driver, mysqlnd
, als
Alternative zu libmysqlclient
entwickelt.
Sowohl die Erweiterung mysqli
als auch der PDO-Treiber
für MySQL können jeweils so konfiguriert werden, dass sie entweder
libmysqlclient
oder mysqlnd
verwenden. Da mysqlnd
speziell für die Verwendung im
PHP-System entwickelt wurde, verfügt es über zahlreiche Speicher- und
Geschwindigkeitsverbesserungen gegenüber libmysqlclient
.
Es wird dringend empfohlen, diese Verbesserungen zu nutzen.
Der MySQL Native Driver wird mit Hilfe des PHP-Frameworks für Erweiterungen erstellt; er stellt dem PHP-Programmierer keine API zur Verfügung. Der Quellcode befindet sich im Verzeichnis ext/mysqlnd.
Vergleich der Merkmale
Die folgende Tabelle vergleicht die Funktionalität der wichtigsten Methoden für den Aufbau einer Verbindung zu MySQL mittels PHP:
PHP-Erweiterung mysqli | PDO (mit PDO-Treiber für MySQL und MySQL Native Driver) | |
---|---|---|
PHP-Version der Einführung | 5.0 | 5.0 |
MySQL-Entwicklungsstatus | In aktiver Entwicklung | In aktiver Entwicklung |
API unterstützt Zeichensätze | Ja | Ja |
API unterstützt serverseitige vorbereitete Anweisungen | Ja | Ja |
API unterstützt clientseitige vorbereitete Anweisungen | Nein | Ja |
API unterstützt gespeicherte Prozeduren | Ja | Ja |
API unterstützt Mehrfachanweisungen | Ja | Weitestgehend |
Unterstützt die gesamte Funktionalität von MySQL 4.1+ | Ja | Weitestgehend |
The text: "PDO does not allow you to use MySQL's support for Multiple Statements" is outdated.
Since v5.3, PHP intoduced multiple statement support into PDO (by PDO_MYSQLND driver replacing the previous PDO_MYSQL).
mysqli can be great in some circumstances but much work has been put into PHP Portable Data Objects (PDO) which you should also consider when choosing a way to connect to your database using php. For example, PDO supports MySQL with minimal performance hit and the code your write for it will support many other databases with little or no changes. That said, the database connection code, even if you have to change a lot of it to use another database will be much less work than coding your actual database data entry and report apps. When I started creating PHP/MySQL apps years ago, I used php's native support for PHP then moved to PEAR:DB and MDB/MDB2 and finally to wizzyweb which is basically like "phpMyAdmin for Apps" to create apps as it automatically generates the PHP PDO connection code and the application code. Sure, I could code it all from scratch but I save about 90% of the time it used to take. The point is look at the total amount of time you will save by using native code vs. an abstraction layer. Most people find that programmer time is the most valuable part of the equation so anything than can save programmer time should be heavily weighted.