web-dev-qa-db-fra.com

L'extension mysql est obsolète et sera supprimée à l'avenir: utilisez plutôt mysqli ou PDO

Lorsque j'essaie de me connecter à un serveur MySQL à partir de PHP, l'erreur suivante apparaît:

Obsolète: L'extension mysql est obsolète et sera supprimée à l'avenir: utilisez mysqli ou PDO à la place dans /path/to/nom_fichier.php à la ligne 123

Le code sur la ligne référencée est:

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

Je suis certain que les arguments sont corrects et que ce code exact fonctionne depuis des années sans problème. En effet, je l'ai obtenu à partir d'un tutoriel bien PHP sur PHP.

  1. Pourquoi cela arrive-t-il?

  2. Comment puis-je le réparer?

  3. Je comprends qu’il est possible de supprimer les erreurs de dépréciation en définissant error_reporting dans php.ini pour exclure E_DEPRECATED:

    error_reporting = E_ALL ^ E_DEPRECATED
    

    Que se passera-t-il si je fais ça?

164
eggyal
  1. Pourquoi cela arrive-t-il?

    Toute l'extension ext/mysql PHP, qui fournit toutes les fonctions portant le préfixe mysql_, était officiellement déconseillée dans PHP v5.5. = et supprimé dans PHP v7 .

    Il a été introduit à l'origine dans PHP v2.0 (novembre 1997) pour MySQL v3.20, et aucune nouvelle fonctionnalité n'a été ajoutée depuis 2006. De plus, le manque de nouvelles fonctionnalités complique la gestion du vulnérabilités de sécurité complexes.

    Le manuel contient des avertissements contre son utilisation dans le nouveau code depuis juin 2011.

  2. Comment puis-je le réparer?

    Comme le message d'erreur le suggère, vous pouvez envisager deux autres extensions MySQL: MySQLi et PDO_MySQL , qui peuvent être utilisés à la place de ext/mysql. Les deux font partie de PHP core depuis la version 5.0. Par conséquent, si vous utilisez une version générant ces erreurs de dépréciation, vous pouvez certainement commencer à les utiliser tout de suite, c'est-à-dire. sans aucun effort d'installation.

    Elles diffèrent légèrement, mais offrent un certain nombre d'avantages par rapport à l'ancienne extension, notamment le support des API pour les transactions, les procédures stockées et les instructions préparées (fournissant ainsi la meilleure façon de vaincre attaques par injection SQL ). PHP le développeur Ulf Wendel a écrit comparaison approfondie des fonctionnalités .

    Hashphp.org a un excellent tutoriel sur la migration de ext/mysql vers PDO .

  3. Je comprends qu’il est possible de supprimer les erreurs de dépréciation en définissant error_reporting dans php.ini pour exclure E_DEPRECATED:

    error_reporting = E_ALL ^ E_DEPRECATED
    

    Que se passera-t-il si je fais ça?

    Oui, il est possible de supprimer ces messages d'erreur et de continuer à utiliser l'ancienne extension ext/mysql pour le moment. Mais vous ne devriez vraiment pas faire cela - ceci est un dernier avertissement des développeurs que l'extension ne sera peut-être pas fournie avec les futures versions de PHP (en effet, comme déjà mentionné, il a été supprimé de PHP v7). Au lieu de cela, vous devriez saisir cette opportunité pour migrer votre application maintenant , avant qu'il ne soit trop tard.

    Notez également que cette technique supprime tous les messages E_DEPRECATED, et pas uniquement ceux liés à l'extension ext/mysql: vous risquez donc de ne pas être au courant des autres changements à venir. à PHP qui affecterait votre code d'application. Il est bien entendu possible de ne supprimer que les erreurs survenant dans l'expression en question en utilisant PHP opérateur de contrôle d'erreur - i.e. faire précéder la ligne concernée de @— mais cela supprimera toutes les erreurs générées par cette expression, et pas seulement E_DEPRECATED.


Que devrais tu faire?

  • Vous commencez un nouveau projet.

    Il n'y a absolument aucune raison d'utiliser ext/mysql— choisissez l'une des autres extensions, plus modernes, à la place, et récoltez les fruits des avantages qu'elles offrent.

  • Vous avez (votre propre) base de code existante qui dépend actuellement de ext/mysql.

    Il serait sage d'effectuer des tests de régression: vous ne devriez vraiment rien changer (surtout en mettant à niveau PHP) tant que vous n'avez pas identifié tous les domaines d'impact potentiels, planifiés autour de chacun de ces domaines. puis testez minutieusement votre solution dans un environnement de transfert.

    • Conformément aux bonnes pratiques de codage, votre application a été développée de manière modulaire et intégrée et les méthodes d'accès à la base de données sont toutes autonomes au même endroit et peuvent facilement être échangées contre l'une des nouvelles extensions. .

      Passez une demi-heure à réécrire ce module pour utiliser l’une des autres extensions, plus modernes; tester à fond. Vous pouvez ultérieurement apporter d'autres améliorations pour récolter les fruits des avantages offerts.

    • Les méthodes d'accès à la base de données sont dispersées et ne peuvent pas être facilement échangées contre l'une des nouvelles extensions.

      Déterminez si vous devez réellement mettre à niveau vers PHP v5.5 pour le moment.

      Vous devriez commencer à planifier le remplacement de ext/mysql par l’une des autres extensions, plus modernes, afin de pouvoir profiter des avantages qu’elles offrent; vous pouvez également l'utiliser comme une opportunité de reformuler vos méthodes d'accès à la base de données dans une structure plus modulaire.

      Toutefois, si vous avez un urgent à mettre à niveau immédiatement PHP, vous pouvez envisager de supprimer les erreurs de dépréciation pour le moment: mais commencez par identifier d'autres erreurs de dépréciation qui sont également générées.

  • Vous utilisez un projet tiers qui dépend de ext/mysql.

    Déterminez si vous devez réellement mettre à niveau vers PHP v5.5 pour le moment.

    Vérifiez si le développeur a publié des correctifs, des solutions de contournement ou des conseils en relation avec ce problème spécifique. ou, sinon, faites pression sur eux pour qu'ils le fassent en portant cette question à leur attention. Si vous avez un urgent à mettre à niveau immédiatement PHP, vous pouvez envisager de supprimer les erreurs de désapprobation pour le moment: mais assurez-vous d'abord d'identifier toute autre dépréciation des erreurs qui sont également lancées.

    Il est absolument essentiel d'effectuer des tests de régression.

180
eggyal