web-dev-qa-db-fra.com

Puis-je remplacer aveuglément toutes les fonctions mysql par mysqli?

J'ai utilisé mysql_query() tout au long de mon projet; mais je viens d'apprendre que mysql_ était obsolète depuis PHP 5.5, a été supprimé dans PHP 7.

Donc, je voudrais savoir si je peux remplacer aveuglément toutes les fonctions mysql_ Par mysqli_ Dans mon projet? Par exemple, il suffit de remplacer mysql_query() par mysqli_query(). Y a-t-il un effet négatif?

25
Midnight Engineer

La réponse courte est non , les fonctions ne sont pas équivalentes.

La bonne nouvelle est qu'il existe un outil de conversion qui vous aidera si vous avez beaucoup d'appels/projets à modifier. Cela permettra à vos scripts de fonctionner immédiatement.

https://github.com/philip/MySQLConverterTool

C'est une version fourchue de la version originale d'Oracle, et c'est casher.

Cela dit, il n'est pas trop difficile de mettre à jour votre code, et vous voudrez peut-être quand même migrer vers une méthodologie orientée objet ...

1) La connexion

À toutes fins utiles, vous avez besoin d'une nouvelle fonction de connexion qui enregistre la connexion en tant que variable PHP, par exemple;

$mysqli = new mysqli($Host,$username,$password,$database);

Notez que j'ai enregistré la connexion à $mysqli. Vous pouvez enregistrer dans $db ou ce que vous voulez, mais vous devez l'utiliser dans tout votre code pour référencer la connexion.

N'oubliez pas de vérifier une erreur de connexion;

if ($mysqli->connect_errno) echo "Error - Failed to connect to MySQL: " . $mysqli->connect_error;

2) La requête

Remarque: Vous devez vous protéger contre l'injection SQL avec des instructions préparées, qui sont disponibles dans MySQLi. Jetez un oeil à Comment puis-je empêcher l'injection SQL en PHP? , mais je vais juste couvrir les bases ici.

Vous devez maintenant inclure la connexion comme argument dans votre requête, et les autres mysqli_ les fonctions. Dans le code procédural, c'est le premier argument, dans OO vous l'écrivez comme une méthode de classe;

De procédure:

$result = mysqli_query($mysqli,$sql);

OO:

$result = $mysqli->query($sql);

3) Résultat d'extraction

La récupération du résultat est similaire à l'ancien mysql_ fonction en procédural;

while($row = mysqli_fetch_assoc($result))

mais comme $result est maintenant un objet dans mysqli, vous pouvez utiliser l'appel de fonction objet;

while($row = $result->fetch_assoc())

4) Fermer la connexion

Comme précédemment, vous devez inclure la connexion dans la fonction close; comme argument de procédure;

mysqli_close($mysqli);

et en tant qu'objet sur lequel vous exécutez la fonction dans OO;

$mysqli->close();

Je serais ici pour toujours si je les parcourais tous, mais vous voyez l'idée. Jetez un œil à la documentation pour plus d'informations. N'oubliez pas de convertir toutes les fonctions de fermeture de connexion, de libération de résultat ou de comptage d'erreurs et de lignes dont vous disposez.

La règle de base est pour les fonctions qui utilisent la connexion à la base de données, vous devez l'inclure maintenant dans la fonction (soit comme premier argument dans la procédure, soit comme objet que vous utilisez pour appeler la fonction dans OO), ou pour un jeu de résultats vous pouvez simplement changer la fonction en mysqli_ ou utilisez le jeu de résultats comme objet.

41
worldofjr

Si vous ne pouvez pas convertir tous les appels aux fonctions mysqli sur un ancien projet, vous pouvez installer et inclure la bibliothèque php7-mysql-shim .

Il essaiera de créer un remplacement transparent pour mysql sur PHP 7 utilisant mysqli. Évidemment, les performances sont plus lentes, mais c'est une solution pour contourner le problème en quelques minutes. Vous pouvez inclure en toute sécurité la bibliothèque dans les projets fonctionnant avec PHP 5.6 (il sera ignoré).

if (defined('PHP_VERSION_ID') && (PHP_VERSION_ID >= 50600)) { require_once "mysql-shim.php"; }
7
MiguelR

Tu ne peux pas. certaines fonctions de mysql et mysqli nécessitent des paramètres différents. Vous devez donc savoir lequel utilisera les mêmes paramètres.

2
mokh223