PHP 8.0.26 Released!

Übersicht

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 prozedural oder objektorientiert sein. Bei einer prozeduralen API werden Funktionen aufgerufen, um Aufgaben auszuführen, bei einer objektorientierten API werden Klassen instanziiert und dann Methoden für die resultierenden Objekte aufgerufen. 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:

Vergleich der MySQL-API-Optionen in 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 Weitgehend
Unterstützt die gesamte Funktionalität von MySQL 4.1+ Ja Weitgehend
add a note

User Contributed Notes 2 notes

up
27
guatebus at dot gmail dot com
9 years ago
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).
up
0
php-includer at gmail dot com
8 years ago
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.
To Top