Page 1 sur 1

requete PDO et array_push() Comportement bizzare

Posté : 15 févr. 2010, 16:33
par visualight
Bonjour,

Voici que je rencontre encore un problème et celui-ci concerne la fonction ARRAY_PUSH(); qui a un comportement bizzare.
En effet, lorsque je désire rajouter un élément à mon array (via array_push) il me rajoute non pas 1 élément MAIS 2 fois le même !

Exemple de la partie de mon code :
// $auth_id est un array venant du champ gallery_auth_id de ma table
// le champ gallery_auth_id est une zone texte ou sont regroupées des ID séparées par des virgules
$auth_id = explode(",", $res_main['gallery_auth_id']);

// Je mappe le tableau $auth_id pour le refondre en séparant les valeurs par des virgules
$map = array_map(null, $auth_id);
$authorized_id_mapping = join(',', $map);

// Je crée un array et je sépare les éléments des virgules. Chaque ID de l'array est maintenant un élément.
$authorized_list = explode(','  , $authorized_id_mapping);

// PLUS LOIN DANS LE SCRIPT : je fais un array_push de l'élément $date pour le refondre dans l'array $authorized_list
// Je fais un array_push car j'ai des conditions IF différentes pour la requete de filtrage par DATE et la requete de filtrage par LIEUX
$date = $_POST['date'];
array_push ($authorized_list, $date);
		
// J'exécute maintenant la requête PDO préparée

$req_main = $connexion->prepare ("SELECT $CfgTableMain.gallery_id, $CfgTableMain.gallery_private, $CfgTableMain.gallery_date, $CfgTableMain.gallery_title, $CfgTableMain.gallery_int_title, $CfgTableMain.gallery_count, $CfgTableMain.gallery_photo_active, $CfgTableMain.gallery_video_active, $CfgTableMain.photo_localhost, $CfgTableObjects.object_type, $CfgTableObjects.object_filename
 FROM $CfgTableMain RIGHT JOIN $CfgTableObjects ON ($CfgTableMain.gallery_id = $CfgTableObjects.gallery_id) 

 WHERE $CfgTableMain.gallery_id IN ($point) AND YEAR ($CfgTableMain.gallery_date) = ? GROUP BY $CfgTableMain.gallery_id ORDER BY $CfgTableMain.gallery_date DESC $max");

$req_main->execute($authorized_list);

RESULTAT : Erreur PDO !

Warning: PDOStatement::execute() [function.PDOStatement-execute]: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in ...


==> Quand je fais un print_r de l'array $authorized_list, je vois que l'array_push à bien mis la valeur $date MAIS elle l'a mis 2 fois !!

Exemple print_r($authorized_list); ==> Donne :

Code : Tout sélectionner

Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 5 [4] => 6 [5] => 7 [6] => 8 [7] => 9 [8] => 10 [9] => 11 [10] => 12 [11] => 13 [12] => 14 [13] => 15 [14] => 16 [15] => 17 [16] => 18 [17] => 19 [18] => 20 [19] => 21 [20] => 22 [21] => 23 [22] => 31 [23] => 32 [24] => 33 [25] => 34 [26] => 35 [27] => 36 [28] => 37 [29] => 2010 [30] => 2010 )
Vous pouvez donc remarquer que l'année 2010 apparaît 2 fois à la fin du tableau.

Avez-vous une idée d'où cela pourrait provenir sachant que je ne fais aucunes boucles dans mon code (pas de WHILE ou FOR ou FOREACH) ?


Merci pour votre aide, je sèche ...
Raph

Re: requete PDO et array_push() Comportement bizzare

Posté : 15 févr. 2010, 16:40
par stealth35
par principe array_push c'est pas fait pour inserer 1 seul élément , c'est mieux de faire
$authorized_list[] = $date;
mais ca enlève rien au problème c'est bizarre que ca te le met 2 fois,
par contre j'ai pas compris le coup du :
$auth_id = explode(",", $res_main['gallery_auth_id']);
$map = array_map(null, $auth_id);
$authorized_id_mapping = join(',', $map);
$authorized_list = explode(','  , $authorized_id_mapping);
ca ressemble a quoi tes données en entrée ?

Re: requete PDO et array_push() Comportement bizzare

Posté : 15 févr. 2010, 17:17
par visualight
Salut !

Merci pour ta réponse, c'est bizzare mais ça marche :D
Enfin ... bizarre, pas tant que ça car c'est encore de ma faute ... je n'en dirais pas plus ! :oops:

Concernant cette partie de code ... c'est vrai, c'est cheloux et j'ai corrigé le problème.

Mes données son stockées dans un champ (gallery_auth_id) sous cette forme :
1,2,3,4,5,6,7,8,9,10 ...

Mon ancien code :
$auth_id = explode(",", $res_main['gallery_auth_id']);
$map = array_map(null, $auth_id);
$authorized_id_mapping = join(',', $map);
$authorized_list = explode(','  , $authorized_id_mapping);
deviens simplement :
$auth_id = explode(",", $res_main['gallery_auth_id']);

Merci pour votre aide,
raph

PS: stealth35 ==> as tu des infos sur l'éventuelle limitation de IN() dans une requete SQL ?

Merci beaucoup ...