web-dev-qa-db-ja.com

Mysql拡張モジュールは推奨されておらず、将来削除される予定です。代わりにmysqliまたはPDOを使用してください。

PHPからMySQLサーバーに接続しようとすると、次のエラーが表示されます。

廃止予定:mysql拡張モジュールは廃止予定であり、将来削除される予定です。代わりに123行目の/path/to/filename.phpでmysqliまたはPDOを使用してください。

参照行のコードは次のとおりです。

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

私は議論が正しいことを確信しています、そしてこの正確なコードは何年も問題なく機能してきました。確かに、私はPHPに関する十分な情報を得たチュートリアルから入手しました。

  1. なんでこんなことが起こっているの?

  2. どうすれば修正できますか?

  3. error_reportingphp.iniを設定してE_DEPRECATEDを除外することで、非推奨エラーを抑制することが可能であることを理解しています。

    error_reporting = E_ALL ^ E_DEPRECATED
    

    そうすればどうなりますか?

162
eggyal
  1. なんでこんなことが起こっているの?

    ext/mysql PHP拡張機能全体は、接頭辞mysql_で名前が付けられたすべての機能を提供しますが、 PHP v5.5.0で正式に非推奨 =および PHP v7で削除

    もともとは、MySQL v3.20のPHP v2.0(1997年11月)で導入されたもので、2006年以降、新しい機能は追加されていません。複雑なセキュリティの脆弱性。

    このマニュアルには、2011年6月以降の新しいコードでの使用に対する警告が含まれています。

  2. どうすれば修正できますか?

    エラーメッセージが示唆するように、考慮することができる他の2つのMySQL拡張があります: MySQLi および PDO_MySQL 、どちらもext/mysqlの代わりに使用できます。両方ともv5.0以降PHPコアにあるため、これらの非推奨エラーをスローしているバージョンを使用している場合、ほぼ確実にすぐに使用を開始できます。インストール作業なし。

    それらはわずかに異なりますが、トランザクション、ストアドプロシージャ、準備されたステートメントのAPIサポートを含む古い拡張よりも多くの利点を提供します(それにより 最善の方法 を打ち負かす SQLインジェクション攻撃 )。 PHP開発者Ulf Wendelは 機能の徹底的な比較 と書いています。

    Hashphp.orgには ext/mysqlからPDOへの移行に関する優れたチュートリアル があります。

  3. error_reportingphp.iniを設定してE_DEPRECATEDを除外することにより、非推奨エラーを抑制することができることを理解しています。

    error_reporting = E_ALL ^ E_DEPRECATED
    

    それをするとどうなりますか?

    はい、そのようなエラーメッセージを抑制し、しばらくの間、古いext/mysql拡張を引き続き使用することができます。しかし、これを実際に行うべきではありません—これは、拡張機能がPHP(実際、既に述べたように、PHP v7から削除されました)。代わりに、この機会を利用して、手遅れになる前にアプリケーションnowを移行する必要があります。

    また、この手法は、E_DEPRECATED拡張機能に関連するメッセージだけでなく、allext/mysqlメッセージを抑制することにも注意してください。したがって、他の今後の変更に気付かない可能性がありますアプリケーションコードに影響するPHPへ。もちろん、PHPの エラー制御演算子 — i.eを使用して、問題の式で発生するエラーのみを抑制することができます。関連する行の前に@を追加します。ただし、これは、E_DEPRECATEDだけでなく、その式によって発生したallエラーを抑制します。


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

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

    絶対に理由はありませんext/mysqlを使用します。代わりに、より現代的な他の拡張機能のいずれかを選択し、それらが提供する利点の恩恵を享受します。

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

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

    • 優れたコーディングプラクティスに従って、アプリケーションは疎結合/モジュール方式で開発され、データベースアクセス方法はすべて、新しい拡張機能の1つに簡単に交換できる自己完結型です。 。

      このモジュールを30分かけて書き直して、他の最新の拡張機能のいずれかを使用します。徹底的にテストします。後でさらに改良を加えて、提供するメリットの報酬を得ることができます。

    • データベースアクセス方法はいたるところに散らばっており、新しい拡張機能の1つに簡単に交換することはできません。

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

      ext/mysqlを他のより拡張された拡張機能の1つに置き換えて、それらが提供する利点の恩恵を享受できるようにする計画を開始する必要があります。データベースアクセス方法をよりモジュール化された構造にリファクタリングする機会として使用することもできます。

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

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

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

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

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

180
eggyal