Die mysql-Erweiterung ist veraltet und wird in Zukunft entfernt: Verwenden Sie stattdessen mysqli oder PDO [duplicate]

Lesezeit: 7 Minuten

Wenn ich versuche, von PHP aus eine Verbindung zu einem MySQL-Server herzustellen, wird die folgende Fehlermeldung angezeigt:

Veraltet: Die mysql-Erweiterung ist veraltet und wird in Zukunft entfernt: Verwenden Sie stattdessen mysqli oder PDO in /path/to/filename.php in Zeile 123

Der Code in der referenzierten Zeile lautet:

mysql_connect($server, $username, $password);

Ich bin sicher, dass die Argumente korrekt sind, und genau dieser Code funktioniert seit Jahren ohne Probleme. Tatsächlich habe ich es aus einem gut beschafften Tutorial zu PHP erhalten.

  1. Warum passiert dies?

  2. Wie kann ich es reparieren?

  3. Ich verstehe, dass es möglich ist, Verfallsfehler durch Einstellung zu unterdrücken error_reporting in php.ini ausschließen E_DEPRECATED:

    error_reporting = E_ALL ^ E_DEPRECATED
    

    Was passiert, wenn ich das tue?

  • Hier gibt es ein Source-Scanning-Tool zum Konvertieren von mysql in mysqli: Konvertieren zu MySQLi (Dezember 2011; von Keith Larson; Oracle Mysql Wiki)

    – hakre

    27. September 2013 um 9:50 Uhr

  • Verwenden pdo_query(). Es ist der einfachste Upgrade-Pfad von mysql_ und verwendet PDO; Dies ist die freundlichere der beiden Alternativen. MYSQLI ist wirklich nur eine Stop-Gap-API; klingt aufgrund der Namensähnlichkeit zunächst verlockend für Neueinsteiger, erfordert aber aufgrund der verschobenen Funktionssignaturen mehr Umschreibung und macht dann sogar parametrisierte Abfragen aufwändiger.

    – mario

    29. Dezember 2013 um 19:46 Uhr


  • Um den Fragentitel zu beantworten – PDO ist allgemeiner und allgemein es ist eine bessere Lösung. @DennisDegryse => Obwohl ich objektorientiertes PDO bevorzuge, HAT MySQLi auch eine objektorientierte Möglichkeit, es zu verwenden (suchen Sie nach “mysqli class”). Mehr zum Vergleich zwischen PDO|MySQLi auf code.tutsplus.com/tutorials/… und php.net/manual/en/mysqli.overview.php

    – jave.web

    19. August 2015 um 11:19 Uhr


  • Nichts gefunden bei Oracle Mysql Wiki (Weblink oben kommentiert) .

    – David Augustus

    22. Januar 2016 um 4:26 Uhr


  • @hakre Danke für den Link zum Tool. Nur als allgemeine Anmerkung: Beachten Sie bitte, dass Sie mysql_ für einige Befehle nicht einfach in mysqli_ umwandeln können, da sie anders funktionieren.

    Benutzer1239087

    19. Januar 2017 um 3:45 Uhr

