PHP 5.5 déprécie Mysql

Ca y est ! la version 5.5 de PHP qui est actuellement en version alpha jusque jeudi a marqué l’API Mysql qui commençait à dater comme dépréciée.

Cela signifie que désormais, à chaque appel de mysql_connect (ou de son équivalent pour les connexions persistantes) un WARNING vous sera envoyé vous conseillant de passer à Mysqli ou PDO. Si vous ne l’avez pas déjà fait, il n’est pas trop tard, et je vais vous rappeler (ou du moins vous présenter) quelques bonnes raisons de ce passage :

La sécurité

On ne vous le dira jamais assez, mysqli et PDO sont plus sécurisés. Pas simplement parce qu’ils proposent les requêtes préparées, qui sont naturellement “sécurisées” (à condition qu’on sache s’en servir) mais aussi parce que l’un comme l’autre corrigent les failles de mysql_ en ce qui concernent l’encodage, les connexions persistantes etc. Cela impliques quelques règles à respecter :

  • Il est obligatoire de donner la ressource de connexion à chaque fonction qu’on appelle. La POO simplifie cela puisque la méthode est liée au $this. Par contre le style procédural permis par mysqli_ vous oblige à écrire par exemple :[cc lang=”php”]$query = mysqli_query($connexion,’SELECT * FROM yourtable’);
    $result = mysqli_fetch_all($query);[/cc]
  • Sauf pour les requêtes dont vous savez qu’elles n’utilisent pas de paramètres, utilisez la fonction prepare. Attention néanmoins mysqli_ et PDO n’utilisent pas cette fonction de la même manière. PDO a deux grands avantages sur MySQLi en ce qui concerne les requêtes préparées : il permet des paramètres nommés et il permet de lier une valeur plutôt qu’une variable. Enfin pour PDO aller chercher le résultat d’une requête “normale” ou d’une requête préparée c’est la même chose donc les méthodes fetchAll et fetch existeront. Pour mysqli seul fetch existera et encore, il fonctionnera d’une autre manière que le fetch d’une requête normale.
    • Exemple de requête préparée avec PDO : [cc lang=”php”]$pdo = new PDO(‘yourDSN’,’user’,’pw’);
      $prep = $pdo->prepare(‘SELECT * FROM yourtable WHERE yourcol=:yourcol’);
      $prep->bindValue(‘yourcol’,"une chaîne avec des c’haractères embêt@nts’");
      $prep->execute();
      $result= $prep->fetchAll(PDO::FETCH_ASSOC);[/cc]
    • Exemple de requête préparée avec MySQLi :[cc lang=”php”]$mysqli = new mysqli(‘yourhost’,’user’,’pw’,’db’);
      $prep = $mysqli->prepare(‘SELECT * FROM yourtable WHERE yourcol=?’);
      $var = "une chaîne avec des c’haractères embêt@nts’",
      $prep->bindParam(‘s’,$var);
      $prep->bindResult($col1,$col2,$col3);//les résultats de chaque colonnes seront mis dans les variables associés
      $prep->execute();
      while($prep->fetch()){
      $result[] = array($col1,$col2,$col3);
      }[/cc]

     

Les fonctionnalités

L’ancienne API est ancienne et n’a pas été mise à jour avec Mysql 5 donc contrairement à PDO et mysqli elle ne pourra pas tout faire.
Au programme : requêtes multiples, support amélioré des transaction, support amélioré des conexions persistantes…

Migrer? mais comment?

En utilisant l’outil développé par Oracle.
En allant chercher quelques infos sur stackoverflow.

Leave a Reply

Your email address will not be published. Required fields are marked *