The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead [duplicate] Ask Question

The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead [duplicate] Ask Question

When I attempt to connect to a MySQL server from PHP, I see the following error:

Deprecated: The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /path/to/filename.php on line 123

The code on the referenced line is:

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

I am certain that the arguments are correct, and this exact code has been working for years without problem. Indeed, I obtained it from a well-sourced tutorial on PHP.

  1. Why is this happening?

  2. How can I fix it?

  3. I understand that it's possible to suppress deprecation errors by setting error_reporting in php.ini to exclude E_DEPRECATED:

    error_reporting = E_ALL ^ E_DEPRECATED
    

    What will happen if I do that?

ベストアンサー1

  1. Why is this happening?

    The entire ext/mysql PHP extension, which provides all functions named with the prefix mysql_, was officially deprecated in PHP v5.5.0 and removed in PHP v7.

    It was originally introduced in PHP v2.0 (November 1997) for MySQL v3.20, and no new features have been added since 2006. Coupled with the lack of new features are difficulties in maintaining such old code amidst complex security vulnerabilities.

    The manual has contained warnings against its use in new code since June 2011.

  2. How can I fix it?

    As the error message suggests, there are two other MySQL extensions that you can consider: MySQLi and PDO_MySQL, either of which can be used instead of ext/mysql. Both have been in PHP core since v5.0, so if you're using a version that is throwing these deprecation errors then you can almost certainly just start using them right away—i.e. without any installation effort.

    これらは若干異なりますが、トランザクション、ストアドプロシージャ、プリペアドステートメントのAPIサポートなど、古い拡張機能に比べて多くの利点があります(これにより、一番いい方法負かすSQLインジェクション攻撃PHP開発者のUlf Wendelは次のように書いています。機能の徹底的な比較

    Hashphp.orgにはext/mysqlPDOへの移行に関する優れたチュートリアル

  3. を exclude に設定error_reportingすることで非推奨エラーを抑制できると理解しています:php.iniE_DEPRECATED

    error_reporting = E_ALL ^ E_DEPRECATED
    

    そうすると何が起こるでしょうか?

    ext/mysqlはい、そのようなエラーメッセージを抑制して、当面は古い拡張機能を使い続けることは可能です。しかし本当にそんなことはしないほうがいいこれは、この拡張機能がPHPの将来のバージョンにバンドルされない可能性があるという開発者からの最終警告です(実際、すでに述べたように、PHP v7では削除されています)。代わりに、この機会を利用してアプリケーションを移行する必要があります。手遅れになる前に。

    また、この技術は全て E_DEPRECATEDメッセージは拡張機能に関するものだけでなくext/mysql、PHP の他の変更点も含まれているため、アプリケーションコードに影響する可能性のある変更点に気付かない可能性があります。もちろん、PHP のエラー制御演算子—つまり、関連する行の先頭に@—ただし、これにより抑制されます全てその式によって発生したエラー(E_DEPRECATEDエラーだけではありません)


あなたは何をするべきか?

  • 新しいプロジェクトを開始しています。

    がある全く理由がない代わりにext/mysql、他のより現代的な拡​​張機能のいずれかを選択して、それらが提供するメリットを享受してください。

  • 現在 に依存している (独自の) レガシー コードベースがありますext/mysql

    回帰テストを実行するのが賢明です。変更すべきではありません。何でも(特に PHP のアップグレード) 影響を受ける可能性のあるすべての領域を特定し、それぞれについて計画を立て、ステージング環境でソリューションを徹底的にテストするまで、作業は継続します。

    • 適切なコーディング方法に従って、アプリケーションは緩やかに統合/モジュール化された形式で開発され、データベース アクセス メソッドはすべて 1 か所に自己完結型になっており、新しい拡張機能の 1 つに簡単に交換できます。

      このモジュールを 30 分ほどかけて書き直し、他のより新しい拡張機能のいずれかを使用して徹底的にテストします。後でさらに改良を加えて、その利点を享受することができます。

    • データベース アクセス メソッドはさまざまな場所に分散しており、新しい拡張機能の 1 つに簡単に交換することはできません。

      現時点で PHP v5.5 にアップグレードする必要があるかどうかを検討してください。

      他のより新しい拡張機能のいずれかに置き換える計画を立て始めるext/mysqlと、拡張機能が提供するメリットを享受できるようになります。また、これを機会に、データベース アクセス メソッドをよりモジュール化された構造にリファクタリングすることもできます。

      ただし、緊急PHP をすぐにアップグレードする必要がある場合は、当面は非推奨エラーを抑制することを検討してください。ただし、最初に、他にスローされている非推奨エラーを必ず特定してください。

  • に依存するサードパーティ プロジェクトを使用していますext/mysql

    現時点で PHP v5.5 にアップグレードする必要があるかどうかを検討してください。

    開発者がこの特定の問題に関して修正、回避策、ガイダンスをリリースしているかどうかを確認します。リリースしていない場合は、この問題を開発者に報告して、リリースするよう圧力をかけます。緊急PHP をすぐにアップグレードする必要がある場合は、当面は非推奨エラーを抑制することを検討してください。ただし、最初に、他にスローされている非推奨エラーを必ず特定してください。

    回帰テストを実行することは絶対に不可欠です。

おすすめ記事