web-dev-qa-db-fra.com

PHP PDO et MySQLi

Je viens de terminer un cours d'introduction à PHP, et tout au long du forum stackoverflow, les gens ont recommandé de passer à PDO, à des instructions préparées ou à MYSQLi, j'ai brièvement consulté le manuel, mais la majeure partie m'a dépassé.

J'utilise les fonctions mysql_ * jusqu'à présent, donc ces concepts sont nouveaux pour moi. Je pense qu'ils sont utilisés pour accéder et effectuer des actions spécifiques à la base de données, mais je ne suis pas sûr.

Alors, quelle est la différence entre PDO, instructions préparées et MySQLi, s'agit-il de fonctionnalités différentes qui accomplissent la même tâche? Sont-ils compatibles dans un script ou s'agit-il de "choisir l'un ou l'autre"? Et enfin qui offre les meilleures performances?

Mise à jour: Merci pour les réponses, je chercherai plus de tutoriels AOP.

Pour référence, j'ai également trouvé les messages suivants utiles:

Lequel est rapide et léger - mysqli ou PDO

mysqli ou PDO - quels sont les avantages et les inconvénients?

37
grasshopper

Au niveau de base, les extensions mysql, mysqli et PDO répondent toutes à la question comment parler à la base de données? Elles fournissent toutes des fonctions et des fonctionnalités pour se connecter à une base de données et envoyer et récupérer des données à partir de celle-ci . Vous pouvez tous les utiliser en même temps pour établir plusieurs connexions à la base de données à la fois, mais cela n'a généralement aucun sens.

