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 :

La syntaxe des requêtes préparées


Sujet :

PHP & Base de données

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 54
    Par défaut La syntaxe des requêtes préparées
    Bonjour,

    Je ré-apprends à programmer en PHP en utilisant les requêtes préparées. Je comprends le principe, reste à comprendre la syntaxe.

    Si je prends ces deux exemples, trouvés au hasard du net :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     $requete = $this->_bdd->prepare('SELECT * FROM Oeuvres ORDER BY :parOrdreDe DESC ');
                $requete->bindValue(':parOrdreDe', $ordre);
                $requete->execute() or die(print_r($this->_bdd->errorInfo()));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?");
    if ($stmt->execute(array($_GET['name']))) {
      while ($row = $stmt->fetch()) {
        print_r($row);
      }
    Par rapport à l'ancienne méthode - les requêtes "non-préparées" - je ne reconnais pas la syntaxe du ORDER BY, par exemple.
    - Qu'est-ce que ce ":" ?
    - Qu'est-ce que ce "bindValue" ?
    - Pourquoi a-t'on $requete = $this->_bdd-> dans le premier cas et puis ensuite $stmt = $dbh->prepare dans le second cas (l'étape du _bdd a alors disparu).

    Etc...

    J'aurais besoin d'un "catalogue" des requêtes préparées : comment se présente une requête avec et sans clause where, avec des AND dans les clauses where, les requêtes avec clef étrangère, etc... etc... Je voudrais voir tous les cas de figure possible.

    Idem avec les requêtes INSERT.


    Merci d'avance pour votre aide et votre patience.

  2. #2
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    http://www.php.net/manual/fr/pdo.pre...statements.php

    Tu as vu cette page du manuel PHP ?
    Je vois un avantage essentiel côté codeur :
    Si ce sont des requêtes en écriture, tu ne crains plus les injections SQL, car ton driver le gère automatiquement. Pour la même raison, tu ne t'occupes plus non plus de savoir si tu dois ajouter des guillemets autour ou non selon que c'est du varchar ou du integer...
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 54
    Par défaut
    Salut Dendrite,

    Oui j'avais lu cette page du manuel. A vrai dire je ne discute pas l'utilité des requêtes préparées, je me doute que si ça a été mis au point c'est qu'il y a une bonne raison. Je veux seulement mieux comprendre la syntaxe. La page en question est trop générale.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
    $stmt->bindParam(1, $name);
    $stmt->bindParam(2, $value);
    Ceci nécessite d'être détaillé.

    Le premier $stmt, c'est quoi ? Le nom de la requête ? Pourquoi a-t'on ensuite un =$dbh (qui correspond à quoi) ?
    Ce bindParam n'existait pas avant les requêtes préparées. C'est quoi comme fonction ? Et quelles autres fonctions du même genre existe-t'il ? Etc...

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    $stmt c'est pour "statement", qui est un objet représentant une requête préparée (voir ici pour le détail).

    $dbh est un objet PDO, qui représente une connexion à ta base de données, celui-ci a été créé avec un code comme celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $dsn = 'mysql:dbname=testdb;host=127.0.0.1';
    $user = 'dbuser';
    $password = 'dbpass';
    $dbh = new PDO($dsn, $user, $password);
    bindParam permet de lier une valeur à un paramètre de la requête préparée (voir la doc ici)

    Une remarque tout de même, PDO utilise la POO (programmation orienté objet). Si tu ne sais pas de quoi il en retourne, je t'invite d'abord à commencer à apprendre comment celle-ci fonctionne et s'utilise (http://www.php.net/manual/fr/language.oop5.php)

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 54
    Par défaut
    Je vais lire ces liens, merci Spartacusply.

    Mais une question là tout de suite. Je viens de trouver un code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php    
    require 'sqlconnect.php';  
    $sql = 'SELECT * FROM membres';    
    $req = $pdo->query($sql);    
    while($row = $req->fetch()) {    
         echo '<a href="membre-'.$row['id'].'.html">'.$row['pseudo'].'</a><br/>';    
    }    
    $req->closeCursor();    
    ?>
    C'est donc supposé être un code de requête préparée. Mais ça me semble plus conforme à l'ancienne mouture. Il n'y a pas de "prepare->", ça semble être fait en deux temps avec une requête "classique".

    Est-ce une requête préparée valable ? Le même résultat obtenu d'une autre manière ?


    **edit**

    Merci pour le lien sur les "statements", je crois que c'est ce que je cherchais. En fait c'est ça qui remplace toute la série des mysql_fetch_array , mysql_num_rows, etc... ? J'espère que j'ai bon.

  6. #6
    Membre Expert

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Je crois que tu fais une confusion : les requêtes préparées sont un mécanisme complètement distinct de PDO ou de mysqli. Ca n'a pas été le cas, mais si des fonctions supplémentaires avaient été créés, il aurait été théoriquement possible d'uiliser les requêtes préparées avec l'extension mysql.

    De plus, les extensions PDO et mysqli permettent l'utilisation des requêtes préparées mais ce n'est en rien une obligation (même si en soit c'est une bonne idée notamment pour des questions de sécurité).

    Le code que tu as ici en est le parfait exemple, il utilise PDO mais pas le mécanisme des requêtes préparées, qui est exploité uniquement lorsque qu'une requête est "préparée" justement avec l'instruction "$dbh->prepare".

    Le code qui aurait été équivalent avec l'extension mysql aurait été celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $sql = 'SELECT * FROM membres';    
    $req = mysql_query($sql,$conn);
    while($row = mysql_fetch_array($req)) {    
         echo '<a href="membre-'.$row['id'].'.html">'.$row['pseudo'].'</a><br/>';    
    }

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 54
    Par défaut
    Ok ok ok... Euh... Alors PDO est une manière de programmer avec des objets, MYSQLI est une nouvelles manière de faire des requêtes SQL qui inclut les requêtes préparées et on ne peut donc pas utiliser MYSQL avec MYSQLI par contre on peut utiliser les deux avec PDO, c'est à peu près ça ? En fait les requêtes préparées c'est obligatoirement du mysqli, mais par contre on est pas obligé de les utiliser avec PDO, c'est ça ?

    Donc pour faire des sites internet moderne, au goût du jour, il faut utiliser PDO et mysqli ensemble, ou alors au moins mysqli et ses requêtes préparées. J'ai bon ?

  8. #8
    Membre Expert

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Je te renvoi vers la réponse de Cerila sur ton autre post : http://www.developpez.net/forums/d14...e/#post7707595

Discussions similaires

  1. [MySQL] Syntaxe des requêtes
    Par skins dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 26/04/2013, 17h49
  2. syntaxe des requète avec plusieurs enregistrements
    Par JeanNoel53 dans le forum Firebird
    Réponses: 2
    Dernier message: 10/01/2012, 16h35
  3. syntax des requêtes Sql selon les données à traiter
    Par pra3t0r dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/06/2011, 22h53
  4. Faire des requêtes préparées avec l'extension mysql
    Par stealth35 dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 3
    Dernier message: 03/03/2011, 02h15
  5. Faire des requêtes préparées avec l'extension mysql
    Par stealth35 dans le forum Téléchargez
    Réponses: 1
    Dernier message: 23/02/2011, 10h23

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