PHP: Die MySQL-Erweiterung ist veraltet

  • Veraltet seit PHP 5.5 ... in PHP 7.0
  • Ein schlechtes Design
    • Mehr als 15 Jahre Existenz
    • DB-Verbindungen: Die letzte ist die Standardverbindung
    • Fehlerbehandlung? Welche Fehlerbehandlung?
    • Entwickelt für MySQL 3.23
    • Verschlüsselte Verbindungen
    • Keine vorbereiteten Aussagen
  • Eine Gefahr für die Zukunft
    • Bald nicht mehr gewartet
  • Also, was ist zu benutzen?
  • Verbreiten Sie das Wort

PHP ist eine wunderbare Programmiersprache für Webserver, aber nicht nur zum Speichern von strukturierten Daten. Aus diesem Grund verfügt es über Erweiterungen, die eine Verbindung zu DBMSs (DataBase Management Systems) herstellen und diese verwenden können, einschließlich des beliebten MySQL . Es ist eine seriöse DB-Engine mit aktiver Entwicklung und beliebter Verwendung, insbesondere in AMP-Setups mit [W / L / M].

Die Verwendung in PHP erfolgt jedoch (historisch) über die PHP-Erweiterung MySQL (

 mysql_ * 
Funktionen), die veraltet und veraltet ist! (Nicht verwechseln: MySQL selbst ist nicht veraltet)

Machen Sie sich gefasst, dieser Artikel ist ein bisschen langwierig ... Wenn Sie nicht lesen möchten, denken Sie daran: Verbieten Sie alle

 mysql_ * 
Funktionen und verwenden Sie MySQL i oder PDO.

Veraltet seit PHP 5.5 ... in PHP 7.0

PHP 5.5.0 wurde am 20. Juni 2013 offiziell veröffentlicht (siehe das PHP-Nachrichtenarchiv 2013, einschließlich Versionshinweisen). In dieser Version haben die PHP-Entwickler beschlossen, die MySQL-Erweiterung nicht mehr zu verwenden.

Mehrere Gründe dafür wurden auf der RFC-Seite der Entscheidung angegeben. Dieser FAQ-Artikel fasst sie zusammen.

Seit PHP 7.0 wurde die Erweiterung vollständig entfernt, da sie nicht mehr gepflegt wurde und nicht mehr mit der neuen Version der Laufzeitsprache kompatibel war.

Also, wer sagt, dass es veraltet ist, sagt, dass es gute Gründe gibt, es nicht mehr zu benutzen. Nur damit du es nicht vergisst

 mysql_ * 
Funktionsverwendung löst a aus
 E_DEPRECATED 
Warnung (kein Fehler) standardmäßig in PHP 5.5+.

Ein schlechtes Design

Mehr als 15 Jahre Existenz

Die MySQL-Erweiterung wurde in PHP 2.0 eingeführt, also noch vor 1998, dem Jahr, in dem PHP 3 veröffentlicht wurde. 15 Jahre alte Programmiertechniken sind heutzutage nicht immer effizient, besonders in der IT, die sich sehr schnell entwickelt. Dies könnte die (relative) Langsamkeit im Vergleich zu anderen DBMS-Erweiterungen erklären ... und erklärt auch das Fehlen einiger Funktionen, die für die heutige Verwendung wichtig sind (siehe unten).

DB-Verbindungen: Die letzte ist die Standardverbindung

 mysql_ * 
Wenn dies nicht ausdrücklich angegeben wird, wird davon ausgegangen, dass die zu verwendende DB-Verbindung die zuletzt geöffnete ist. Dieses Verhalten ist in zwei Fällen problematisch:
  • Wenn Sie mehrere DBs gleichzeitig verwenden: Vergessen Sie die Übergabe des Verbindungsparameters, und Ihre SQL-Anforderung wird in der falschen DB gespeichert.
  • Um Fehler zu verfolgen: Keine Variable beschreibt explizit die Verbindung, daher ist es unmöglich, eine PHP-IDE / einen PHP-Debugger zu verwenden: Sie müssen die belasteten finden
     mysql_connect 
    Sie selbst und fügen Sie ggf. Debugging-Code hinzu.

Fehlerbehandlung? Welche Fehlerbehandlung?

PHP 5 bringt ein Paradigma mit, das direkt aus der objektorientierten Programmierung stammt: Ausnahmen. Die MySQL-Erweiterung ist zu alt und wurde nie aktualisiert, um sie zu verwenden. Der einzige Weg, um Fehler abzufangen, ist die Verwendung von mysql_error (). Großer Nachteil dieser Technik: Sie müssen Ihren Fehlerbehandlungscode nach jedem einfügen
 mysql_ * 
Funktionsaufruf!

Mit Exceptions kann ein Codeblock unterbrochen werden und direkt zur Fehlerbehandlung übergegangen werden. Dies vereinfacht den Code nicht nur für den Programmierer, sondern auch für PHP: Exceptions sind passiv und werden nur ausgelöst, wenn eine Funktion von sich aus einen Fehler meldet. Bei dem anderen Ansatz muss PHP jedes Mal überprüfen, ob alles wie geplant gelaufen ist, und die meiste Zeit tat es das ... das ist nutzlose Arbeit.

Entwickelt für MySQL 3.23

Fortgeschrittene (My) SQL-Benutzer werden enttäuscht sein: Einige Funktionen, die nach 3.23 entwickelt wurden, sind einfach nicht verfügbar, da entsprechende Erweiterungsupdates fehlen.

