8791 sujets

Développement web côté serveur, CMS

Bonjour,

Combinant :
"ob_start()"
"ob_end_flush()"
du mysql et
header ("Content-type: image/png"),
en fin de code php, j'obtiens une image vide (ou absente) !!!

C'est bizarre car il me semble que ces instructions sont bien placées dans le code.
Pouvez-vous m'aider à résoudre ce souci ?



<?php
	ob_start();
	date_default_timezone_set('Europe/Brussels');
	require_once("connexionMysql.inc.php");

	$lesjours = array("Di","Lu","Ma","Me","Je","Ve","Sa");
	$lesmois = array("Jan", "Fev", "Mar", "Avr", "Mai", "Jun", "Jui", "Aou", "Sep", "Oct", "Nov", "Dec");
	$dateRef = array();
	$visites = array();
	$dateligne1 = array();
	$dateligne2 = array();
	$jourVal=date("d");
	$moisVal=date("m");
	$anneeVal=date("Y");

	$nbBatons = 31;
	$intBatons = 26;
	$largeurImage = 840;
	$hauteurImage = 300;
	// légende de l'axe horizontal
	for ($indBaton=0 ; $indBaton<$nbBatons ; $indBaton++) {
		$dateRef[$indBaton] =
			date("Ymd",mktime(0,0,0,$moisVal,$jourVal-$nbBatons+1+$indBaton,$anneeVal));
		$dateligne1[$indBaton] = $lesjours[
			date("w",mktime(0,0,0,$moisVal,$jourVal-$nbBatons+1+$indBaton,$anneeVal))].
			date("d",mktime(0,0,0,$moisVal,$jourVal-$nbBatons+1+$indBaton,$anneeVal));
		$dateligne2[$indBaton] = $lesmois[
			date("m",mktime(0,0,0,$moisVal,$jourVal-$nbBatons+1+$indBaton,$anneeVal))-1];
	}
	// lecture des statistiques
	for ($indBaton=0 ; $indBaton<$nbBatons ; $indBaton++) {
		$annee = substr($dateRef[$indBaton],0,4);
		$mois =  substr($dateRef[$indBaton],4,2);
		$jour =  substr($dateRef[$indBaton],6,2);
		$journee="jour".$jour;
		$reqVisite="SELECT * FROM visites".
			" WHERE annee= '".$annee."' AND mois= '".$mois."' ";
		$resVisite=mysql_query($reqVisite);
		$record=mysql_fetch_array($resVisite);
		$visites[$indBaton] = $record["$journee"];
	}
	mysql_close($connexion);

	// préparation du graphique
 	header ("Content-type: image/png");
	$decalageG = 10;
	$decalageD = 10;
	$decalageH = 10;
	$decalageB = 20;
    $im = ImageCreate ($largeurImage, $hauteurImage)  
            or die ("Erreur lors de la création de l'image");          
    $blanc = ImageColorAllocate ($im, 255, 255, 255);  
    $noir = ImageColorAllocate ($im, 0, 0, 0);
    $bleu_fonce = ImageColorAllocate ($im, 75, 130, 195); 
    $bleu_clair = ImageColorAllocate ($im, 95, 160, 240);          
	
    // on dessine un trait horizontal pour représenter l'axe du temps     
    ImageLine ($im, $decalageG, $hauteurImage-$decalageB, $largeurImage-$decalageD, $hauteurImage-$decalageB, $noir);
	// on affiche les jours 
	for ($indBaton=1; $indBaton<=$nbBatons; $indBaton++) { 
		ImageString ($im, 0, $decalageG + $indBaton*$intBatons-7, $hauteurImage-$decalageB+2, $dateligne1[$indBaton-1], $noir);
		ImageString ($im, 0, $decalageG + $indBaton*$intBatons-7, $hauteurImage-$decalageB+10, $dateligne2[$indBaton-1], $noir);
	}	
	// calcul de l'échelle de l'axe vertical
	$echelle = array (5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000, 25000, 50000);
	$visitesMax = max($visites);
	$echelleMax = max($echelle);
	if ($visitesMax > 0) {
		for ($ech=0; $ech<=$echelleMax-1; $ech++) { 
			if ($visitesMax <= $echelle[$ech]) {
				$visitesMax = $echelle[$ech];
				$ech=$echelleMax;
			}
		}
	}
     
    // on dessine un trait vertical pour représenter le nombre de visites 
    ImageLine ($im, $decalageG, $decalageH, $decalageG, $hauteurImage - $decalageB, $noir);
    
	// on affiche les 5 ou 10 divisions des maxima de visites
	// la dernière est l'extrémité haute de l'axe vertical
	if (($visitesMax == 5) || ($visitesMax == 25)) {
		$nbTraits=5;
	} else {
		$nbTraits=10;
	}
	$fraction = round(($hauteurImage - $decalageB - $decalageH) / $nbTraits);
	for ($barre=1; $barre<=($nbTraits-1); $barre++) { 
		ImageLine ($im, $decalageG - 3, $decalageH + $barre * $fraction, $decalageG + 3, $decalageH + $barre * $fraction, $noir);
	}
	
	// tracé des batons
	if ($visitesMax > 0) {
		for ($ind=1; $ind<=$nbBatons; $ind++) {
			$hauteurImageRectangle = round((($visitesMax - $visites[$ind-1]) * ($hauteurImage - $decalageB - $decalageH))/$visitesMax); 
			if ($visites[$ind-1] > 0) {
				ImageFilledRectangle ($im, $decalageG + $ind*$intBatons-9, $hauteurImageRectangle + $decalageH + 0, $decalageG + $ind * $intBatons + 9, $hauteurImage - $decalageB, $noir); 
				ImageFilledRectangle ($im, $decalageG + $ind*$intBatons-6, $hauteurImageRectangle + $decalageH + 1, $decalageG + $ind * $intBatons + 6, $hauteurImage - $decalageB, $bleu_fonce); 
				ImageFilledRectangle ($im, $decalageG + $ind*$intBatons-3, $hauteurImageRectangle + $decalageH + 2, $decalageG + $ind * $intBatons + 3, $hauteurImage - $decalageB, $bleu_clair);
			}
			ImageString ($im, 0, $decalageG + $ind*$intBatons-7, $hauteurImageRectangle, $visites[$ind-1], $noir); 
		}
	}
	
    // et c'est fini... 
    ImagePng ($im);
	ob_end_flush();
