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 :

Marqueur nommé ou interrogatif pour les requetes préparées ?


Sujet :

PHP & Base de données

  1. #1
    sff
    sff est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 14
    Points : 12
    Points
    12
    Par défaut Marqueur nommé ou interrogatif pour les requetes préparées ?
    Bonjour,

    je commence à me poser vraiment la question concernant les marqueurs. Il est vraiment que les marqueurs interrogatifs sont vraiment plus simple à mettre en place, mais qu'elle est réellement la préconisation lorsque l'on fait des requetes préparées ? J'ai l'impréssion que bindValue et les différents paramètres que l'on ajoute lors des requêtes nommés ne sont que accessoire pour la sécurité.

    Marqueur interrogatif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $sql = "SELECT id FROM test WHERE id_ad = ? AND title LIKE  ? LIMIT 1";
     
    $requete = $bdd -> prepare($sql);
    $requete->execute(array($id_ad, $title));
    Marqueur nommé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $sql = "SELECT id FROM test WHERE id_ad = :id_ad AND title LIKE  :title LIMIT 1";
     
    $requete = $bdd -> prepare($sql);
     
    $requete ->bindValue(':id_ad', $id_ad, PDO::PARAM_INT);
    $requete ->bindValue(':title', $title, PDO::PARAM_STR);
     
    $requete->execute();
    Merci d'avance pour vos conseils

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    il y a aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $sql = "SELECT id FROM test WHERE id_ad = :id_ad AND title LIKE  :title LIMIT 1";
     
    $requete = $bdd -> prepare($sql);
    $requete->execute(array(
       ':id_ad' => $id_ad, 
       ':title' => $title
    ));
    C'est au choix : c'est à toi de choisir la syntaxe qui te convient le mieux.


    N.B. Quand on a beaucoup de paramètres/colonnes, il est préférable d'utiliser les marqueurs nommés : c'est plus clair (et donc facile à déboguer).

  3. #3
    sff
    sff est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Dans ce cas, quel est l'interet de bindValue et PDO::PARAM_INT ou PDO::PARAM_STR si on peut faire sans ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Ça permet de préciser le type de donnée attendue : PHP - Constantes pré-définies

  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
    Deux points pour compléter la remarque de jreaux :
    1) En général, la base de données se débrouille très bien en considérant toutes les valeurs comme des chaines.
    Ces deux requêtes sont le plus souvent interchangeables :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT id FROM test WHERE id_ad = 3;
    SELECT id FROM test WHERE id_ad = '3';
    L'exception la plus connue est le cas de la limite où il faut absolument passer un nombre :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT id FROM test LIMIT 1; -- Fonctionne
    SELECT id FROM test LIMIT '1'; -- Ne fonctionne pas
    Pour ce cas, il faut obligatoirement utiliser bindParam ou bindValue avec la précision du type.
    V.c. Explication du faux bogue de la clause LIMIT

    2) Subtilité entre bindParam et bindValue : bindParam lie la variable au marqueur et l'évalue au moment de l'exécution alors que bindValue lie la valeur à l'instant au marqueur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $id_ad = 0; 
    $sql = "SELECT id FROM test WHERE id_ad = :id_ad";
    $requete = $bdd -> prepare($sql);
     
    $requete ->bindValue(':id_ad', $id_ad, PDO::PARAM_INT);
     
    $id_ad = 1; 
    $requete->execute(); // exécute SELECT id FROM test WHERE id_ad = 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $id_ad = 0; 
    $sql = "SELECT id FROM test WHERE id_ad = :id_ad";
    $requete = $bdd -> prepare($sql);
     
    $requete ->bindParam(':id_ad', $id_ad, PDO::PARAM_INT);
     
    $id_ad = 1; 
    $requete->execute(); // exécute SELECT id FROM test WHERE id_ad = 1
    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]

Discussions similaires

  1. [AC-2007] Module pour les requetes
    Par Begsweb dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 08/04/2011, 00h06
  2. [AJAX] [vos avis] fonction "générique" pour les requetes
    Par gorgonite dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/07/2007, 19h40
  3. Regles pour les requetes
    Par casawi dans le forum Oracle
    Réponses: 10
    Dernier message: 13/02/2007, 16h30
  4. activer mod_proxy pour les requetes ajax
    Par xtaze dans le forum Apache
    Réponses: 1
    Dernier message: 17/05/2006, 17h45

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