Dies führt zum Fehlen von SQL-Prozeduren, die in einigen Fällen sehr nützlich sind.

Laut einigen Leuten hat die Erweiterung auch Probleme mit einigen Textcodierungen.

Verschlüsselte Verbindungen

Remote-DB-Verbindungen können mit SSL (Secure Socket Layer), nicht jedoch mit TLS (Transport Layer Security) gesichert werden. Wie einige Ereignisse in letzter Zeit gezeigt haben (zum Zeitpunkt der Veröffentlichung von OpenSSLs HeartBleed), ist SSL ein fehlerhaftes Protokoll und sollte aus einer Reihe von Gründen, die hier nicht näher erläutert werden, durch TLS 1.1+ ersetzt werden. Die Erweiterung unterstützt kein TLS und zwingt daher alle Benutzer, einen Verschlüsselungsstandard zu verwenden, der ebenfalls als veraltet angesehen werden sollte.

Keine vorbereiteten Aussagen

Haben Sie den fetten und unterstrichenen Titel bemerkt? Dies ist wahrscheinlich der wichtigste Punkt dieses ganzen Artikels:

Die MySQL-Erweiterung hat keine vorbereiteten Anweisungen .

Was, und warum sind sie so wichtig? SQL-Anforderungen sind die meiste Zeit variabel, je nach Auswahl des Benutzers. Die einfachste (und leider am weitesten verbreitete) Lösung sieht so aus:

 mysql_query ('UPDATE-Mitglieder SET name = "'. $ _ GET ['name']. '" WHERE name = "'. $ name. '"'); 

Alles ist in Ordnung, Sie setzen die Daten des Benutzers in doppelte Anführungszeichen. Schade, das reicht bei weitem nicht aus: Jeder Benutzer kann durch Zugriff zum Administrator werden

 change-name.php? name =% 22% 20admin% 3D1% 20name% 3D% 22USERNAME 
. In einem zufälligen Tutorial werden Sie dazu aufgefordert, es zu verwenden
 mysql_real_escape_string 
Dies ist (ehrlich gesagt) zu langwierig und hässlich, und führt zu Verwirrung und doppelter oder gar keiner Verwendung für eine bestimmte Variable.

Vorbereitete Anweisungen bieten eine elegante Lösung für dieses Durcheinander: Sie bereiten die Struktur Ihrer Anforderung vor und führen sie dann mit den gewünschten Parametern aus (PDO-Beispiel):

 $ req = $ pdo-> prepare ('UPDATE-Mitglieder SET name =: newname WHERE name =: name'); $ req-> execute (array ("newname" => $ _GET ['name'], "name" => $ name)); 
Hier können Sie loslegen, ohne sich jemals um SQL-Injektionen kümmern zu müssen. Die ganze Drecksarbeit ist für dich erledigt.

Eine Gefahr für die Zukunft

Die Erweiterung nähert sich gefährlich dem Ende ihrer Lebensdauer, ihre Löschung aus PHP steht unmittelbar bevor, und Ihre Site auch, wenn sie verwendet wird ... Auch heute gibt es eine ganze "Kultur" um die Erweiterung, die bald verschwinden wird, ohne es zu wissen: a Viele Tutorials und Benutzer empfehlen die Verwendung immer noch, ohne sich der zukünftigen Entfernung bewusst zu sein. Du hast es verstanden, diese Kultur muss weggewischt werden.

Aus diesem Grund müssen Sie Ihre Skripte, Websites oder sogar CMS (falls möglich) unbedingt in eine andere DB-Zugriffs-API konvertieren. Je schneller es fertig ist, desto besser: Ihr Projekt ist möglicherweise (noch) nicht groß, und die Dokumentation der Erweiterung ist immer noch leicht verfügbar, ebenso wie Tutorials zum Konvertieren.

Die oben genannten Designprobleme machen die Konvertierung der Erweiterung schwierig. Sobald dies erledigt ist, wird es wahrscheinlich einfacher, Ihren Code in einen anderen DB-Verbindungstreiber zu übersetzen: Moderne APIs sind alle (mehr oder weniger) gleich.

Bald nicht mehr gewartet

Mangelnde Wartung birgt ein großes Risiko: Sicherheitslücken, die im Code enthalten sind, werden wahrscheinlich nie behoben. Wenn ein kritisches Sicherheitsproblem entdeckt wird, drohen Millionen von Websites, wenn sie nicht wechseln. Versuchen Sie, keiner von ihnen zu sein.

Also, was ist zu benutzen?

Die Antwort ist einfach, aber treffen Sie Ihre Wahl:
  • GU
    • Nur objektorientierte Schnittstelle
    • Arbeit mit mehreren DBMSs: MySQL, MSSQL, SQLite, ...
  • Mysqli
    • Cross-kompatibles objektorientiertes und funktionales Modell
    • Erinnert stark an die MySQL-Erweiterung

Verbreiten Sie das Wort

Wenn Sie jemanden sehen, der Sie über die Verwendung der Erweiterung informiert oder sie lernt, tun Sie, was Sie können, um ihm / ihr (en) mitzuteilen, dass er / sie etwas falsch macht:

Erklären und verlinken Sie ihn / sie mit diesem Artikel, der Argumente zeigt, warum er nicht verwendet werden sollte, anstatt eine lange und anspruchsvolle Antwort zu schreiben.

Dieser FAQ-Artikel ist unter CC BY-SA lizensiert und wurde ursprünglich von gravgun geschrieben.

Vorherige Artikel Nächster Artikel

Top-Tipps