?> 

Modifié par jytest (04 Apr 2011 - 11:08)
Salut,

comme je ne sais pas comment est structurée ta table j'ai remplacé
		$reqVisite="SELECT * FROM visites".
			" WHERE annee= '".$annee."' AND mois= '".$mois."' ";
		$resVisite=mysql_query($reqVisite);
		$record=mysql_fetch_array($resVisite);
		$visites[$indBaton] = $record["$journee"];
par
$visites[$indBaton] = rand(0, 100);
et ça fonctionne...

Peut-être que tu devrais vérifier le contenu de la table en question ou que la requête ne plante pas :
$resVisite = mysql_query($reqVisite) or die(mysql_error()); 


Edit: tu pourrais aussi faire un
var_dump($record["$journee"]);
à chaque itération.
Modifié par Heyoan (04 Apr 2011 - 15:03)
Merci Heyoan !!!
Tu m'as mis la puce à l'oreille...
Vu que j'étais sûr que ma table est bien structurée,
l'erreur ne pouvait être qu'ici...

Bizarrement...
Mon code marche nickel quand je remplace
require_once("connexionMysql.inc.php");


qui contient
<?php
   $connexion=mysql_connect("xxx.be.mysql","yyy_be","12345678");
   mysql_select_db("yyy_be");
?>


directement par
$connexion=mysql_connect("xxx.be.mysql","yyy_be","12345678");
mysql_select_db("yyy_be");


Bizarre !!!
Pourriez-vous m'expliquer pourquoi ???

jyd
Modifié par jytest (05 Apr 2011 - 04:35)
jytest a écrit :
Pourriez-vous m'expliquer pourquoi ???
Eh bien à priori le require_once plante : chemin ou nom du fichier incorrect(s).
Encore plus bizarre...
Les nom de programme et chemin sont pourtant bien corrects...

C'est donc le mystère le plus complet !!!