Probleme de generation d'images png en ligne

Eléphanteau du PHP | 30 Messages

08 août 2006, 11:01

Bonjour,

Alors là, j'en perds mon Latin.

Après un formulaire de renseignements (page 1), je génère 3 barres horizontales en dégradé de couleurs avec des triangles se positionnant à des valeurs calculées (page 2).
Après modifs, une nouvelle page m'affiche ces trois mêmes barres avec les nouvelles valeurs plus les anciennes en grisées (page 3).

En local sous PHP 5 (wamp5), tout fonctionne parfaitement, je me ballade entre mes formulaires et mes petits triangles s'affichent correctement.

Ex : page 3
Image

Mais une fois en ligne (sous PHP 4), tout se gâte. Les valeurs finales ne posent pas de problème (page 3). Mais étrangement, les premiers triangles ne se positionnent bien qu'aux premier affichage des pages 2 et 3. Si je recharge la page 2, si je reviens de la page 2 à la page 1 ou si je reviens de la page 3 à la page 2, toutes ces premieres valeurs se mettent à 0.

Ex : page 3
Image

J'utilise des variables de session pour mes paramètres. Avant et après l'affichage des barres, les variables sont toujours bien renseignées.
Pourtant, la gestion des premières valeurs calculées se comporte comme si, au deuxième passage, ces variables étaient vides ???

Je n'ai pas oublié le session_start() dans la page de génération de l'image et n'oubliez pas que le script fonctionne parfaitement en local.

Quelqu'un aurait-il une idée ? Merci d'avance.

Eléphanteau du PHP | 30 Messages

08 août 2006, 11:31

Si vous voulez plus de matière :

voici l'appel des fichiers générateurs des images :

Code : Tout sélectionner

<div align="center" class="Style10"><br><br>Consommation d'&eacute;nergie en kWh<sub>ep</sub>/m<sup>2</sup>.an<br><img src="genere_img_energie.php"><br>&Eacute;mission de CO<sub>2</sub> en kg<sub>&eacute;qCO2</sub>/m<sup>2</sup>.an<br><img src="genere_img_co2.php"><br>Co&ucirc;t de l'abonnement en &euro;/mois<br><img src="genere_img_couts.php"></div>
Et la gestion de l'affichage des triangles et de leurs valeurs pour la barre de consommation de l'énergie (la barre en elle même s'affiche correctement) :
// si on est sur la page 3
if (isset($_SESSION['result2']['consommation_energie_primaire']) && $_SESSION['result2']['consommation_energie_primaire']!=-1){
  if ($_SESSION['result2']['consommation_energie_primaire']>99)$offset=-7;
  elseif ($_SESSION['result2']['consommation_energie_primaire']<10)$offset=0;
  else $offset=-3;
  // on récupère la valeur de la consommation en énergie primaire.
  $ep2=$_SESSION['result2']['consommation_energie_primaire'];
  // si cette valeur dépasse le maximum, on la fixe au maximum
  if ($ep2>$maxi) $ep2=$maxi;
  // on met la valeur à l'échelle du graphique, on lui ajoute 10 d'offset
  $ep2=renvoiX($ep2,$maxi)+10;
  $values2 = array($ep2,20,$ep2+10,40,$ep2+20,20);
  // dessine le polygone
  imagefilledpolygon($image_energie, $values2, 3, $black);
  // ajout de la valeur
  imagestring($image_energie, 3, $ep2+$offset, 2, $_SESSION['result2']['indice_consommation_ep']." ".round($_SESSION['result2']['consommation_energie_primaire'],0), $black);
  if ($_SESSION['result']['consommation_energie_primaire']>99)$offset=-7;
  elseif ($_SESSION['result']['consommation_energie_primaire']<10)$offset=0;
  else $offset=-3;
  // on récupère la valeur de la consommation en énergie primaire.
  $ep=$_SESSION['result']['consommation_energie_primaire'];
  // si cette valeur dépasse le maximum, on la fixe au maximum
  if ($ep>$maxi) $ep=$maxi;
  // on met la valeur à l'échelle du graphique, on lui ajoute 10 d'offset
  $ep=renvoiX($ep,$maxi)+10;
  $values = array($ep,60,$ep+10,40,$ep+20,60);
  $grey = imagecolorallocate($image_energie, 160, 160, 160);
  // dessine le polygone
  imagefilledpolygon($image_energie, $values, 3, $grey);
  // ajout de la valeur
  imagestring($image_energie, 3, $ep+$offset, 65, $_SESSION['result']['indice_consommation_ep']." ".round($_SESSION['result']['consommation_energie_primaire'],0), $grey);
}
// si on est sur la page 2 (nouvelles valeurs à -1)
else{
  if ($_SESSION['result']['consommation_energie_primaire']>99)$offset=-7;
  elseif ($_SESSION['result']['consommation_energie_primaire']<10)$offset=0;
  else $offset=-3;
  // on récupère la valeur de la consommation en énergie primaire.
  $ep=$_SESSION['result']['consommation_energie_primaire'];
  // si cette valeur dépasse le maximum, on la fixe au maximum
  if ($ep>$maxi) $ep=$maxi;
  // on met la valeur à l'échelle du graphique, on lui ajoute 10 d'offset
  $ep=renvoiX($ep,$maxi)+10;
  $values = array($ep,20,$ep+10,40,$ep+20,20);
  // dessine le polygone
  imagefilledpolygon($image_energie, $values, 3, $black);
  // ajout de la valeur
  imagestring($image_energie, 3, $ep+$offset, 2, $_SESSION['result']['indice_consommation_ep']." ".round($_SESSION['result']['consommation_energie_primaire'],0), $black);
}
Si ça peut vous aider !!!

Eléphanteau du PHP | 30 Messages

10 août 2006, 15:41

Bon, mon problème ne mobilise pas les foules.

Quelqu'un a-t-il eu vent d'un comportement étrange de la librairie GD en rapport avec une option de configuration PHP par exemple ?

Eléphant du PHP | 184 Messages

10 août 2006, 15:48

As-tu essayé de débuggé en affichant la valeur de la variable en question à chaques passages?
Je ne pense pas que le probleme soit lié à la librairie GD
Image

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

10 août 2006, 15:57

Pareil que graphisnet, le problème vient certainement des variables de session.

Au fait, ton code est très très difficile à lire, essaie de sauter des lignes de temps à autres :) (et utilise les balises
 plutôt que [code])

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

