Pourquoi on doit arrêter d'utiliser les fonctions mysql_* en PHP?

Quelles sont les raisons pour lesquelles on ne devrait pas utiliser les fonctions mysql_* ? (par exemple, mysql_query(), mysql_connect() ou mysql_real_escape_string()) ?

Pourquoi devrais-je utiliser autre chose même si elles fonctionnent sur mon site ?

Le fait qu’ils soient dépréciés est une raison suffisante pour les éviter. Elles n’existeront plus un jour, et vous ne serez pas heureux si vous comptez sur elles.

PHP offre trois API différentes pour se connecter à MySQL. Il s’agit de mysql (supprimée en PHP 7), mysqli, et PDO.

Les fonctions mysql_* étaient très populaires, mais leur utilisation n’est plus encouragée. L’équipe de documentation discute de la situation de la sécurité des bases de données, et éduquer les utilisateurs pour qu’ils abandonnent l’extension mysql.

L’équipe de développeurs PHP a pris la décision de générer des erreurs E_DEPRECATED lorsque les utilisateurs se connectent à MySQL, que ce soit via mysql_connect(), mysql_pconnect().

Raison de ne pas utiliser la fonction mysql_* :

  • Ne fait pas l’objet d’un développement actif
  • Supprimée à partir de PHP 7
  • Manque d’une interface orientée objet
  • Ne supporte pas les procédures stockées
  • Ne supporte pas toutes les fonctionnalités de MySQL 5.1
  • Ne supporte pas les transactions
  • Ne supporte pas les instructions préparées ou les requêtes paramétrées.
  • Ne supporte pas les requêtes non-bloquantes et asynchrones.
  • Ne supporte pas les instructions multiples

Les fonctions mysql_ :

  • sont obsolètes, elles ne sont plus maintenues
  • ne vous permettent pas de passer facilement à un autre SGBD
  • ne supportent pas les instructions préparées, ce qui encouragent les programmeurs à utiliser la concaténation pour construire des requêtes, ce qui entraîne des vulnérabilités d’injection SQL.

Les raisons sont nombreuses, mais la plus importante est peut-être que ces fonctions encouragent les pratiques de programmation non sécurisées car elles ne prennent pas en charge les instructions préparées. Les instructions préparées permettent d’éviter les attaques par injection SQL.

Lorsque vous utilisez les fonctions mysql_*, vous devez vous rappeler de faire passer les paramètres fournis par l’utilisateur à mysql_real_escape_string(). Si vous oubliez à utiliser cette fonction ou si vous n’échappez qu’une partie de l’entrée, votre base de données peut faire l’objet d’une attaque.

L’utilisation d’instructions préparées dans PDO ou mysqli rendra ce genre d’erreurs de programmation plus difficile à produire.