Résultat d'une requête dans un tableau

Eléphant du PHP | 331 Messages

17 sept. 2008, 15:05

Bonjour à tous,

Je cherche à alimenter deux variables sous forme de tableau.

Quand je fais manuellement :
$notes = array(7, 9, 13, 15, 17);
$nombres_notes = array (1, 3, 2, 3, 1);
la suite de mon traitemenet fonctionne très bien, par contre, quand je le code depuis une requête de cette manière cela ne fonctionne plus :
$resultat = mysql_query("SELECT Texte, COUNT(*) as Occurences FROM Votes WHERE IdMatch = '$RefMatch' GROUP BY Texte ORDER BY Texte"); 
			$notes = array(); 
			$nombre_notes = array(); 
			while ($resultat && $row = mysql_fetch_array($resultat))
			{ 
				// Etiquettes de l'axe X 
			   $notes[] = $row["Texte"]; 
			   
			   // Les valeurs à afficher sur l'histogramme (Axe Y) 
			   $nombres_notes[] = $row["Occurences"]; 
			} 
Pourriez-vous me dire ce qui ne va pas dans ce dernier morceau de code.

Merci,

Jérôme

Mammouth du PHP | 1353 Messages

17 sept. 2008, 15:24

Bonjour,

Es tu sur que ta requete fonctionne bien ?
Si tu fais un echo des valeurs dans la boucle ca affiche les bonnes valeurs ?

Et apres la boucle, si tu fais un print_r($notes) qu'obtiens tu ?

Précision : tu peux simplifier la boucle while, sachant que $resultat ne bouge pas tu n'a pas à la mettre dans la boucle et peux te contenter de
while ($row = mysql_fetch_array($resultat)) 
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Eléphant du PHP | 331 Messages

17 sept. 2008, 16:09

Oui, le print_r de la variable alimentée par la boucle est bonne et affiche exactement la même chose que si je construis mon array manuellement.
C'est ça qui est dingue !

C'est après quand je fais un serialize() puis un unserialize() que ça plante.

Mammouth du PHP | 1353 Messages

17 sept. 2008, 16:17

C'est quand même étrange...

Tu es sur que les variables sont dans le même ordre avec ta requete ou à la main ? Cela pourrait etre ca ? Que fais tu de tes variables apres ?

Parce que en théorie si le print_r est bon alors le traitement est le même...
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Eléphant du PHP | 331 Messages

17 sept. 2008, 16:24

Je te montre un morceau de code plus large que tu vois l'ensemble :
			$resultat = mysql_query("SELECT Texte, COUNT(*) as Occurences FROM Votes WHERE IdMatch = '$RefMatch' GROUP BY Texte ORDER BY Texte"); 
			$notes = array(); 
			$nombre_notes = array(); 
			while ($row = mysql_fetch_array($resultat))
			{ 
				// Etiquettes de l'axe X 
			   $notes[] = $row["Texte"]; 
			   
			   // Les valeurs à afficher sur l'histogramme (Axe Y) 
			   $nombres_notes[] = $row["Occurences"]; 
			} 
			
			//$notes = array(7, 9, 13, 15, 17,4, 5, 6, 12);
			//$nombres_notes = array (1, 3, 2, 3, 1, 1, 3, 2, 3);
			
			//print_r($notes);
			// On sérialize les valeurs du tableau et on les passe à detail_note_match.php
		   echo "<img src='../graphiques/detail_note_match.php?notes=".urlencode(serialize($notes))."&nombres_notes=".urlencode(serialize($nombres_notes))."' alt='Mon graphique'/>";
et ensuite, j'ai le fichier detail_note_match.php qui récupère tout ça de la manière suivante :
 // On récupère les valeurs à afficher sur le graphique dans $_GET['values'] et on les désérialize
   $data_notes = @unserialize($_GET['notes']);
   $data_nombres_notes = @unserialize($_GET['nombres_notes']);
Qu'entends-tu par ordre identique ? Moi j'ai l'impression que c'est pareil ...

Mammouth du PHP | 1353 Messages

17 sept. 2008, 16:34

Et si tu fais :
// On récupère les valeurs à afficher sur le graphique dans $_GET['values'] et on les désérialize 
   $data_notes = unserialize(urldecode($_GET['notes'])); 
   $data_nombres_notes = unserialize(urldecode($_GET['nombres_notes']));
?

Si jamais le urlencode modifie des caractères... Mais je ne comprends pas pourquoi ca marcherai avec un tableau remplit à la main et pas avec une bdd....

Par le même ordre je me demandais si tu avais des différences dans le traitement parce que les valeurs récupérées en base étaient pas dans le même ordre, mais si rien ne marche c'est bizarre...
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Eléphant du PHP | 331 Messages

17 sept. 2008, 16:44

Non, le problème est strictement identique !

Si ça peut faire avancer le schmilblick, cela me génère une erreur lors du dessin d'un graphe avec artichow, dont le code est le suivant :
 // On récupère les valeurs à afficher sur le graphique dans $_GET['values'] et on les désérialize
	$data_notes = unserialize(urldecode($_GET['notes']));  
	$data_nombres_notes = unserialize(urldecode($_GET['nombres_notes']));
	$NoteMoyenne = 13;
 
// Ici, le graphique mesurera 480 x 400 pixels. 
   $graph = new Graph(480, 400); 

   // L'anti-aliasing permet d'afficher des courbes plus naturelles, 
   // mais cette option consomme beaucoup de ressources sur le serveur. 
   $graph->setAntiAliasing(TRUE); 
 
   // On créé l'histogramme à base des valeurs de l'axe Y 
   $plot = new BarPlot($data_nombres_notes); 
    
   // On spécifie les noms des séries X 
   $plot->xAxis->setLabelText($data_notes);  
    
   // On donne des titres aux axes XY 
   $plot->yAxis->title->set("Nombres de notes"); 
   $plot->xAxis->title->set("Notes"); 
   
   //on ajoute la légende
   $Legende = "Note du match :".$NoteMoyenne;
   $plot->title->set($Legende);
    
   // Ajoute une couleur de fond aux barres 
   $plot->setBarColor( 
      new Color(250, 230, 180) 
   ); 

   // On ajoute 5 % d'espace à gauche et à droite de l'histogramme. 
   // On ne change pas l'espace du haut et du bas de l'histogramme. 
   $plot->setSpace( 
      5, /* Gauche */ 
      5, /* Droite */ 
      NULL, /* Haut */ 
      NULL /* Bas */ 
   ); 

   // On choisit une ombre de 3 pixels 
   $plot->barShadow->setSize(3); 
   // On place l'ombre sur les côtés haut et droit. 
   // Si vous utilisez Artichow pour PHP 4 & 5, transformez Shadow::RIGHT_TOP en SHADOW_RIGHT_TOP 
   $plot->barShadow->setPosition(SHADOW_RIGHT_TOP); 
   // On veut une ombre de couleur grise 
   $plot->barShadow->setColor(new Color(180, 180, 180, 10)); 
   // On choisit de lisser les extrémités de l'ombre 
   $plot->barShadow->smooth(TRUE); 

   // Une fois votre histogramme correctement paramétré, il est nécessaire de l'ajouter au graphique 
   $graph->add($plot); 

   // Afficher à l'écran 
   $graph->draw(); 
le message d'erreur étant le suivant :
unserialize() [function.unserialize]: Error at offset 9 of 124 bytes in /homepages/.../detail_note_match.php on line 37