342 Stimmen

mysqli oder PDO - was sind die Vor- und Nachteile?

Bei uns sind wir zwischen der Verwendung von mysqli und PDO für Dinge wie vorbereitete Anweisungen und Transaktionsunterstützung aufgeteilt. Einige Projekte verwenden das eine, einige das andere. Es besteht kaum eine realistische Wahrscheinlichkeit, dass wir jemals zu einem anderen RDBMS wechseln.

Ich bevorzuge PDO aus dem einzigen Grund, dass es benannte Parameter für vorbereitete Anweisungen erlaubt, und soweit ich weiß, tut mysqli das nicht.

Gibt es noch andere Vor- und Nachteile, die dafür sprechen, den einen oder den anderen als Standard zu wählen, wenn wir unsere Projekte konsolidieren, um nur einen Ansatz zu verwenden?

10voto

Alix Axel Punkte 146320

Ein weiterer bemerkenswerter (guter) Unterschied zu PDO ist, dass es sich PDO::quote() Methode fügt automatisch die einschließenden Anführungszeichen hinzu, während mysqli::real_escape_string() (und Ähnliches) nicht:

PDO::quote() setzt Anführungszeichen um den Eingabe-String (falls erforderlich) und bricht Sonderzeichen innerhalb der Eingabezeichenfolge ab, indem es einen Stil, der für den zugrunde liegenden Treiber geeignet ist.

8voto

Dfranc3373 Punkte 1851

PDO macht es viel einfacher zu skalieren, wenn Ihre Website/Webapplikation sehr groß wird, da Sie täglich Master- und Slave-Verbindungen einrichten können, um die Last auf die Datenbank zu verteilen, und PHP ist auf dem Weg zu PDO als Standard.

PDO-Informationen

Skalierung einer Webanwendung

6voto

Im Sinne der Ausführungsgeschwindigkeit gewinnt MySQLi, aber wenn Sie keinen guten Wrapper haben, der MySQLi verwendet, sind seine Funktionen, die mit vorbereiteten Anweisungen umgehen, furchtbar.

Es gibt immer noch Bugs in meinem, aber wenn jemand es will, hier ist es .

Kurz gesagt, wenn Sie einen Geschwindigkeitsgewinn suchen, sollten Sie sich für MySQLi entscheiden; wenn Sie Benutzerfreundlichkeit wünschen, sollten Sie PDO wählen.

5voto

BlaM Punkte 27550

Ich persönlich verwende PDO, aber ich denke, das ist hauptsächlich eine Frage der Vorliebe.

PDO hat einige Funktionen, die gegen SQL-Injection helfen ( vorbereitete Erklärungen ), aber wenn Sie mit Ihrem SQL vorsichtig sind, können Sie das auch mit mysqli erreichen.

Der Wechsel zu einer anderen Datenbank ist kein Grund, PDO zu verwenden. Solange Sie keine "speziellen SQL-Funktionen" verwenden, können Sie von einer DB zu einer anderen wechseln. Sobald Sie jedoch zum Beispiel "SELECT ... LIMIT 1" verwenden, können Sie nicht zu MS-SQL wechseln, wo es "SELECT TOP 1 ..." heißt. Dies ist also ohnehin problematisch.

5voto

Your Common Sense Punkte 154708

Bearbeitete Antwort.

Nachdem ich einige Erfahrung mit diesen beiden APIs habe, würde ich sagen, dass es 2 Blocking-Level-Funktionen gibt, die mysqli mit nativen vorbereiteten Anweisungen unbrauchbar machen.
Sie wurden bereits in 2 ausgezeichneten (und doch weit unterschätzten) Antworten erwähnt:

  1. Bindung von Werten an eine beliebige Anzahl von Platzhaltern
  2. Rückgabe von Daten als reines Array

(beide auch erwähnt in diese Antwort )

Aus irgendeinem Grund schlug mysqli bei beiden fehl.
Heute hat sich die Situation beim zweiten Mal etwas verbessert ( get_result ), aber sie funktioniert nur auf mysqlnd-Installationen, d.h. Sie können sich nicht auf diese Funktion in Ihren Skripten verlassen.

Dennoch hat sie bis heute keinen bindenden Wert.

Es gibt also nur eine Möglichkeit: PDO

Alle anderen Gründe, wie zum Beispiel

  • benannte Platzhalter (dieser Syntaxzucker wird weit überschätzt)
  • Unterstützung verschiedener Datenbanken (niemand hat sie je benutzt)
  • fetch into object (nur unnützer Syntaxzucker)
  • Geschwindigkeitsunterschied (es gibt keinen)

sind nicht von großer Bedeutung.

Gleichzeitig mangelt es diesen beiden APIs an einigen wirklich wichtige Merkmale , wie

  • Platzhalter für Bezeichner
  • Platzhalter für die komplexen Datentypen, um die dynamische Bindung weniger mühsam zu gestalten
  • kürzerer Anwendungscode.

Also, um die real Leben braucht, muss man seine eigene Abstraktionsbibliothek erstellen, die auf einer dieser APIs basiert und manuell geparste Platzhalter implementiert. In diesem Fall würde ich mysqli bevorzugen, denn es hat eine geringere Abstraktionsebene.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X