Migrer du code PHP de mysql à mysqli

closeCet article a été publié il y a 10 ans 10 mois 27 jours, il est donc possible qu’il ne soit plus à jour. Les informations proposées sont donc peut-être expirées.

phpmysqlCa faisait un moment que je devais le faire. Mais la peur de tout planter pendant trop longtemps m’en empêchait.
Finalement, ça s’est fait en une heure, en comprenant le temps d’analyse et de compréhension de l’outil-qui-va-bien.
Mais de quoi je parle ?
Je parle du fait que tout le monde utilise l’API « mysql » de PHP – historiquement et par habitude – pour taper dans une base MySQL alors que celle-ci est obsolète depuis un paquet de temps. Il faut utiliser sa remplaçante « mysqli ».
C’est décrit ici chez PHP.net

En très très gros, il suffit de remplacer les fonctions mysql_quelque_chose() par mysqli_quelque_chose() et d’indiquer l’identifiant de connexion en premier plutôt qu’en dernier argument.
C’est bête, mais ça peut être long à faire sans faute.

Il y a donc un outil bien réalisé pour le faire automatiquement, tout en pouvant simuler les modifs de code. Il est fourni chez Oracle.
Son interface graphique, pratique en première approche, ne m’affichait pas le bilan des modifs pour tous les fichiers. Je ne sais pas pourquoi, et j’en suis donc rapidement venu à exécuter le mode client texte sur chaque fichier que j’avais besoin de migrer.
Les options permettent dans un premier temps de ne voir que les warnings/erreurs.

MySQLConverterTool
MySQLConverterTool

Dans mon cas, j’ai dû faire une passe de propre sur mysql_real_escape_string où je n’indiquais aucune connexion (paramètre optionnel). Du coup l’outil me blindait mon code avec des trucs imbuvables. Conclusion, il vaut mieux parfois vérifier la définition de l’ancienne fonction, faire propre, puis tenter une conversion.

Attention, les permissions sur vos fichiers peuvent s’en trouver modifiées, ce qui peut poser des problèmes.

2 comments

  1. Bonjour
    Je viens de passer l’outil sur un de mes repertoires, et je remarque que le converter a modifie de la sorte :
    AVANT CONVERSION :

    $result = mysql_query($sql) or die(mysql_error());
    if(mysql_num_rows($result))

    APRES CONVERSION:

    $result = mysqli_query($GLOBALS[« ___mysqli_ston »], $sql) or die(((is_object($GLOBALS[« ___mysqli_ston »])) ? mysqli_error($GLOBALS[« ___mysqli_ston »]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)));
    if(mysqli_num_rows($result))

    C’est quoi tous ces $GLOBALS ??

    Merci
    S@ndy

    1. Salut
      J’avais des choses assez similaires à certains endroits mais pas partout. De mémoire, c’était lorsque l’analyseur n’arrivait pas à s’assurer suivant ce qui précède que la connexion était bien ouverte à tel endroit du code (genre peut-être lorsqu’on utilisait une variable de connexion au milieu d’une fonction et qu’il n’était pas capable de s’assurer qu’on appelait cette fonction uniquement après avoir ouvert la connexion). Et donc il blindait son code pour dire un truc genre « j’exécute sauf que si ça ne passe pas alors je gère telle erreur ».
      Au final j’ai gardé ces codes en commentaires et j’ai simplifié lorsque j’étais sur de mon coup. Afin de n’avoir que mysqli_query($maconnx,$monsql);

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.