169

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

非推奨:mysql拡張機能は非推奨であり、将来削除される予定です。代わりに、123行目の/path/to/filename.phpでmysqliまたはPDOを使用してください。

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

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

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

  1. なぜこうなった?

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

  3. 除外するように設定error_reportingすることで、非推奨エラーを抑制できることを理解しています。php.iniE_DEPRECATED

    error_reporting = E_ALL ^ E_DEPRECATED
    

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

4

1 に答える 1

185
  1. なぜこうなった?

    プレフィックスでext/mysql指定されたすべての関数を提供するPHP拡張機能全体は、PHP v5.5.0で正式に非推奨になり、PHPv7削除されましたmysql_

    もともとはPHPv2.0(1997年11月)でMySQL v3.20に導入され、2006年以降、新しい機能は追加されていません。新しい機能がないことと相まって、複雑なセキュリティの脆弱性の中でこのような古いコードを維持することは困難です。

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

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

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

    これらはわずかに異なりますが、トランザクションのAPIサポート、ストアドプロシージャ、プリペアドステートメントなどの古い拡張機能に比べて多くの利点があります(これにより、 SQLインジェクション攻撃を打ち負かすための最良の方法が提供されます)。PHP開発者のUlfWendelは、機能の徹底的な比較を作成しました。

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

  3. 除外するように設定error_reportingすることで、非推奨エラーを抑制できることを理解しています。php.iniE_DEPRECATED

    error_reporting = E_ALL ^ E_DEPRECATED
    

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

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

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


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

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

    使用する理由はまったくありませんext/mysql。代わりに、他のより現代的な拡​​張機能の1つを選択して、それらが提供するメリットのメリットを享受してください。

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

    回帰テストを実行することをお勧めします。影響の可能性のあるすべての領域を特定し、それぞれの周りで計画し、ステージング環境でソリューションを徹底的にテストするまで、実際には何も変更しないでください(特にPHPのアップグレード)。

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

      このモジュールを書き直して30分を費やし、他のより最新の拡張機能の1つを使用します。徹底的にテストします。後でさらに改良を加えて、それらが提供するメリットのメリットを享受することができます。

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

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

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

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

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

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

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

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

于 2012-12-19T03:11:43.407 に答える