IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

PDO vs MySQLI [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 431
    Points : 43 057
    Points
    43 057
    Par défaut PDO vs MySQLI
    Bonjour,

    Je vais avoir un petit projet PHP à faire. J'ai déjà fait un peu de PHP mais il y a un moment, à l'époque de mysql_connect et cie.

    Comme je sais que mysql_connect est déprécié, je dois me tourner vers PDO ou MySQLI. Lequel me conseilleriez-vous ? (avantages/inconvénients des deux).

    Et du coup, ou faut-il faire gaffe niveau sécurité ? (injection SQL, protections des variables de session).

    Merci pour vos retours.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    En mon sens, mysqli existe essentiellement pour remplacer l'api mysql dans des applis existantes. Donc si tu démarres une nouvelle application, mieux vaut utiliser directement PDO.
    Je trouve la structure des fonctions et surtout le passage de paramètres aux requêtes préparées beaucoup plus intuitif avec PDO qu'avec mysqli : le fait de pouvoir envoyer un tableau de paramètres à la fonction execute sans passer par trouze-mille fonctions bindParam ou bindValue est hautement appréciable.

    Au niveau sécurité et notamment injections SQL, le principe de base reste valable : on ne met jamais des valeurs en provenance de l'extérieur directement dans une requête.
    Avec mysqli, il ya la fonction mysqli_real_escape_string, équivalent de mysql_escape_string. Mais surtout il y a les requêtes préparées : tu mets des marque-places à la place des valeurs de paramètres, tu passes les paramètres à l'exécution et pouf! PDO (ou mysqli) se charge de faire les échappements pour toi.

    Evidemment, le but originel des requêtes préparées est de pouvoir ré-exécuter la même requête avec des valeurs différentes (très pratique pour les insertions en masses), mais ça sert beaucoup pour gérer les échappements.

    A lire sur le sujet : Comprendre PDO, avec de jolis extraits de code qui compare l'ancienne syntaxe mysql, PDO et mysqli.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Pour la comparaison de fonctionnalité, tu peux voir ici: http://php.net/manual/fr/mysqlinfo.api.choosing.php

    A+.

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Je confirme tous les points évoqués par Celira en ajoutant qu'en plus d'être beaucoup plus pratique - la possibilité de passer un tableau dans la fonction execute() est un avantage considérable - PDO est aussi beaucoup plus agréable à écrire : fini les noms de fonctions à rallonge. Donc y'a pas vraiment de question à se poser, mysqli est pratique pour mettre à jour un ancien site, mais pour les nouveaux c'est PDO sans hésitation. Plus facile aussi pour changer de sgbdd si besoin et tous les nouveaux exemples de codes sur le web sont maintenant écrits avec PDO donc bon y'a pas photo. Niveau expérience, j'ai utilisé les deux et jamais je ne reviendrai vers mysli tant que j'ai le choix.

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Citation Envoyé par ABCIWEB Voir le message
    Plus facile aussi pour changer de sgbdd si besoin
    à condition de ne pas utiliser de syntaxe spécifique dans les requêtes.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par Celira Voir le message
    à condition de ne pas utiliser de syntaxe spécifique dans les requêtes.
    Dans ce cas effectivement le code sera entièrement compatible sans besoin de faire quasiment aucune modification. Mais même sans cette condition, il n'y aurait que ces requêtes spécifiques à réécrire, alors qu'avec mysqli il faudrait réécrire tout le code. Pour dire que dans tous les cas PDO facilite les migrations

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Pour ajouter à ce qui a déà été dit:
    - PDO permet d'utiliser des paramètres nommées à la place du placeholder "?"
    - PDO permet de récupérer les résultats sous différents formats avec fetchAll: tableau indexé, tableau assocatif, colonne, objet, groupés par un champ, ou même filtrés par une fonction.
    - et le plus important: PDO est devenu une sorte de standard adopté par défaut par la communauté. Après des années à parcourir github, je ne me souviens pas d'un seul repository qui utilise mysqli. Bien sûr qu'il y en a, mais la quantité est rès inférieure à PDO.

  8. #8
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 431
    Points : 43 057
    Points
    43 057
    Par défaut
    Merci à tous pour vos retours. Je vais jeter un oeil à tout ça.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  9. #9
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 431
    Points : 43 057
    Points
    43 057
    Par défaut
    J'ai parcouru en diagonale le tuto indiqué. Explicite.

    Si j'ai bien compris, en faisant une requête préparée, l’échappement se fait tout seul et me protège des injections SQL, ce qui n'est pas le cas avec une requête de type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $query = 'SELECT * FROM foo WHERE bar=1;';
    $arr = $pdo->query($query)->fetch();
    c'est bien ça ?
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Avec une préparation, il n'y a pas d'echappement. Les paramètres sont traités indépendamment de la requête.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #11
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Cela dit les injections sql ne sont possibles que si la requête contient des variables utilisateur. Dans ton exemple ce n'est pas les cas et de plus elle ne nécessite pas d'échappement donc elle est correcte (et sécurisée) en l'état.

    Au besoin il y a la fonction quote de pdo pour échapper des variables dans des requêtes non préparées. On s'en sert aujourd'hui très peu étant donné que, comme l'indique le manuel, le système de cache permet un temps d'exécution plus rapide avec des requêtes préparées dès que la requête dépend d'une variable.

    Il y a quelques années le bilan était moins favorable en terme de rapidité si bien qu'on pouvait trouver un intérêt à n'utiliser les requêtes préparées que pour celles incluant des entrées utilisateur (pour un gain en sécurité) et les requêtes multiples (pour un gain en rapidité).

    Aujourd'hui en pratique l'utilisation des requêtes préparées s'est généralisée à toutes les requêtes incluant des variables. Cela permet d'uniformiser la syntaxe en même temps que d'offrir systématiquement un maximum de sécurité.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PDO] MySqli vers Pdo
    Par okoweb dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/05/2010, 21h08
  2. [MySQL] Avis entre PDO et MYSQLI
    Par saebakun dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 11/12/2008, 14h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo