BUG : Requête PDO avec clause IN

Résolu
bibi -  
 bibi -
Bonjour,

Je décide enfin de m'adresser à vous pour obtenir un (petit) coup de main. J'ai bien évidemment fait le tour de plusieurs forums pour essayer de comprendre d'où venait mon problème mais rien n'y fait .

Voilà donc mon problème : J'effectue une requête de type SELECT (ou DELETE qu'importe), qui DOIT me retourner plusieurs lignes (les variables passer en paramètres sont sûrs ! Et il est évident que ma BDD doit me retourner plusieurs lignes).

Mais a chaque fois, je n'ai qu'une seul ligne qui est renvoyée.

Voici donc mon code :

function getLogEmailOf($id){

	//On met en forme la liste d'id pour la passer à la requète
	$inQuery = implode(',', array_fill(0, count($id), '?'));

        //Permet d'instancier une connexion en BDD
	$bdd = connexionBase();

	$req = "SELECT * FROM log WHERE id IN (".$inQuery.")";
	$result = $bdd->prepare($req);
	foreach ($id as $k => $idD){                      
	      $result->bindParam($k+1, $idD); 
              //$k+1 car l'index commence à 1 pour bindParam
	}
	$result->execute();
	$log = $result->fetchAll();
	return $log;
}


Je précise que $id est un array(). En entrant les valeurs en dure, la requête fonctionne, mais dès que j'utilise cette fonction, les résultats sont faussés...

Je remercie d'avance tout ceux qui auront eu un déclic pour débugger tout ça, car moi, j'en ai pas depuis plusieurs heures ! :'(

5 réponses

le père
 
Bonjour

À tout hasard... Ton tableau $id ne serait-il pas un tableau associatif ? Si c'est le cas, ton bindParam est fait avec un indice qui n'est pas simplement 1,2,3...
0
bibi
 
Non, il s'agit d'un simple array du genre :
[0] => [111111]
[1] => [982614]
......

Edit :
Voici un exemple de var_dump de $id :
array
  0 => string '11111' (length=5)
  1 => string '30000734' (length=8)
  2 => string '30001034' (length=8)
  3 => string '30001506' (length=8)
  4 => string '30001882' (length=8)
  5 => string '30002967' (length=8)
0
bibi
 
Problème résolu :

Il semblerait que lors du foreach, bindParam a besoin de référence, et non pas de valeur. Il faut donc remplacer :
foreach ($id as $k => $idD)

par :
foreach ($id as $k => &$idD)

Solution trouvée dans les commentaires sur l'explication de bindParam , sur php.net : http://www.php.net/manual/fr/pdostatement.bindparam.php
0
le père
 
J'aurai appris quelque chose... N'utilisant pas encore PDO, je ne connaissais pas le rôle exact de cette fonction.
Si j'ai bien compris, une autre façon de résoudre le problème eût été d'utiliser bindValue, qui associe une valeur au ?, alors que bindParam associe (une référence à ) une variable.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bibi
 
Je te donne l'explication que j'ai compris personnellement, mais je ne suis pas sûr qu'elle soit totalement exact :
* Si on utilise bindValue, on doit entrer les valeurs sans passer par des variables.
* En utilisant bindParam, on peut alors passer des variables (Par contre, on n'est pas obligé de passer toujours des références : si on n'utilise pas de clause IN, je n'ai aucun problème avec cette fonction en utilisant directement $var.).

Le vrai but d'utiliser bindParam pour moi, c'est qu'il n'est plus nécessaire de faire des mysql_real_escape_string(), addslashes(), etc .... pour vérifier les valeurs reçuent : PDO les sécurisant automatiquement. C'est pourquoi j'utilise uniquement du PDO actuellement car il simplifie nettement les vérifications.
0