8797 sujets

Développement web côté serveur, CMS

Bonjour à tous.

Profitant du mauvais temps, je me déchaîne sur un petit programme de statistiques en php.
Oui mais voilà, cela ne fonctionne pas !
Pourrez-vous me consacrer un peu de temps et m'aider à résoudre ce mystère, car je début en mySQL.

J'ai à l'intérieur :
- un ob_start
- du mySQL
- un mySQL_close,
- un header, et
- un ob_end_flush.

J'ai découvert il y a peu, que tout ce petit monde ne cohabitait pas nécessairement très bien ensemble...

Je reçois un message d'erreur à la ligne :
header ("Content-type: image/png");

Warning: Cannot modify header information - headers already sent by (output started at...


Voici le code (intégral).
But du jeu, créer une page photo png reprenant toutes les stats
- sur 30 jours ($graphStat = 1),
- sur 12 mois ($graphStat = 2),
- sur 10 ans ($graphStat = 3).

D'avance merci.


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

	$graphStat = 1;
	$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");

	switch ($graphStat) {
	case 1:
		$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"];
		}
		break;
	case 2:
		$nbBatons = 12;
		$intBatons = 30;
		$largeurImage = 400;
		$hauteurImage = 300;
		// légende de l'axe horizontal
		for ($indBaton=0 ; $indBaton<$nbBatons ; $indBaton++) {
			$dateRef[$indBaton] =
				date("Ym",mktime(0,0,0,$moisVal-$nbBatons+1+$indBaton,$jourVal,$anneeVal));
			$dateligne1[$indBaton] = $lesmois[
				date("m",mktime(0,0,0,$moisVal-$nbBatons+1+$indBaton,$jourVal,$anneeVal))-1];
			$dateligne2[$indBaton] = 
				date("Y",mktime(0,0,0,$moisVal-$nbBatons+1+$indBaton,$jourVal,$anneeVal));
		}
		// lecture des statistiques
		for ($indBaton=0 ; $indBaton<$nbBatons ; $indBaton++) {
			$annee = substr($dateRef[$indBaton],0,4);
			$mois =  substr($dateRef[$indBaton],4,2);
			$visites[$indBaton]=0;
			$reqVisite="SELECT * FROM visites".
				" WHERE annee= '".$annee."' AND mois= '".$mois."' ";
			$resVisite=mysql_query($reqVisite);
			$record=mysql_fetch_array($resVisite);
			for ($jj=1 ; $jj<32 ; $jj++) {
				$journee = "jour".substr("00".$jj,-2);
				$visites[$indBaton] += $record["$journee"];
			}
		}
		break;
	case 3:
		$nbBatons = 10;
		$intBatons = 35;
		$largeurImage = 400;
		$hauteurImage = 300;
		// légende de l'axe horizontal
		for ($indBaton=0 ; $indBaton<$nbBatons ; $indBaton++) {
			$dateRef[$indBaton] =
				date("Y",mktime(0,0,0,$moisVal,$jourVal,$anneeVal-$nbBatons+1+$indBaton));
			$dateligne1[$indBaton] = 
				date("Y",mktime(0,0,0,$moisVal,$jourVal,$anneeVal-$nbBatons+1+$indBaton));
			$dateligne2[$indBaton] = "";
		}
		// lecture des statistiques
		for ($indBaton=0 ; $indBaton<$nbBatons ; $indBaton++) {
			$annee = substr($dateRef[$indBaton],0,4);
			$visites[$indBaton]=0;
			for ($mm=1 ; $mm<13 ; $mm++) {
				$mois =  substr("00".$mm,-2);
				$reqVisite="SELECT * FROM visites".
					" WHERE annee= '".$annee."' AND mois= '".$mois."' ";
				$resVisite=mysql_query($reqVisite);
				$record=mysql_fetch_array($resVisite);
				for ($jj=1 ; $jj<32 ; $jj++) {
					$journee = "jour".substr("00".$jj,-2);
					$visites[$indBaton] += $record["$journee"];
				}
			}
		}
		break;
	}
	mysql_close($connexion);
	
	// préparation du graphiqque
	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 divvisions 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 (20 Mar 2012 - 11:52)
C'est une erreur classique, il n'est pas possible de modifier l'entête du fichier dès que l'on en a envoyé une partie (même une ligne blanche).
Apparemment, d'après le message d'erreur, ce serait le fichier inclus le coupable...

Cela ne devrait pas se produire avec un vrai ob_start(); et non ob_start; !
Merci Julien.
Mille excuses pour la coquille !!!
Le message venait bien de là.
Modifié par jytest (20 Mar 2012 - 11:51)