Multiples ID dans requete preparee PDO

Eléphant du PHP | 428 Messages

29 janv. 2010, 16:47

Bonjour,

Je rencontre actuellement un problème avec une requête. En effet, je désirerai afficher les résultats en fonction d'un champ regroupant plusieurs ID séparés par des virgules.

Pour ce faire je travaille comme ceci :
$authorized_id = '1,2,3,4,5,6,7';
... RIGHT JOIN $CfgTableUsers WHERE  $CfgTableMain.gallery_id IN ($authorized_id)
Tout fonctionne bien (il m'affiche tous les résultats correspondants à mes multiples ID). Tout fonctionne bien ...jusqu'à ce que je passe en requêtes préparée PDO.

En requete préparée PDO, je fais :
$authorized_id = '1,2,3,4,5,6,7';
... RIGHT JOIN $CfgTableUsers WHERE  $CfgTableMain.gallery_id IN (:auth_id)
$req_main->execute(array(':auth_id' => $authorized_id));
Au mieux de m'afficher tous les enregistrements correspondant aux multiples ID, il ne m'en affiche qu'un seul (le premier enregistrement ==> ID = 1).

SI maintenant je travaille avec une requete PDO comme ceci ça fonctionne mais la requete n'est pas préparée ... :
$authorized_id = '1,2,3,4,5,6,7';
... RIGHT JOIN $CfgTableUsers WHERE  $CfgTableMain.gallery_id IN ($authorized_id)
$req_main->execute();
Que dois je faire en PDO pour afficher tous les enregistrements correspondants aux ID en requête préparée ==> comme en requête simple "query" ?

Merci d'avance,
raph
Modifié en dernier par visualight le 29 janv. 2010, 16:51, modifié 2 fois.

ViPHP
ViPHP | 5462 Messages

29 janv. 2010, 16:49

ca marche pas comme ca
si t'as
$authorized_id = '1,2,3,4,5,6,7';
faudra faire
RIGHT JOIN  $CfgTableUsers WHERE  $CfgTableMain.gallery_id IN (?, ?, ?, ?, ?, ?, ?)

apres pour ca tu peux faire
$authorized_list = explode(',' , $authorized_id);
$point = array_values(array_fill(0, count($authorized_list), '?')));

RIGHT JOIN  $CfgTableUsers WHERE  $CfgTableMain.gallery_id IN ($point)

Eléphant du PHP | 428 Messages

29 janv. 2010, 17:01

Salut,

Merci mais ça ne m'arrange pas car en effet mon listing d'ID est travaillé comme ceci :

Le listing d'ID proviens de la BD et est stocké comme ceci dans un champ : 1,2,3,4,5,6,7,9
Je le récupère dans une session puis je la retravaille comme ceci :
$map = array_map(null, $_SESSION["authid"]);
$authorized_id = join(',', $map);

print_r ($authorized_id); // me donne bien ==> 1,2,3,4,5,6,7,9
Si maintenant j'exécute une requête PDO non préparée cela fonctionne très bien :
... RIGHT JOIN $CfgTableUsers WHERE  $CfgTableMain.gallery_id IN ($authorized_id)
$req_main->execute();
Si j'exécute une requête préparée ça ne m'affiche qu'un seul enregistrement :
... RIGHT JOIN $CfgTableUsers WHERE  $CfgTableMain.gallery_id IN (:auth_id)
$req_main->execute(array(':auth_id' => $authorized_id));
Pourtant je ne fais rien d'autre que de remplacer la variable $authorized_id par une variable de préparation PDO (:auth_id)


Mais je crois que je commence à comprendre pourquoi ...
dans une requête PDO préparée, je stocke les $authorized_id dans un array et je pense que le problème viens de là.

Je teste et vous tiens au jus.

Si toutefois quelq'un sait que cela ne proviens pas du fait de remettre les authorized_id dans un array, qu'il le fasse savoir SVP.


Merci,
raph

ViPHP
ViPHP | 5462 Messages

29 janv. 2010, 17:07

non, ce qui faut comprendre c'est que ton IN attend un liste et une pas un chaine de caratere

prense comme en php

$array = array(1, 2, 3, 4, 5, 6);

si tu fais :

$list = '1, 2, 3, 4, 5, 6';
$array = array($list);

c'est pas la meme chose. pour PDO c'est pareil

IN(:id1, :id2, :id3, :id4, :id5, :id6);


mais ta base est mal faite, tu ne devra pas avoir une liste dans un champs, tu vas devoir faire :
WHERE $CfgTableMain.gallery_id = $authid