web-dev-qa-db-fra.com

PHP PDO vs mysql_connect normal

Devrais-je utiliser php PDO ou mysql_connect normal pour exécuter des requêtes de base de données en PHP?

Lequel est le plus rapide?

L'un des principaux avantages de PDO est que l'interface est cohérente sur plusieurs bases de données . Il existe également des fonctions intéressantes pour les instructions préparées, qui simplifient énormément la tâche d'échapper à toutes vos chaînes de requête. La portabilité de PDO est supérieure à mysql_connect.

Donc, devrais-je utiliser PDO pour ces raisons ou rester fidèle à mysql_connect?

46
Imrul

PDO est un peu plus lent que le mysql _ * Mais sa portabilité est excellente. PDO fournit une interface unique sur plusieurs bases de données. Cela signifie que vous pouvez utiliser plusieurs bases de données sans utiliser mysql_query pour mysql, mssql_query pour MS sql, etc. Utilisez simplement quelque chose comme $ db-> query ("INSERT INTO ...") toujours. Peu importe le pilote de base de données que vous utilisez.

Donc, pour un projet plus grand ou portable, PDO est préférable. Même le framework zend utilise PDO.

40
Sadi

Certains timings rapides indiquent que PDO est légèrement plus rapide à la connexion.

$start = microtime(true);
for($i=0; $i<10000; ++$i) {

    try {
        $db = new PDO($dsn, $user, $password);
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage()."\n";
    }
    $db = null;
}

$pdotime = microtime(true) - $start;
echo "PDO time: ".$pdotime."\n";

$start = microtime(true);
for($i=0; $i<10000; ++$i) {
    $db = mysql_connect($Host, $user, $password);
    if(!$db) {
        echo "Connection failed\n";
    }
    if(!mysql_select_db($schema, $db)) {
        echo "Error: ".mysql_error()."\n";
    }
    mysql_close($db);
}

$rawtime = microtime(true) - $start;
echo "Raw time: ".$rawtime."\n";

Donne des résultats comme 

PDO time: 0.77983117103577
Raw time: 0.8918719291687

PDO time: 0.7866849899292
Raw time: 0.8954758644104

PDO time: 0.77420806884766
Raw time: 0.90708494186401

PDO time: 0.77484893798828
Raw time: 0.90069103240967

La différence de vitesse sera de toute façon négligeable. établir une connexion réseau prendra probablement BEAUCOUP plus longtemps que tout temps système engendré par le PDO, en particulier si le serveur mysql est sur un autre hôte.

Vous avez mentionné toutes les raisons d'utiliser vous-même PDO. En réalité, n'utilisez jamais les fonctions mysql_ * directement, utilisez PDO, ou utilisez someotherlibrary .

17
gnud
  • Avec PDO, vous pouvez utiliser des paramètres liés qui empêcheront la plupart des attaques par injection SQL.
  • Vous pouvez gagner plus de temps en utilisant les instructions préparées par PDO.
  • interface standard pour tous les backends db
  • Il y a un tas de méthodes utiles (comme la famille fetch *)
11
Arklys

Je ne pense pas que la vitesse soit ce que les gens recherchent lorsqu'ils utilisent AOP - je ne sais pas s'il existe une différence, et honnêtement, je m'en fiche: tant que je pose quelques questions à une base de données lors de la génération d’une page, quelques millisecondes du côté PHP ne changeront rien.

Il y a deux/trois grandes choses avec PDO, par rapport à mysql_* :

  • Interface plus ou moins constante entre les bases de données; mieux que d'utiliser mysql_*, pg_*, oci_*, ...
  • API orientée objet ( mysqli_* a une API OO, mais pas mysql_*)
  • Prise en charge des nouvelles fonctionnalités de MySQL> = 4.1 (identique à mysqli_*, mais pas mysql_*, encore une fois)

BTW: J'utilise généralement PDO - soit "à la main", soit intégré dans/utilisé par Zend Framework et/ou Doctrine .


Comme note: Même si vous n’utilisez pas PDO, notez qu’il est recommandé d’utiliser mysqli au lieu de mysql.

Voir cette page du manuel PHP , à ce sujet.

11
Pascal MARTIN

J'ai effectué des tests de performance pour comparer les fonctions Mysqli aux fonctions PDO en utilisant à la fois des instructions préparées et des requêtes directes régulières (testées à l'aide d'instructions select sur les tables Mysqlnd et MyISAM). 

