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 :

Requête préparée [PDO]


Sujet :

PHP & Base de données

  1. #1
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut Requête préparée
    Bonjour,

    J'ai un "petit soucis" avec cette requête. Comme vous le verrez plus bas j'ai plusieurs fois :campaign et :member qui dans la requête ont exactement la même valeur.
    Pourtant la requête comme ci ne fonctionne pas. Il me dit nombre de paramètre insuffisant.

    Ne faite pas attention à la requête c'est juste un exemple.

    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
    $sql = $db->prepare('
    	SELECT mission_id, mission_name, complete_normal, complete_hard
    	FROM missions INNER JOIN complete
    	ON (mission_campaign = complete_campaign)
    	AND (mission_id = complete_mission)
    	WHERE mission_campaign = :campaign
    	AND complete_member = :member
    	UNION
    	SELECT mission_id, mission_name, 0, 0
    	FROM missions
    	WHERE mission_campaign = :campaign
    	AND mission_id NOT IN
    	(SELECT mission_id
    	FROM missions INNER JOIN complete
    	ON (mission_campaign = complete_campaign)
    	AND (mission_id = complete_mission)
    	WHERE mission_campaign = :campaign
    	AND complete_member = :member)
    ');
    
    $sql->execute(array(
    	':campaign' => 1,
    	':member' => $_SESSION['member_id'],
    ));

    Si je met des nom différent pour chaque fois que :campaign apparait ca passe.

    Est ce qu'il faut utiliser autre chose que execute() pour pouvoir laisser :campaign 3 fois ?

    C'est assez nul en tout cas de pas pouvoir faire ca.

  2. #2
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    essaye de passer plusieurs fois le meme parametre. Si tu l'a entré 3 fois, entre 3 fois la définition du parametre. J'ai la meme chose en delphi :p

    Au pire, insere une variable dans ta requete :
    (syntaxe MS SQL)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DECLARE campaign INTEGER;
    DECLARE member INTEGER;
    SELECT @campaign = :campaign, @membre = :member;
    Et plus bas dans ton code, tu utilises @campaign à la place de :campaign

  3. #3
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    Citation Envoyé par Korko Fain
    Si tu l'a entré 3 fois, entre 3 fois la définition du parametre.
    C'est justement ce que je ne veux pas faire !

    Au pire, insere une variable dans ta requete :
    (syntaxe MS SQL)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DECLARE campaign INTEGER;
    DECLARE member INTEGER;
    SELECT @campaign = :campaign, @membre = :member;
    Et plus bas dans ton code, tu utilises @campaign à la place de :campaign
    Je suis avec MySQL.

  4. #4
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    Syntaxe MySQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET @campaign = :campaign;
    SET @member = :member;
    http://dev.mysql.com/doc/refman/5.0/fr/variables.html

    GIYF

  5. #5
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    Ca répond pas tout a fait ma question mais ca passe.
    Merci

  6. #6
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    N'ayant pas réponse à ta question directement j'ai juste chercher à dépasser le probleme voila tout Mais le probleme n'est pas résolu dans le sens pur, à savoir est-il possible dans PDO (il ne l'est pas dans certains SGBD en tous cas) d'utiliser la meme variable à plusieurs endroits.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Salut,

    effectivement c'est un peu nul PDO pour les parametre nommés redondant (un peu comme pour les booleens bindés à la volée...).
    En fait il ne les gèrent pas.

    Il faut que tu utilises les paramètres (innommable?) marqués.... cf la doc qui appelle cela des marqueurs.
    http://www.php.net/manual/fr/functio...nt-execute.php

    Donc pour gérer ce cas où tu vas utiliser plusieurs fois la même valeur dans ta requête, tu vas devoir utiliser les ?. Ce qui peut être très relou.....

    Du coup dans ces cas là moi j'ai décidé de leurs adjoindre un id numérique.

    Donc dans ton cas j'aurai campaign, campaign1 et campaign2.


    C'est nul, mais il n'y à pas le choix, acceptes ou acceptes ^^


    bye

  8. #8
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    Il faut utiliser bindParam().

    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
    $member = $_SESSION['member_id'];
    $campaign = 1;
     
    $sql = 'SELECT mission_id, mission_name, complete_normal, complete_hard
    	FROM missions INNER JOIN complete
    	ON (mission_campaign = complete_campaign)
    	AND (mission_id = complete_mission)
    	WHERE mission_campaign = :campaign
    	AND complete_member = :member
    	UNION
    	SELECT mission_id, mission_name, 0, 0
    	FROM missions
    	WHERE mission_campaign = :campaign
    	AND mission_id NOT IN
    	(SELECT mission_id
    	FROM missions INNER JOIN complete
    	ON (mission_campaign = complete_campaign)
    	AND (mission_id = complete_mission)
    	WHERE mission_campaign = :campaign
    	AND complete_member = :member)
    ';
     
    $sth = $db->prepare($sql);
     
    $sth->bindParam(':campaign', $campaign, PDO::PARAM_INT);
    $sth->bindParam(':member', $member, PDO::PARAM_INT);
     
    $sth->execute();
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

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

Discussions similaires

  1. [PDO] Affichage d'une requête préparée
    Par Tchupacabra dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 25/02/2010, 03h48
  2. [PDO] une requête préparée pour un insert avec jointure?
    Par seïna dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 15/08/2008, 00h34
  3. [PDO] Requête préparée, retour d'erreur à masquer
    Par speedev dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 20/06/2007, 10h39
  4. [PDO] Problème de requête préparée (à n'y rien comprendre?)
    Par waldo2188 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 20/03/2007, 21h53
  5. [PDO] Ma requêtes préparées me retourne false
    Par jeff_! dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 03/05/2006, 22h07

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