probleme pour faire un graphique en fonction d'une requete

d0m
Mammouth du PHP | 1141 Messages

25 févr. 2008, 12:50

le message d'erreur signale que tu essaies d'obtenir une propriété d'une variable qui n'est pas un objet.
Est tu sûr que $QuelSOMME est un objet?
Essaie de l'afficher var_dump($QuelSOMME);

Eléphant du PHP | 183 Messages

25 févr. 2008, 14:05

Salut,

Merci de ta réponse,

alors j'ai mis le code que tu m'as donné , voici le résultat

Code : Tout sélectionner

bool(false) object(stdClass)#1 (6) { ["idligne"]=> string(1) "3" ["id"]=> string(1) "1" ["somme_quantitedef"]=> string(2) "20" ["somme_production"]=> string(4) "9000" ["annee"]=> string(4) "2008" ["mois"]=> string(1) "2" } object(stdClass)#2 (6) { ["idligne"]=> string(1) "3" ["id"]=> string(1) "2" ["somme_quantitedef"]=> string(2) "10" ["somme_production"]=> string(4) "7800" ["annee"]=> string(4) "2008" ["mois"]=> string(1) "3" } bool(false) bool(false) bool(false) bool(false) bool(false) bool(false) bool(false) bool(false) bool(false)
Je ne sais pas déchiffré ceci mais je ne vois pas $QuelSOMME

Mais c'est étrange car quand on met la requete seul dans artichow sa marche et dés que l'on met artichow sa ne fonctionne pas ...

Voici le code complet de ma page :
<?php
$db = mysql_connect("localhost","root","");
mysql_select_db("test",$db);

require_once "Artichow/BarPlot.class.php";

$graph = new Graph(700, 700);
$graph->setTiming(TRUE);
$graph->setAntiAliasing(TRUE);

$x = array();

for ($z=0; $z<12; $z++) { 
     $requete  = "SELECT rec.idligne, prod.id, SUM(rec.quantitedef) as somme_quantitedef, "; 
     $requete .= "SUM(prod.prod) AS somme_production, "; 
     $requete .= "    YEAR( rec.date_atelier ) AS annee, "; 
     $requete .= "    MONTH( rec.date_atelier ) AS mois "; 
     $requete .= "FROM rec AS rec "; 
         $requete .= "LEFT JOIN production AS prod ON prod.id = rec.idprod "; 
     $requete .= "WHERE  rec.idligne = 3 ";      
     $requete .= "    AND year(  rec.date_atelier ) = 2008 "; 
     $requete .= "    AND MONTH( rec.date_atelier ) = ".($z+1)." "; 
     $requete .= "GROUP BY MONTH(rec.date_atelier ) "; 

         $qr1 = mysql_query ($requete); 
     $QuelSOMME = ($qr1) ? mysql_fetch_object($qr1) : 0; 
     $x[] = ($QuelSOMME->somme_production == 0) ? 0 : ($QuelSOMME->somme_quantitedef / $QuelSOMME->somme_production) * 1000000; 

} 


$y = array( 
'Janvier', 
'Février', 
'Mars', 
'Avril', 
'Mai', 
'Juin', 
'Juillet', 
'Août', 
'Septembre', 
'Octobre', 
'Novembre', 
'Décembre' 
);

$plot = new BarPlot($x);

$plot->setSpace(6, 6, 10, 10);

$plot->setBarColor(new Color(100, 100, 100, 50));

$plot->label->hideFirst(TRUE);
$plot->label->hideLast(TRUE);
$plot->label->set($x);
$plot->label->move(0, -23);
$plot->label->setBackgroundGradient(new LinearGradient(new Color(250, 250, 250, 10), new Color(255, 200, 200, 30), 0));
$plot->label->border->setColor(new Color(20, 20, 20, 20));
$plot->label->setPadding(0, 0, 0, 1);
$plot->label->setFont(new Tuffy(10));

$plot->setBackgroundGradient(new LinearGradient(new Color(210, 210, 210), new Color(255, 255, 255), 0));

$plot->grid->setBackgroundColor(new Color(235, 235, 180, 60));

$plot->yAxis->setLabelPrecision(2);
$plot->yAxis->label->setFont(new Tuffy(8));

$plot->xAxis->setLabelText($y);
$plot->xAxis->label->setFont(new Tuffy(8));
$plot->xAxis->label->setAngle(45);

$plot->legend->add($plot, "Test", LEGEND_BACKGROUND);
$plot->legend->setModel(LEGEND_MODEL_BOTTOM);
$plot->legend->setPadding(10, 10, 10, 10);
$plot->legend->setPosition(0,0);
$plot->legend->setTextMargin(8, 0);

$graph->add($plot);
$graph->draw();
?>
J'utilise Artichow/BarPlot.class.php comme librairie d'artichow.


