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 :

Première requête PDO


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2011
    Messages : 101
    Points : 42
    Points
    42
    Par défaut Première requête PDO
    Bonjour à tous,

    Je voulais vous soumettre ma première requête PDO, que j'ai codée avec les quelques infos que j'ai prises sur le web.

    Je voulais savoir si ca tenais la route, et quelles améliorations je pourrais apporter, notamment d'un point de vue sécurité...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    try
    {
    	$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    	$DB = new PDO('mysql:host=localhost;dbname=stephanebleus', 'root', '', $pdo_options);
    }
    catch(Exception $e)
    {
    	die('Erreur : '.$e->getMessage());
    }
     
    try
    {
    	// On récupère les données POST
    	$titre = $DB->quote($_POST['titre']); 
    	$contenu = $DB->quote($_POST['contenu']);
     
    	// Insertion dans la base de donnée							
    	$req = $DB->exec("INSERT INTO articles(titre, contenu) VALUES ($titre, $contenu)");
     
    	// Redirection vers la page d'accueil
    	header("Location: index.php");
     
    	// Fermeture du curseur
    	$req->closeCursor();
    }
    catch(Exception $e)
    {
    	die('Erreur : '.$e->getMessage());
    }
    Merci d'avance

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    hello,
    c’est pas pas mal même si c'est du copié-collé
    change les die en exit, le closeCursor est inutile, et fait une vérification avant de lancer le header, rajoute le charset dans le DSN

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 146
    Points : 262
    Points
    262
    Par défaut
    Personnellement quand même quitte à utiliser PDO, j'utiliserais les requêtes préparées.

    http://php.net/manual/fr/pdo.prepared-statements.php

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par Tolriq Voir le message
    Personnellement quand même quitte à utiliser PDO, j'utiliserais les requêtes préparées.

    http://php.net/manual/fr/pdo.prepared-statements.php
    pourquoi ?

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 146
    Points : 262
    Points
    262
    Par défaut
    Suffit juste de lire le lien que j'ai posté peut être ?

    Toujours est il qu'il demande bien comment améliorer le code pour une future réutilisation et augmenter la sécurité.

    Le prepare permet d'être sur de ne pas oublier les échappements dans le cas de cet exemple simple.

    Et dès qu'il utilisera PDO pour ses select il en verra dans de nombreux cas les avantages en vitesse d’exécution.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par Tolriq Voir le message
    Suffit juste de lire le lien que j'ai posté peut être ?

    Toujours est il qu'il demande bien comment améliorer le code pour une future réutilisation et augmenter la sécurité.

    Le prepare permet d'être sur de ne pas oublier les échappements dans le cas de cet exemple simple.

    Et dès qu'il utilisera PDO pour ses select il en verra dans de nombreux cas les avantages en vitesse d’exécution.
    je sais très bien ce que s'est
    mais je doute que toi tu saches vraiment a quoi servent les requêtes préparées, parce que c'est pas du tout à "augmenter la sécurité" et " ne pas oublier les échappements"

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 146
    Points : 262
    Points
    262
    Par défaut
    On pourrais aussi reparler de l'HTML5

    Donc prends le temps de lire correctement ce que j'ai écris de voir pourquoi j'ai écris ce que j'ai écris.

    Donc
    1) les requêtes préparées aident effectivement à la sécurité car l'on travaille avec des données. Il n'est plus possible de faire des injections SQL de 1er niveau avec.

    2) Du fait que l'on travaille en mode donnée, il n'est effectivement plus nécessaire de faire des quote ou autre escapes, le moteur PDO s'en charge et ce y compris pour les bases de données ne supportant pas nativement les requêtes préparées.

    Je passe sur ma dernière phrase qui reprends un des autre avantages des requêtes préparées.

    Donc désolé une fois de plus de ne pas être en accord avec toi mais je sais très bien de quoi je parle ce qui au final n'est peut être pas ton cas.

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    faut arrête de survoler les choses, ici une requêtes préparées n'est plus que pas justifiable, une requête préparée sert de template de requêtes, as tu deja fait un requêtee préparée toi même (sans API syle PDO) ? j'en doute, et tu verras qu'il faut aussi échappés tes valeurs, oui l'injection ne se fera mais c'est pas le but de la choses, de plus sous PDO Mysql les requête préparé sont déactivé par défaut, donc niveau optimisation c'est zéro.
    donc lit bien la vrai doc de mysql, essaye de faire toi même un requête préparée ensuite on reparle du fait de la justification d'une requêtes préparé dans son cas, et pas juste : "moi j'utilise les requête préparée parce que c'est plus facile".

    http://dev.mysql.com/doc/refman/5.0/fr/sqlps.html

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 146
    Points : 262
    Points
    262
    Par défaut
    Alors j'aimerais bien que tu m'expliques ou les requêtes préparée sont désactivée par défaut avec PDO Mysql ça m'intéresse fortement. (Et oui je fait du SQL / PL/SQL sous Sql Server et Oracle aussi).

    Pour en revenir au sujet initial, vbaguet demande comment utiliser au mieux PDO il me semble. Les requêtes préparées sont une part très importante de PDO.

    D’ailleurs le tuto http://julp.developpez.com/php/pdo/?page=requeter est très complet. Dont je citerais juste :

    Par requêtes simples, sont entendues des requêtes dont le code est statique. En effet, les requêtes préparées, ayant pour but la prise en compte de "paramètres" de manière simple et sécurisée, seront abordées ci-après.
    Je pourrais aussi mettre de nombreux liens expliquant tout un tas de choses techniques mais la question initiale reste quand même comment utiliser PDO au mieux et ma réponse reste tout autant justifiée.

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    oui
    En effet, les requêtes préparées, ayant pour but la prise en compte de "paramètres" de manière simple et sécurisée, seront abordées ci-après.
    mais c'est pas la sécurité n'est pas le but d'une requête préparée


    pour l'activation des requêtes sous PDO Mysql faut que tu mettes le PDO::ATTR_EMULATE_PREPARES sur false puisque par défaut il est sur true et la t'auras une vrai requête préparée, si tu fais un INSERT multiple (dans un boucle par exemple) t'y gagnera beaucoup niveau performance, c'est le but premier des requêtes préparé

    en tout cas ici ce qu'il a fait est très bien une requêtes préparée n'est pas justifiable, puisque c'est pour utilisation bien précise et non pas juste pour faire jolie et tapé le moins de code possible


  11. #11
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    Utiliser une requête préparée pour faire 1 seul SELECT, c'est un peu comme prendre sa voiture pour aller chercher du pain à 1 km de chez soi, ça fonctionne, mais une voiture sert à faire plus que ça.
    Pour faire ce trajet tu choisiras plutôt un vélo, et tu mettras un casque, car effectivement la voiture te protège d'office, pas le vélo.

    • Mon blog PHP : http://blog.alterphp.com
    • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 146
    Points : 262
    Points
    262
    Par défaut
    Merci pour l'information sur le paramètre par défaut pour Mysql

    Ensuite sur le débat de fond je reste sur mes positions pour le moment et je donnerais un dernier exemple de la doc Php :

    http://fr2.php.net/manual/fr/pdo.quote.php

    Je cite :

    Si vous utilisez cette fonction pour construire des requêtes SQL, vous êtes vivement invités à utiliser PDO::prepare() pour préparer les requêtes SQL avec des paramètres liés au lieu d'utiliser PDO::quote() pour interpréter les entrées utilisateur dans la requête SQL. Les requêtes préparées avec des paramètres liés sont non seulement plus portables, plus souples et plus sécuritaires, mais bien plus rapides à exécuter que d'interpréter les requêtes, étant donné que les côtés client et serveur peuvent mettre en cache une version compilée de la requête.

    Tous les pilotes PDO n'implémentent pas cette méthode (comme PDO_ODBC). Utilisez les requêtes préparées à la place.

  13. #13
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    @Tolriq, je comprend bien, mais dans son cas ça ne sert a rien, si il se met en requête préparé, en mode émuler la requête sera la même, en mode normale, il va faire 4 requêtes au lieu d'une seule, donc pas dutout un gain de temps, après niveau compat je d'accord

    @vbaguet oublie pas de mettre le charset dans ton DSN, ça affecte aussi quote

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    J'étais assez étonnée de lire pareilles énormitées sagissant de PDO, surtout que: PDO::ATTR_EMULATE_PREPARES Active ou désactive la simulation des requêtes préparées. Sur les drivers qui ne n'ont pas le prepare de façon native. Donc cela n'a de valeur que pour les quelques drivers qui n'ont pas "prepare natif" ODBC je crois.

    Alors je me suis dit qu ici , tellement abitués toutes et tous a faire du SQL, PDO et prepare était affaire entendue puisque natif sur MYSQL/PDO !

    Donc nous pouvons faire un beau prepare, et derriére lancer autant de exec que nous souhaitons, seulement de ce fait , passant par prepare les valeurs s'en trouvent protégées, ce qui n'est pas le cas avec un QUERY PDO simple !

    D'ou sans doute ce dialogue de sourds, donc n'en parlons plus, tout le monde avait raison

  15. #15
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par christele_r Voir le message
    Bonsoir,
    J'étais assez étonnée de lire pareilles énormitées sagissant de PDO, surtout que: PDO::ATTR_EMULATE_PREPARES Active ou désactive la simulation des requêtes préparées. Sur les drivers qui ne n'ont pas le prepare de façon native. Donc cela n'a de valeur que pour les quelques drivers qui n'ont pas "prepare natif" ODBC je crois.
    testes toi meme, tu verras que sous mysql il emule par defaut ...

  16. #16
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    testes toi meme, tu verras que sous mysql il emule par defaut ...
    Oui bien sur Tous mes sites sont en PDO et prepare est actif de base (cinq serveurs différents et mon local
    C' est bien ce que j'ais écris, tout le monde est d'accord

  17. #17
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    tu dis que le mode emulé, n'a pas de valeur pour mysql

  18. #18
    Invité
    Invité(e)
    Par défaut
    ■PDO::ATTR_EMULATE_PREPARES Active ou désactive la simulation des requêtes préparées. Certainspilotes ne supportent pas nativement les requêtes préparées ou en ont un support limité. Ce paramètre force PDO à émuler (TRUE) les requêtes préparées ou (FALSE) à utiliser l'interface native. Il tentera toujours une émulation si le pilote n'a pas de support natif. bool requis.



  19. #19
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    au dela de cite une doc il faut la comprendre, pour mysql le mode emuler est activer par defaut, meme si mysql sait faire des requetes preparees, donc retour a mon commentaire, testes toi meme et tu verras que l'emulation est aussi de la partie pour les pilotes qui prennent en charge les requetes prepares contrairment a ce que tu dis

  20. #20
    Invité
    Invité(e)
    Par défaut
    Un moderateur qui porte un jugement sur notre comprehention c' est pas bien !
    Je te rappelles juste que tout le sujet parlait de PDO pas de MySql, du reste j'avais vu ton lien sur SQL qui bien sur ne parlait pas du cas PDO.
    Enfin tout cela n'est pas grave, c'est toujours bien d'aller au fond des choses.

Discussions similaires

  1. Réutilisation d'un Statement après la première requète
    Par JeanNoel53 dans le forum InterBase
    Réponses: 6
    Dernier message: 15/06/2010, 20h26
  2. Première requête doctrine
    Par joff_symfony dans le forum ORM
    Réponses: 3
    Dernier message: 05/05/2010, 09h01
  3. Réponses: 4
    Dernier message: 25/02/2009, 14h22
  4. [PDO] Pb avec requête PDO
    Par wolfe dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/08/2008, 13h09
  5. Réponses: 3
    Dernier message: 19/05/2008, 10h36

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