mysql * est une extension très simple qui vous permet essentiellement de vous connecter à la base de données, de lui envoyer des requêtes SQL et pas grand chose d'autre.
mysqli améliore cela (comme son nom l'indique) en ajoutant des requêtes paramétrées et quelques autres choses dans le mix.
PDO est une extension qui résume plusieurs pilotes de base de données dans un seul package, c'est-à-dire qu'il vous permet d'utiliser le même code pour vous connecter à MySQL, Oracle, MS SQL Server et à un certain nombre d'autres bases de données sans avoir besoin d'utiliser des extensions spécifiques à la base de données ou réécrivez votre code lorsque vous changez de base de données (en théorie du moins). Il prend également en charge les requêtes paramétrées.

Si vous savez que vous allez utiliser exclusivement MySQL, mysqli est un bon choix. D'autant plus que vous pouvez l'utiliser de manière procédurale, ce à quoi vous êtes déjà habitué depuis l'extension mysql. Si vous n'êtes pas familier avec la POO, c'est utile. Sinon, PDO est un connecteur de base de données flexible et orienté objet.


* Notez que l'extension mysql est maintenant obsolète et sera supprimée dans le futur . C'est parce qu'il est ancien, plein de mauvaises pratiques et manque de fonctionnalités modernes. Ne l'utilisez pas pour écrire un nouveau code.

39
deceze

PDO est "l'objet de données PHP". J'utilise principalement PDO, donc je ne peux parler que de ses mérites:

  • Fonctionne pour beaucoup plus de bases de données que MySQL (peut ne pas vous intéresser)
  • Compilé C, donc c'est plus rapide (soi-disant)
  • Déclarations préparées (d'autres en ont cependant)
  • Il semble donc que ça vous plaise, donc vous pouvez probablement obtenir beaucoup d'aide ici au moins
  • Différents modes de récupération/gestion des erreurs que vous pouvez définir et modifier à la volée

Tu demandes

Alors, quelle est la différence entre PDO, instructions préparées et MySQLi ...

PDO et MySQLi sont des wrappers DB. Les "déclarations préparées" sont un tout autre concept. Vous pouvez préparer une requête qui peut être exécutée plusieurs fois, et les instructions correctement paramétrées sont sûres pour l'injection SQL (mais peut-être pas une preuve). Cette dernière raison est principalement la raison pour laquelle vous devriez utiliser PDO (ou MySQLi), mais les instructions préparées apportent également un niveau de clarté aux requêtes.

/* mysql_* version */
mysql_connect("Host");
$query = "SELECT column FROM db1.t1 WHERE id = ";
foreach ($_GET['id'] as $id) {
   $id = mysql_real_escape_string($id);
   $result = mysql_query($query . "'$id'";
   while ($row = mysql_fetch_assoc($result)) {
      echo "$row[column]\n";
   }
}
//NOTE: it would probably be better to store the resource returned by
//mysql_connect and use that consistently (in query/escape)

/* PDO version */
$pdo = new PDO('mysql:Host=HOST', 'user', 'pass');
$query = $pdo->prepare("SELECT column FROM db1.t1 WHERE id = ?";
foreach ($_GET['id'] as $id) {
   $query->execute($id);
   echo $query->fetch(PDO::FETCH_COLUMN);
}
//Notice that you skip the escape step.

Vous pouvez faire essentiellement la même chose avec MySQLi, mais je préfère la syntaxe de PDO. C'est peut-être plus rapide aussi, mais je pourrais inventer ça. Il y a aussi le PEAR MDB2 dont on parle rarement, et j'en suis sûr beaucoup plus. Puisque PDO est intégré, j'irais avec.

16
Explosion Pills

Si vous êtes habitué au mysql_xxx fonctions, je commencerais par passer à l'extension MySQLi à la place.

Vous pouvez utiliser PDO à la place si vous le souhaitez, mais cela ne vaut vraiment la peine que si vous devez commencer à prendre en charge plusieurs bases de données. Pour vos besoins, je vous suggère de passer à MySQLi, car cela sera plus facile pour vous, et vous ne bénéficierez pas immédiatement des avantages de PDO.

Les fonctions disponibles avec MySQLi sont à peu près analogues aux mysql_xx fonctions auxquelles vous êtes habitué; il est généralement possible de prendre le code existant, de faire un échange direct entre eux, et le code devrait continuer à fonctionner très bien.

C'est donc un bon point de départ - récupérez votre code en utilisant mysqli_xxx au lieu de mysql_xxx`.

Si possible, je recommanderais d'utiliser la syntaxe orientée objet plutôt que la syntaxe procédurale. MySQLi prend en charge les deux, et la syntaxe procédurale sera plus proche de ce à quoi vous êtes habitué, mais la syntaxe OO est plus flexible à long terme, et n'est vraiment pas très différente une fois que vous suis habitué.

Une fois que votre code est converti en utilisant la bibliothèque MySQLi et que vous êtes à l'aise avec les bases, vous êtes prêt à commencer à utiliser les fonctionnalités plus avancées telles que les instructions préparées. Mais familiarisez-vous d'abord avec les bases.

4
SDC

Un grand avantage de PDO est l'indépendance de la plate-forme. Cela signifie que vous pouvez migrer vers un autre SGBD à un moment donné sans avoir à recoder tous vos appels de fonction. C'est ainsi que les choses se font généralement dans Java (via JDBC), .Net (ADO) et la plupart des autres environnements. L'avantage n'est pas seulement que vous pouvez changer de SGBD en soi, c'est aussi que vous avoir une seule API à apprendre.

En ce qui concerne votre question, la couche AOP offre la possibilité de faire des déclarations préparées. L'idée derrière les instructions préparées est que vous créez des espaces réservés pour les parties de votre instruction SQL qui ne seront pas connues avant l'exécution. De nombreux apprenants commencent par créer SQL comme une chaîne qui s'exécute en appelant mysqli :: query ($ someQuery). Cela pose problème pour de nombreuses raisons, dont la plus importante est la vulnérabilité à l'injection SQL (voir stackoverflow.com/questions/5315351 pour une question et une réponse similaires). Avec PDO, vous pouvez éviter l'injection SQL et tous les problèmes de gestion des caractères tels que les guillemets, les barres obliques inverses, etc. Le résultat final est que votre code est plus sécurisé, lisible et prévisible.

Si vous avez déjà compris comment utiliser mysqli, l'utilisation de PDO n'est pas très différente. La question et la réponse liées ci-dessus montrent un exemple de requête soumise à l'aide d'instructions préparées par AOP qui devraient servir de guide utile.

1
PhilDin

Venant du même point de vue que vous. De mon point de vue, je ne pense pas que la différence soit vraiment perceptible (selon l'utilisation que vous en faites). Il semble que PDO soit simplement une API de base de données qui fusionne TOUTES les autres API de base de données en une seule. Donc, si vous aviez besoin de vous connecter à un serveur MS SQL et à un serveur MySQL, vous pouvez simplement appeler l'API PDO et spécifier le pilote pour la base de données spécifique. Je suppose également que toutes les fonctionnalités et capacités futures de MySQL seront uniquement disponibles dans PDO. Donc, utilisez simplement PDO pour vous assurer d'avoir accès à toutes les dernières fonctionnalités.

1
cDecker32