MySQL vs MySQLi lors de l'utilisation de PHP [fermé]

167

Quel est le meilleur, MySQL ou MySQLi? Et pourquoi? Lequel dois-je utiliser?

Je veux dire mieux non seulement en termes de performances, mais de toute autre fonctionnalité pertinente.

anand.trex
la source

Réponses:

111

Si vous jetez un œil à MySQL Improved Extension Overview , il devrait vous dire tout ce que vous devez savoir sur les différences entre les deux.

Les principales fonctionnalités utiles sont:

  • une interface orientée objet
  • prise en charge des déclarations préparées
  • prise en charge de plusieurs déclarations
  • support pour les transactions
  • capacités de débogage améliorées
  • prise en charge du serveur intégré.
Mark Davidson
la source
1
ouais, la meilleure chose est que mysqli prend en charge les déclarations préparées
jondinham
7
Il convient également de noter que MySQLi ne fonctionne qu'avec MySQL 5+. Ce n'est plus vraiment pertinent, mais quand MySQLi est sorti, MySQL 4 était toujours la norme. C'est en partie la raison pour laquelle les extensions sont séparées, l'ancien pilote MySQL y restant à des fins de compatibilité.
zneak
6
Il convient de noter que les choses ont beaucoup changé en six ans. mysql_*()est désormais obsolète et sera bientôt supprimé . Vous ne devriez pas l'utiliser pour un nouveau code.
Lequel devrions-nous choisir avec moins de CPU et de RAM?
Mahdi Jazini
1
Voir la réponse de Gordon ci-dessous. L'ancienne extension mysql n'est plus prise en charge, vous serez donc mieux d'utiliser l'extension mysqli de toute façon.
Mark Davidson
70

Il existe une page de manuel dédiée pour vous aider à choisir entre mysql, mysqli et PDO sur

L'équipe PHP recommande mysqli ou PDO_MySQL pour les nouveaux développements:

Il est recommandé d'utiliser les extensions mysqli ou PDO_MySQL. Il n'est pas recommandé d'utiliser l'ancienne extension mysql pour un nouveau développement. Une matrice de comparaison des fonctionnalités détaillée est fournie ci-dessous. Les performances globales des trois extensions sont considérées comme étant à peu près identiques. Bien que les performances de l'extension ne contribuent qu'à une fraction du temps d'exécution total d'une requête Web PHP. Souvent, l'impact est aussi faible que 0,1%.

La page dispose également d'une matrice de fonctionnalités comparant les API d'extension. Les principales différences entre mysqli et mysql API sont les suivantes:

                               mysqli     mysql
Development Status             Active     Maintenance only
Lifecycle                      Active     Long Term Deprecation Announced*
Recommended                    Yes        No
OOP API                        Yes        No
Asynchronous Queries           Yes        No
Server-Side Prep. Statements   Yes        No
Stored Procedures              Yes        No
Multiple Statements            Yes        No
Transactions                   Yes        No
MySQL 5.1+ functionality       Yes        No

* http://news.php.net/php.internals/53799

Il existe une matrice de fonctionnalités supplémentaire comparant les bibliothèques (nouveau mysqlnd versus libmysql) à

et un article de blog très complet sur

Gordon
la source
15

J'ai abandonné l'utilisation de mysqli. C'est tout simplement trop instable. J'ai eu des requêtes qui plantent PHP en utilisant mysqli mais fonctionnent très bien avec le package mysql. Aussi mysqli se bloque sur les colonnes LONGTEXT . Ce bogue a été soulevé sous diverses formes depuis au moins 2005 et reste cassé . Je voudrais honnêtement utiliser des déclarations préparées, mais mysqli n'est tout simplement pas assez fiable (et personne ne semble se soucier de le réparer). Si vous voulez vraiment des déclarations préparées, optez pour PDO.

cletus
la source
2
PDO n'est pas exactement parfait non plus (j'ai rencontré des coredumps désagréables avec lui), mais au moins il a une base d'utilisateurs plus large, donc c'est probablement un pari plus sûr.
troelskn le
@troelskn, alors mysql normal n'est-il pas juste meilleur?
Pacerier
@Pacerier Considérant qu'il est obsolète, je dirais non. En général, il semble que l'AOP soit devenu le choix standard.
troelskn
@troelskn, mais obsolète ne veut rien dire sauf qu'il ne serait pas là dans les versions futures. En termes de stabilité, le mysql normal n'est-il pas plus stable?
Pacerier
1
À ce stade (5.5) PHP émettra activement des avertissements si vous l'utilisez: php.net/manual/en/migration55.deprecated.php
troelskn
13

MySQLi signifie MySQL amélioré. C'est une interface orientée objet vers les liaisons MySQL qui rend les choses plus faciles à utiliser. Il offre également un support pour les instructions préparées (qui sont très utiles). Si vous utilisez PHP 5, utilisez MySQLi.

Ross
la source
5

Ce qui est mieux, c'est l'AOP; c'est une interface moins cruelle et fournit également les mêmes fonctionnalités que MySQLi.

L'utilisation d'instructions préparées est bonne car elle élimine les possibilités d'injection SQL; l'utilisation d'instructions préparées côté serveur est mauvaise car elle augmente le nombre d'aller-retour.

MarkR
la source
3

pour moi, les déclarations préparées sont une fonctionnalité incontournable. plus exactement, la liaison de paramètres (qui ne fonctionne que sur les instructions préparées). c'est la seule manière vraiment sensée d'insérer des chaînes dans des commandes SQL. Je ne fais vraiment pas confiance aux fonctions «échapper». la connexion DB est un protocole binaire, pourquoi utiliser un sous-protocole limité en ASCII pour les paramètres?

Javier
la source
1
PDO utilise généralement des instructions préparées côté client, donc elles ne sont pas vraiment préparées sur le serveur - mais c'est bien, car cela économise les ressources du serveur et fonctionne généralement mieux. L'instruction préparée "émulation" échappera toujours aux choses correctement.
MarkR
1
«toujours» et «échapper» sont des mots dangereux lorsqu'ils vont de pair. je ne sais pas, peut-être que ce code est totalement exempt de bogues; mais pourquoi s'embêter, quand un vrai protocole binaire est disponible? quant à la performance, elle est ouverte au benchmarking.
Javier