Soucis de récupération de cookies dans une boucle while

WRInaute passionné
Bonjour,

J'essaye en vint de récupérer une liste de cookies dont les valeurs correspondent à des identifiants enregistrer en bd pour les comparer et afficher un texte différent si présent ou non sur le pc du client.

Voici donc 2 codes différents m'affichant le même résultat :
Code:
<?php
//Version 1
if (isset($_COOKIE['moncookie'])) {
	foreach ($_COOKIE['moncookie'] as $nom => $valeur) {
		echo "$nom : $valeur <br/>";
	}
} 

//Version 2
if (isset($moncookie)){
	while(list($nom, $valeur) = each($moncookie)) {
		echo "$nom : $valeur<br/>";
	}
}
?>

Ce qui me donne pour les 2 codes :
149 : 149
148 : 148
147 : 147
150 : 150
129 : 129

Ici ma boucle while en version simplifiée ou je compare les valeur des cookies aux identifiants en bd :
Code:
<?php
while($teste = mysql_fetch_array($query))
{
	//on affiche les infos
	if($valeur == $teste['id'])
	{
		echo 'Cookie présent<br/>';
	}
	else
	{
		echo 'cookie absent<br/>';
	}
	//on ferme la boucle
}
?>

Mon soucis est que quelle que soit l'intégration que je fais du code "version 1" ou "version 2" au niveau de ma boucle while ... ça merde tout le temps et je ne comprend pas pourquoi :?

Un petit coup de pouce ne serait pas de refus.

Merci
 
WRInaute accro
Tu as vérifié que tu n'avais pas, dans un cas ou dans l'autre, de caractères parasites (genre un espace en trop) qui viendrait biaiser ton test d'égalité ?
 
WRInaute passionné
Qu'entend tu par caractères parasites?
Sinon, je ne sais plus sur "quelle pied danser" pour intégrer la boucle des cookies dans mon while..une suggestion ?
 
WRInaute accro
Bein du genre un espace ou un caractère invisible quelconque.

Si tu fais :

Code:
 echo $nom." : v."$valeur."v <br/>";

Les deux v sont bien collés à ta chaîne de caractères ?
 
WRInaute passionné
Non, tout semble correcte, pas d'espace, rien 8O !
Par contre, je viens de me rendre compte que si je supprimais le "else" dans la version suivante, je n'avais plus de bugs mais je n'ai pas mon autre autre message "cookie absent". A l'origine, les messages sont en réalités des images (2 étoiles de différentes couleurs). Si cookies présent->étoile rouge, si absent->étoile verte d'ou le besoin du "else".
Code:
<?php
while($teste = mysql_fetch_array($query))
{
//Version 1
if (isset($_COOKIE['moncookie'])) {
   foreach ($_COOKIE['moncookie'] as $nom => $valeur) {
   if($valeur == $teste['id'])
   {
      echo 'Cookie présent<br/>';
   }
   }
}
}
?>
 
WRInaute passionné
@spout: je ne connaissais pas cette méthode et j'ai dailleurs du mal à comprendre comment ça fonctionne.
 
WRInaute passionné
J'ai vraiment du mal :(

J'ai repris l'exemple :
Code:
echo '<pre>';
print_r($_COOKIE['moncookie']);
echo '</pre>';
$ids = serialize($_COOKIE['moncookie']);
echo $ids.'<br />';

$ids = unserialize($ids);
echo '<pre>';
print_r($ids);
echo '</pre>';
Qui me donne :
Array
(
[149] => 149
[148] => 148
[147] => 147
[150] => 150
[129] => 129
)

a:5:{i:149;s:3:"149";i:148;s:3:"148";i:147;s:3:"147";i:150;s:3:"150";i:129;s:3:"129";}

Array
(
[149] => 149
[148] => 148
[147] => 147
[150] => 150
[129] => 129
)
..mais je ne pige toujours pas comment comparer mes id avec les valeurs du tableau :?:
 
WRInaute accro
Tu n'es pas obligé de parcourir tes deux tableaux. Tu peux en parcourir un et vérifier, à chaque tour, si une valeur équivalente existe dans l'autre array avec in_array().
 
WRInaute passionné
hargggggggggg :evil: quelque soit la façon que j'utilise et à partir du moment ou je retourne un "else", ça me fou la merde.
Pour faire simple, que ce soit mes 2 codes ou avec serialize, si quelque part dans mon code je fais:
Code:
if($id_en_bd==$valeur_du_tableau){
echo 'oui';
}
else{
echo'non';
}
Je me retrouve avec une succession de :"ouinonnonnonnonnon" par id.
Si je supprime le "else", mes "oui" correspondent bien aux cookies enregistrés mais j'ai également besoin du "else".

PHP m'énerve toujours autant :mrgreen: !
 
WRInaute accro
Rmplace ton test sur l'égalité par un test avec un in_array() :

Code:
if(in_array($id_en_bd,$tableau_complet)){
echo 'oui';
}
 
WRInaute passionné
Avec votre aide (merci ;)), je suis enfin parvenu à un truc "viable" :D ..du moins je pense :
Code:
<?php
while($teste = mysql_fetch_array($query))
{
if(isset($_COOKIE['moncookie']) AND in_array($teste[id_en_bd],$_COOKIE['moncookie'])){
echo 'cookie oui';
}
else {
echo 'cookie non';
}
}
?>
A vous de me dire si ça vous semble correcte.

Sinon et dans mes testes, "cookie oui" et "cookie non" sont de petites étoiles cliquables permettant de "sauvegarder" temporairement (par le biais des cookies) des annonces. En fonction de la présence des cookies ou pas sur le pc du client, l'étoile change de couleur. L'inconvénient, est qu'il faut recharger la page pour que le ou les cookies soient pris en considérations. Existe t'il un autre moyen sans recharger la page ?

Merci
 
WRInaute accro
Au lieu de faire ton traitement au submit de la page, tu lance lors de l'évènement clic sur ton étoile une fonction ajax qui va faire le traitement en question, récupère le résultat, si besoin, va modifier l'endroit adéquat sur ta page.
 
WRInaute passionné
Dit comme ça, ça parait super simple mais comme je suis une burne total en ajax, c'est loin d'être gagné. Je suis tombé sur un site qui exploite ce système et je vais allé trifouiller le code source pour voir ..on ne sait jamais ^^.

Merci pour les infos :).
 
Discussions similaires
Haut