wake-up-neo.com

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

Wenn ich versuche, von PHP aus eine Verbindung zu einem MySQL-Server herzustellen, wird der folgende Fehler 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 angegebenen Zeile lautet:

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

Ich bin sicher, dass die Argumente korrekt sind und dieser genaue Code seit Jahren ohne Probleme funktioniert. In der Tat habe ich es aus einem gut ausgebauten Tutorial über PHP erhalten.

  1. Warum passiert dies?

  2. Wie kann ich es reparieren?

  3. Ich verstehe, dass es möglich ist, Verfallsfehler zu unterdrücken, indem error_reporting in php.ini gesetzt wird, um E_DEPRECATED auszuschließen:

    error_reporting = E_ALL ^ E_DEPRECATED
    

    Was passiert, wenn ich das tue?

164
eggyal
  1. Warum passiert dies?

    Die gesamte Erweiterung ext/mysql PHP, die alle Funktionen mit dem Präfix mysql_ enthält, wurde offiziell in PHP v5.5.0 veraltet und entfernt in PHP v7 .

    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 komplexe Sicherheitslücken.

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

  2. Wie kann ich es reparieren?

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

    Sie unterscheiden sich geringfügig, bieten jedoch eine Reihe von Vorteilen gegenüber der alten Erweiterung, einschließlich API-Unterstützung für Transaktionen, gespeicherte Prozeduren und vorbereitete Anweisungen (wodurch der beste Weg zum Abwehren SQL-Injection-Angriffe bereitgestellt wird ). PHP Entwickler Ulf Wendel hat geschrieben einen gründlichen Vergleich der Funktionen .

    Hashphp.org hat ein exzellentes Tutorial zur Migration von ext/mysql nach PDO .

  3. Ich verstehe, dass es möglich ist, Verfallsfehler zu unterdrücken, indem error_reporting in php.ini so eingestellt wird, dass E_DEPRECATED ausgeschlossen wird:

    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 ext/mysql-Erweiterung vorerst weiter zu verwenden. Aber Sie sollten dies wirklich nicht tun - dies ist eine letzte Warnung der Entwickler, dass die Erweiterung möglicherweise nicht mit zukünftigen Versionen von PHP (tatsächlich wurde es, wie bereits erwähnt, aus PHP v7 entfernt). Stattdessen sollten Sie diese Gelegenheit nutzen, um Ihre Anwendung zu migrieren jetzt, bevor es zu spät ist.

    Beachten Sie auch, dass diese Technik alleE_DEPRECATED-Nachrichten unterdrückt, nicht nur solche, die mit der ext/mysql-Erweiterung zu tun haben. Daher sind Ihnen möglicherweise keine weiteren anstehenden Änderungen an PHP bekannt, die sich auf Ihre Anwendung auswirken würden Code. Es ist natürlich möglich, nur Fehler zu unterdrücken, die in dem fraglichen Ausdruck auftreten, indem der PHP-Operator Fehlerkontrolloperator - d.h. Stellen Sie @ vor die entsprechende Zeile - dies unterdrückt jedoch alle Fehler, die durch diesen Ausdruck ausgelöst werden, nicht nur E_DEPRECATED.


Was sollte man tun?

  • Sie starten ein neues Projekt.

    Es gibt absolut keinen Grund, ext/mysql zu verwenden - 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 von ext/mysql abhängt.

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

    • Nach bewährter Codierungspraxis wurde Ihre Anwendung lose integriert/modular entwickelt, und die Datenbankzugriffsmethoden befinden sich alle an einem Ort und können problemlos gegen eine der neuen Erweiterungen ausgetauscht werden .

      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 Verbesserungen vornehmen, um die Vorteile zu nutzen, die sie bieten.

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

      Überlegen Sie, ob Sie zu diesem Zeitpunkt wirklich ein Upgrade auf PHP v5.5 durchführen müssen.

      Sie sollten planen, ext/mysql durch eine der anderen, moderneren Erweiterungen zu ersetzen, damit Sie die Vorteile nutzen können, die sie bieten. Sie können es auch als Gelegenheit nutzen, Ihre Datenbankzugriffsmethoden in eine modularere Struktur umzugestalten.

      Wenn Sie jedoch dringend ein sofortiges Upgrade von PHP durchführen müssen, sollten Sie vorerst die Unterdrückung von Verfallsfehlern in Betracht ziehen. Ermitteln Sie jedoch zunächst alle anderen Verfallsfehler auch geworfen werden.

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

    Überlegen Sie, ob Sie zu diesem Zeitpunkt wirklich ein Upgrade auf PHP v5.5 durchführen müssen.

    Überprüfen Sie, ob der Entwickler in Bezug auf dieses spezielle Problem Fehlerbehebungen, Problemumgehungen oder Anleitungen veröffentlicht hat. oder, wenn nicht, machen Sie sie darauf aufmerksam, indem Sie sie auf diese Angelegenheit aufmerksam machen. Wenn Sie dringend ein sofortiges Upgrade von PHP durchführen müssen, sollten Sie vorerst die Unterdrückung von Verfallsfehlern in Betracht ziehen. Ermitteln Sie jedoch zunächst alle anderen Verfallsfehler, die ebenfalls auftreten geworfen.

    Regressionstests sind unbedingt erforderlich.

180
eggyal