J'ai mis ceci :
for ($z=0; $z<12; $z++) { 
     $requete  = "SELECT rec.idligne, prod.id, SUM(rec.quantitedef) as somme_quantitedef, "; 
     $requete .= "SUM(prod.prod) AS somme_production, "; 
     $requete .= "    YEAR( rec.date_atelier ) AS annee, "; 
     $requete .= "    MONTH( rec.date_atelier ) AS mois "; 
     $requete .= "FROM rec AS rec "; 
         $requete .= "LEFT JOIN production AS prod ON prod.id = rec.idprod "; 
     $requete .= "WHERE  rec.idligne = 3 ";      
     $requete .= "    AND year(  rec.date_atelier ) = 2008 "; 
     $requete .= "    AND MONTH( rec.date_atelier ) = ".($z+1)." "; 
     $requete .= "GROUP BY MONTH(rec.date_atelier ) "; 

         $qr1 = mysql_query ($requete); 
     $QuelSOMME = ($qr1) ? mysql_fetch_object($qr1) : 0; 
		
     $x[] = 2; 

	 
	 print_r($QuelSOMME);

	 
} 
J'obtiens :
stdClass Object
(
    [idligne] => 3
    [id] => 1
    [somme_quantitedef] => 20
    [somme_production] => 9000
    [annee] => 2008
    [mois] => 2
)
stdClass Object
(
    [idligne] => 3
    [id] => 2
    [somme_quantitedef] => 10
    [somme_production] => 7800
    [annee] => 2008
    [mois] => 3
)
Je comprend pas pourquoi sa marche sans artichow et avec artichow sa bug.
_________
Fabien

d0m
Mammouth du PHP | 1141 Messages

25 févr. 2008, 14:49

Var_dump te donne la structure de ta variable, son contenu avec les types.
Ton résultat de var_dump est en fait plusieurs résultat (les uns à la suite des autres).
Tu as 2 types de résultats :
Un objet :

Code : Tout sélectionner

object(stdClass)#1 (6) { ["idligne"]=> string(1) "3" ["id"]=> string(1) "1" ["somme_quantitedef"]=> string(2) "20" ["somme_production"]=> string(4) "9000" ["annee"]=> string(4) "2008" ["mois"]=> string(1) "2" }
avec comme champs idligne, id, somme_quantitedef,...
et 0 (représenté en fait par un booléen) :

Code : Tout sélectionner

bool(false)

Ton problème n'a rien à voir avec Artichow.
Ce code
$QuelSOMME = ($qr1) ? mysql_fetch_object($qr1) : 0; 
met dans la variable $QuelSOMME l'objet représentant l'enregistrement sql si mysql_fetch_object($qr1) ne renvoie pas false c'est à dire si il y un encore un enregistrement à parcourir dans le résultat sql $qr1.
Si on arrive à la fin du parcours ou sil il n'y a carrément pas d'enregistrement retourné, $QuelSOMME prendra la valeur 0 (ou false).

Mais après tu essaie d'accéder directement aux champs de $QuelSOMME.
$QuelSOMME->somme_production
sans même tester la valeur de $QuelSOMME.
Et dans le cas où elle vaut 0(false), tu n'as tout pas de champ car $QuelSOMME mais un booléen valant 0.

Il faut donc mettre dans ton tableau x que les valeurs lorsque $QuelSOMME ne vaut pas 0.
Tu peux par exemple faire une boucle qui va remplir le tableau x seulement si on a une enregistrement d'extrait avec un code de ce genre :
$qr1 = mysql_query ($requete); 
while($QuelSOMME = mysql_fetch_object($qr1)){
     $x[] = ($QuelSOMME->somme_production == 0) ? 0 : ($QuelSOMME->somme_quantitedef / $QuelSOMME->somme_production) * 1000000; 
}

Eléphant du PHP | 183 Messages

25 févr. 2008, 15:02

Merci pour toutes les explications

sa fonctionne !!!

Cependant il faudrai que sur mon graphique sa me fasse apparaitre meme si le résultat est égal a 0 car actuellement en absicsse j'ai que les mois ou il y a des résultats hors il me faut les 12 mois de l'année. :)
_________
Fabien

Mammouth du PHP | 881 Messages

25 févr. 2008, 16:26

Tu peux leur donner une valeur de 1. 1 erreur par million, ce n'est pas significatif, mais ça forcera le système à donner une des résultats
Soyez artisans de paix

d0m
Mammouth du PHP | 1141 Messages

25 févr. 2008, 17:34

Ou même carrément la valeur 0, tu teste après exécution de ta requête le nombre de lignes :
$qr1 = mysql_query ($requete);
//pas de valeurs pour le mois
if(mysql_num_rows($qr1)==0)
  $x[] = 0;
//au moins une valeur pour le mois
else{
  while($QuelSOMME = mysql_fetch_object($qr1)){
     $x[] = ($QuelSOMME->somme_production == 0) ? 0 : ($QuelSOMME->somme_quantitedef / $QuelSOMME->somme_production) * 1000000; 
  }
}
Mais je pense que tu peux faire une seule requête pour les 12 mois, ça sera moins couteux en ressources.

Parce que pour l'instant tu groupe par mois alors que tu fais la requête pour un seul mois. Ta requête ne renvoie donc qu'un seul résultat.

Tu initialises un tableau à 12 emplacements initialisés chacun à 0.
Tu peux faire la requête 1 seule fois pour tous les mois de l'année, grouper par mois et parcourir les résultats :
tu places dans le tableau la valeur calculée à partir de l'enregistrement.
Si certains mois ne sont pas là, ce n'est pas grave, l'élément de ce mois sera déjà à 0 dans le tableau.

Mammouth du PHP | 881 Messages

26 févr. 2008, 07:14

C'est bien vrai. Puisqu'il te faut vérifier les valeurs obtenues et les traiter, aussi bien garnir le tableau de zéros là où aucun résultat n'est obtenu et de résultats là où c'est opportun. La précaution de faire 12 requête n'est plus valide dès le moment où il faut contre-vérifier et traiter.
Soyez artisans de paix