Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/05/2007, 11h59   #1
Rédacteur
 
Avatar de Yoshio
 
Homme
Inscription : septembre 2005
Messages : 1 741
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 1 741
Points : 1 497
Points : 1 497
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 :
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.
Yoshio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2007, 12h24   #2
Membre chevronné
 
Avatar de Korko Fain
 
Étudiant
Inscription : août 2005
Messages : 632
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2005
Messages : 632
Points : 632
Points : 632
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 :
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
Korko Fain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2007, 13h17   #3
Rédacteur
 
Avatar de Yoshio
 
Homme
Inscription : septembre 2005
Messages : 1 741
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 1 741
Points : 1 497
Points : 1 497
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 !

Citation:
Au pire, insere une variable dans ta requete :
(syntaxe MS SQL)
Code :
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.
Yoshio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2007, 15h06   #4
Membre chevronné
 
Avatar de Korko Fain
 
Étudiant
Inscription : août 2005
Messages : 632
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2005
Messages : 632
Points : 632
Points : 632
Syntaxe MySQL :
Code :
1
2
SET @campaign = :campaign;
SET @member = :member;
http://dev.mysql.com/doc/refman/5.0/fr/variables.html

GIYF
Korko Fain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2007, 21h31   #5
Rédacteur
 
Avatar de Yoshio
 
Homme
Inscription : septembre 2005
Messages : 1 741
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 1 741
Points : 1 497
Points : 1 497
Ca répond pas tout a fait ma question mais ca passe.
Merci
Yoshio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2007, 22h06   #6
Membre chevronné
 
Avatar de Korko Fain
 
Étudiant
Inscription : août 2005
Messages : 632
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2005
Messages : 632
Points : 632
Points : 632
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.
Korko Fain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2007, 22h05   #7
Membre Expert
 
Inscription : janvier 2007
Messages : 1 452
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2007
Messages : 1 452
Points : 1 914
Points : 1 914
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
kaymak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2007, 12h07   #8
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Bonjour,

Il faut utiliser bindParam().

Code :
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
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h18.


 
 
 
 
Partenaires

Hébergement Web