J'ai trouvé que les requêtes PDO sont légèrement plus lentes que Mysqli, mais seulement légèrement. Cela est logique puisque PDO utilisé à cette fin est principalement un wrapper qui appelle des fonctions Mysqli. L'utilisation de PDO présente l'avantage de faciliter la migration vers une base de données différente, car les noms de fonction ne sont pas spécifiques à MySQL.

La réelle différence de performances réside dans le fait que vous utilisiez des requêtes préparées. Il existe une performance importante et significative pénalité à l’utilisation de requêtes préparées. D'autres personnes qui les ont testées ont trouvé les mêmes résultats. 

Les requêtes préparées sont les plus rapides si vous la préparez une fois puis que vous la soumettez des milliers de fois avec différentes valeurs de données. Sinon, il est toujours plus rapide d'utiliser mysqli :: query () ou PDO :: query (). Mais il est important de savoir que ces fonctions n'échappent pas aux données, vous devez donc vous rappeler d'utiliser mysqli :: real_ escape_ string () ou PDO :: quote () sur les variables de données.

6
orrd

Je recommanderais généralement d’utiliser PDO sauf s’il existe une raison particulière pour laquelle vous ne pouvez pas. S'il n'y a pas une petite différence entre les deux et que vous n'avez aucune raison de ne pas utiliser PDO, je pense qu'il serait préférable de commencer à utiliser l'abstraction de base de données dans vos applications plutôt que d'utiliser mysql_ * simplement parce qu'il existe déjà. Je dirais que la meilleure pratique gagne.

4
Robert DeBoer
  • AOP est meilleur que SQL 
  • PDO et sa déclaration Prepare fournissent le meilleur code sécurisé contre l'injection SQL 
  • Le PDO est orienté objet;) 
  • PDO est compatible avec certains moteurs de bases de données, comme expliqué précédemment 
  • MySQLl_ * est obsolète et sera bientôt supprimé
  • PDO fournit plus de fonctionnalités avec moins de lignes de codes Exemple: 

    Pdo

    1. Relier 
    2. Recherchez "<" et ">" et "#" (cette vérification des utilisations globales) 
    3. Préparer 
    4. Exécuter 
    5. Fermer

MySQL_ *

  1. Relier 
  2. Ajouter une barre oblique inverse 
  3. Xsafe 
  4. Recherchez "<" et ">" et "#" (cette vérification des utilisations globales) 
  5. Question 
  6. Fermer

les deux la même fonctionnalité mais vous comparez pour les codes PDO est plus humainement lisible :). 

3
Jamil Hneini

Dans les deux cas, vous appelez le même serveur MySQL depuis le même serveur Php ... afin que vous ne remarquiez pas beaucoup de différence.

Si vous voulez de bonnes performances, pensez au cache (memcache ou fichier Php simple ...) et créez une bonne structure de base de données (INDEX ...)

3
Thomas Decaux

Si les performances ne sont pas un "vrai problème" pour vous, vous devez utiliser PDO. Les performances diffèrent par petites marges, et PDO possède une interface très agréable et portable, qui permet de gérer plusieurs bases de données, ce qui vous évite des soucis si vous devez utiliser plusieurs pilotes de base de données.

2
yoda

La fonction mysql_connect est obsolète à partir de PHP 5.5.0 et, comme pour la plupart des fonctionnalités obsolètes, sera supprimée. Par conséquent, préférez utiliser PDO_MySQL (ou une autre alternative MySQLi ) plutôt que mysql_connect.

Source: http://php.net/manual/en/function.mysql-connect.php

2
Czar Pino

Quelques avantages du PDO:

  1. Peut accéder à plusieurs bases de données.
  2. Fourni de nombreux pilotes de base de données pour se connecter avec différentes bases de données.
  3. Lorsque vous passez d'une base de données à une autre, vous n'avez pas besoin d'écrire tout le code pour vous connecter à la nouvelle base de données, il vous suffit de modifier la chaîne de connexion et les requêtes requises pour la nouvelle base de données.
  4. Il fournit une instruction prepare, qui est une sorte de modèle de requête compilée une seule fois et pouvant être exécutée autant de fois que vous le souhaitez, en modifiant simplement les attributs appelés emplacements réservés.
  5. Opération générale simple et efficace, comme insérer, mettre à jour, etc.
0
alex