BUG : Requête PDO avec clause IN

Résolu/Fermé
bibi - 28 févr. 2012 à 17:07
 bibi - 3 mars 2012 à 11:04
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 ! :'(

A voir également:

5 réponses

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
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
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
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
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