Die mysql Erweiterung ist veraltet und wird in Zukunft entfernt Verwenden
eggyal

  1. Warum passiert dies?

    Das ganze ext/mysql PHP-Erweiterung, die alle mit dem Präfix benannten Funktionen bereitstellt mysql_war offiziell veraltet in PHP v5.5.0 und in PHP v7 entfernt.

    Es wurde ursprünglich in PHP v2.0 (November 1997) für MySQL v3.20 eingeführt, und seit 2006 wurden keine neuen Funktionen hinzugefügt. Verbunden mit dem Fehlen neuer Funktionen sind Schwierigkeiten bei der Wartung eines solchen alten Codes inmitten komplexer Sicherheitslücken.

    Das Handbuch enthält seit Juni 2011 Warnungen vor seiner Verwendung in neuem Code.

  2. Wie kann ich es reparieren?

    Wie die Fehlermeldung andeutet, gibt es zwei weitere MySQL-Erweiterungen, die Sie in Betracht ziehen können: MySQLi und PDO_MySQLdie beide anstelle von verwendet werden können ext/mysql. Beide sind seit v5.0 im PHP-Kern enthalten, wenn Sie also eine Version verwenden, die diese Verfallsfehler auslöst, können Sie sie mit ziemlicher Sicherheit sofort verwenden – dh ohne Installationsaufwand.

    Sie unterscheiden sich geringfügig, bieten aber eine Reihe von Vorteilen gegenüber der alten Erweiterung, einschließlich API-Unterstützung für Transaktionen, gespeicherte Prozeduren und vorbereitete Anweisungen (und bieten damit die beste Möglichkeit, SQL-Injection-Angriffe abzuwehren). PHP-Entwickler Ulf Wendel hat geschrieben ein gründlicher Vergleich der Funktionen.

    Hashphp.org hat eine ausgezeichnetes Tutorial zum Migrieren von ext/mysql zu PDO.

  3. Ich verstehe, dass es möglich ist, Verfallsfehler durch Einstellung zu unterdrücken error_reporting in php.ini ausschließen E_DEPRECATED:

    error_reporting = E_ALL ^ E_DEPRECATED
    

    Was passiert, wenn ich das tue?

    Ja, es ist möglich, solche Fehlermeldungen zu unterdrücken und die alte weiter zu verwenden ext/mysql Verlängerung vorerst. Aber das solltest du wirklich nicht machen– Dies ist eine letzte Warnung der Entwickler, dass die Erweiterung möglicherweise nicht mit zukünftigen Versionen von PHP gebündelt wird (tatsächlich wurde sie, wie bereits erwähnt, aus PHP v7 entfernt). Stattdessen sollten Sie diese Gelegenheit nutzen, um Ihre Anwendung zu migrieren jetztbevor es zu spät ist.

    Beachten Sie auch, dass diese Technik unterdrückt alle E_DEPRECATED Nachrichten, nicht nur die, die mit dem zu tun haben ext/mysql Erweiterung: Daher sind Ihnen möglicherweise andere bevorstehende Änderungen an PHP nicht bekannt, die sich auf Ihren Anwendungscode auswirken würden. Es ist natürlich möglich, nur Fehler zu unterdrücken, die bei dem betreffenden Ausdruck auftreten, indem PHP verwendet wird Fehlerkontrolloperator– dh der betreffenden Zeile vorangestellt @– dies wird jedoch unterdrückt alle Fehler, die durch diesen Ausdruck ausgelöst wurden, nicht nur E_DEPRECATED Einsen.