10 août 2006, 16:08

Pour info, j'ai recopié le contenu du code (une fois reformaté) à cette adresse : http://pastebin.ca/125215

Eléphanteau du PHP | 30 Messages

10 août 2006, 16:52

En fait c'est un truc de fou...

J'affiche le contenu de la variable de session AVANT et APRES l'appel du fichier de génération d'image et elle contient la bonne valeur (impossible de le faire PENDANT).

Tout se passe comme si, une fois gérée par le script de génération de PNG, la variable se retrouvait à zéro.

Si c'était le cas, elle ne pourrait alors retrouver son ancienne valeur une fois le script exécuté !
De plus, mon programme fonctionne bien en local.

Or, dans cette page je n'oublies pas mon session_start().

Bizarre aussi que tout fonctionne pour la deuxième valeur.

Un truc de fou je vous dit

Eléphanteau du PHP | 30 Messages

10 août 2006, 17:02

En fait, il y a bien un problème avec cette variable de session puisque la valeur qui s'affiche sur le triangle en est directement issue.

Le script de cette page la considère donc comme vide.

Et pourtant, ce même script fonctionne bien pour l'autre variable de session et fonctionne parfaitement en local.

C'est du délire.

Eléphanteau du PHP | 30 Messages

10 août 2006, 17:22

Bon

Si je vais directement à mon deuxième affichage (après n'être passé qu'une fois sur le premier), j'obtiens des images nickels, avec les bonnes valeurs (les anciennes et les nouvelles en grisées).
Et là si je rafraîchis ma page, rien ne bouge, tout se recalcule bien.

Si je reviens sur mon premier affichage ou si, alors que je viens de générer ce premier affichage il me prend l'envie de rafraîchr l'écran, alors les premières valeurs seront définitivement perdues pour le script de génération d'image uniquement (les valeurs s'affichent bien dans le programme).

Ces deux pages font appel au même script, et la partie concernant la génération des nouvelles images est calquée sur la génération des premières.
Tout se passe comme si une partie du script réagissait mieux que l'autre, alors qu'elles sont construites à l'identiques.

Eléphant du PHP | 184 Messages

10 août 2006, 17:24

Est ce que le formulaire en question se trouve sur la 1ere page énoncée ou avant?
Image

Eléphanteau du PHP | 30 Messages

10 août 2006, 17:35

Le programme débute par un formulaire général où on saisie les informations personnelles, je n'en parle donc pas.

Ensuite vient la première "vraie" page (page 1), un formulaire que l'on renseigne avec des informations sur son habitat.

La page 2 calcule notre consommation énergétique, elle affiche les résultats sous forme de valeurs ET sous forme de graphiques (les premières images générées).
Sur cette page, on peut, via un autre formulaire, améliorer son habitat.

La dernière page (page 3) nous affiche alors, après de nouveaux calculs, les valeurs corrigées de la consommation énergétique (les secondes images générées) pour pouvoir faire des comparaisons.

Seule la page 3 ne contient pas de formulaire.

Eléphant du PHP | 184 Messages

10 août 2006, 17:40

OK je vois,
La session est donc créée à partir de la page 1 grâce aux éléments du formulaire?
Il faut vérifier que si il existe une session d'ouverte sur la page 1 que la session ne soit pas recréée, d'où la remise à zéro vu qu'aucun paramêtre n'arrive.
Image

Eléphanteau du PHP | 30 Messages

10 août 2006, 17:48

Oui, c'est une explication plausible, sauf que si :

j'affiche le contenu d'une valeur utilisée dans le script de génération d'image (de la page 2 toujours, la page 3 fonctionne bien).

A la première génération, elle affichera la bonne valeur et le graphique sera ok !

A la seconde génération, elle affichera la bonne valeur et le graphique sera à 0.

Je précise qu'il s'agit d'une valeur issue d'une variable de session appellée par le script bien entendu.

Eléphant du PHP | 184 Messages

10 août 2006, 17:54

Lorsque tu affiches la valeur voulue à quel moment le fais tu? tente voir de l'afficher juste avant de générer l'image pour voir si cette valeur arrive à destination (si bien sûr l'affichage ne se fait pas à cet endroit).
Image

Eléphanteau du PHP | 30 Messages

10 août 2006, 18:01

Ben c'est là le hic, je le fais juste avant et juste après l'appel au script et la variable est ok.