Was tun?

  • Sie starten ein neues Projekt.

    Es gibt absolut kein grund benutzen ext/mysql– Wählen Sie stattdessen eine der anderen, moderneren Erweiterungen und profitieren Sie von den Vorteilen, die sie bieten.

  • Sie haben (Ihre eigene) Legacy-Codebasis, die derzeit davon abhängt ext/mysql.

    Es wäre ratsam, Regressionstests durchzuführen: Sie sollten sich wirklich nicht ändern irgendetwas (insbesondere das Aktualisieren von PHP), bis Sie alle potenziellen Einflussbereiche identifiziert, um jeden herum geplant und Ihre Lösung dann gründlich in einer Staging-Umgebung getestet haben.

    • Gemäß bewährter Codierungspraxis wurde Ihre Anwendung in einer lose integrierten/modularen Weise entwickelt, und die Datenbankzugriffsmethoden sind alle in sich abgeschlossen an einem Ort, der leicht gegen eine der neuen Erweiterungen ausgetauscht werden kann.

      Verbringen Sie eine halbe Stunde damit, dieses Modul neu zu schreiben, um eine der anderen, moderneren Erweiterungen zu verwenden; gründlich testen. Sie können später weitere Verfeinerungen einführen, um die Früchte der Vorteile zu ernten, die sie bieten.

    • Die Datenbankzugriffsmethoden sind verstreut und können nicht einfach gegen eine der neuen Erweiterungen ausgetauscht werden.

      Überlegen Sie, ob Sie zu diesem Zeitpunkt wirklich auf PHP v5.5 aktualisieren müssen.

      Sie sollten mit der Planung des Austauschs beginnen ext/mysql mit einer der anderen, moderneren Erweiterungen, damit Sie von den Vorteilen profitieren können, die sie bieten; Sie könnten es auch als Gelegenheit nutzen, Ihre Datenbankzugriffsmethoden in eine modularere Struktur umzugestalten.

      Wenn Sie jedoch eine haben dringend Wenn Sie PHP sofort aktualisieren müssen, könnten Sie erwägen, Verwerfungsfehler vorerst zu unterdrücken: Stellen Sie jedoch zunächst sicher, dass Sie alle anderen Verwerfungsfehler identifizieren, die ebenfalls ausgegeben werden.

  • Sie verwenden ein Drittanbieterprojekt, das davon abhängt ext/mysql.

    Überlegen Sie, ob Sie zu diesem Zeitpunkt wirklich auf PHP v5.5 aktualisieren müssen.

    Überprüfen Sie, ob der Entwickler Korrekturen, Problemumgehungen oder Anleitungen in Bezug auf dieses spezielle Problem veröffentlicht hat; oder, wenn nicht, drängen Sie sie dazu, indem Sie sie auf diese Angelegenheit aufmerksam machen. Wenn Sie eine haben dringend Wenn Sie PHP sofort aktualisieren müssen, könnten Sie erwägen, Verwerfungsfehler vorerst zu unterdrücken: Stellen Sie jedoch zunächst sicher, dass Sie alle anderen Verwerfungsfehler identifizieren, die ebenfalls ausgegeben werden.

    Es ist unbedingt erforderlich, einen Regressionstest durchzuführen.

  • Bitte empfehlen/schlagen Sie auch vor, vorbereitete Anweisungen zu verwenden. Ich habe oft gesehen, dass Benutzer pdo- oder mysqli-Abfragen auf die gleiche Weise wie mysql verwenden, auch wenn sie kein einfaches Anführungszeichen umgehen, was eher gefährlich ist

    – NullPoièteя

    19. Dezember 2012 um 4:25 Uhr

  • @NullPointer: Da steht schon “Sie … bieten … vorbereitete Anweisungen (und bieten damit die beste Möglichkeit, SQL-Injection-Angriffe abzuwehren)“. Ich möchte in dieser Antwort keine Beispiele für parametrisierte Abfragen geben, da dies für die vorliegende Frage nicht wirklich relevant ist. Wie könnte es Ihrer Meinung nach klarer sein?

    – eigelb

    19. Dezember 2012 um 9:19 Uhr

  • Wenn Sie eine schnelle und schmutzige Lösung wünschen, setzen Sie einfach @ vor mysql_connect, um es zu unterdrücken. z.B. @mysql_connect(…); Auf diese Weise müssen Sie keine weiteren Konfigurationen ändern. Die Verwendung der restlichen mysql_-Funktionen ist in Ordnung. Nur mysql_connect() gibt diese Meldung aus.

    – Bimal-Poudel

    4. Mai 2015 um 13:03 Uhr

  • @BimalPoudel: Ich sage das bereits in meiner Antwort: “Es ist natürlich möglich, nur Fehler zu unterdrücken, die bei dem fraglichen Ausdruck auftreten, indem Sie PHP verwenden Fehlerkontrolloperator– dh der betreffenden Zeile vorangestellt @– Dies unterdrückt jedoch alle Fehler, die von diesem Ausdruck ausgelöst werden, nicht nur E_DEPRECATED Einsen.”

    – eigelb

    4. Mai 2015 um 20:43 Uhr

  • @FranKee: Wo speichern Sie diese nutzergenerierten Schlagzeilen, wenn nicht in einer Datenbank? Was ist der „Sprich nach mir“-Angriff, auf den Sie sich beziehen? Verwenden mysql_real_escape_string() ohne eine MySQL-Datenbank ist ganz bestimmt nicht der richtige Weg, um irgendetwas zu verhindern (da es Zeichenfolgen gemäß dem Zeichensatz Ihrer MySQL-Datenbankverbindung maskiert, die Sie nicht haben!). Wenn Sie versuchen, XSS-Angriffe zu verhindern, sollten Sie verwenden htmlentities(). Bei allen anderen Angriffen geben Sie bitte die genaue Bedrohung an.

    – eigelb

    6. Oktober 2015 um 15:38 Uhr

993300cookie-checkDie mysql-Erweiterung ist veraltet und wird in Zukunft entfernt: Verwenden Sie stattdessen mysqli oder PDO [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy