zum einstand gleich mal ein kleines Problemchen. Wahrscheinlich bin ich das ganze nur falsch angegangen und sehe jetzt den Wald vor lauter Bäumen nicht. Also seid bitte nachsichtig ich lerne noch.
Ich möchte mir die Preisentwicklung eines Artikels aus der Datenbank grafisch anzeigen lassen. Funktioniert auch soweit ganz gut nur die Beschriftung der X-Achse bringt mich noch um den Verstand.
Hier erstmal der komplette Quellcode
PHP-Code:
header("Content-type: image/png");
require_once '../../class/bs.class.php';
$bs = new blueball_db_modul();
$string = $_GET['artikel'];
$qry = "select (bestellungenpositionen.Einkaufspreis/pow(10,bestellungenpositionen.Einkaufspreiseinheit)),bestellungenpositionen.rabattsatz1,bestellungenpositionen.Lieferdatum from artikel left join bestellungenpositionen on artikel.Artikel = bestellungenpositionen.Artikelnummer where bestellungenpositionen.Bestellmenge not like '0' AND artikel.Artikel='{$string}' order by bestellungenpositionen.Lieferdatum asc;";
$data = $bs->MySQLQuery($qry);
$qry = "select min(bestellungenpositionen.Einkaufspreis/pow(10,bestellungenpositionen.Einkaufspreiseinheit)),max((bestellungenpositionen.Einkaufspreis/pow(10,bestellungenpositionen.Einkaufspreiseinheit))) from artikel left join bestellungenpositionen on artikel.Artikel = bestellungenpositionen.Artikelnummer where bestellungenpositionen.Bestellmenge not like '0' AND artikel.Artikel='bl-00004' order by bestellungenpositionen.Lieferdatum asc;";
$ek_max_min = $bs->MySQLQuery($qry);
$kw_first_day = strtotime(date(Y,strtotime($data[0][2])) ."-W".date(W,strtotime($data[0][2])));
$kw_last_day = strtotime(date(Y,strtotime($data[(count($data)-1)][2])) ."-W".date(W,strtotime($data[(count($data)-1)][2]))."-7");
$anz_tage = ($kw_last_day - $kw_first_day)/86400;
$hoehe = (ceil($ek_max_min[0][1]*10)-floor($ek_max_min[0][0]*10))*10+75;
$breite = $anz_tage+125;
$hoehe_y = $hoehe-50;
// erstellen eines leeren Bildes mit 1024px Breite und 768px Höhe
$im = imagecreatetruecolor($breite, $hoehe);
// definieren der Farben
$background = imagecolorallocate($im, 201, 201, 201);
$black = imagecolorallocate($im, 0, 0, 0);
$red = imagecolorallocate($im, 255, 0, 0);
$green = imagecolorallocate($im, 0, 100, 0);
// Hintergrundfarbe für Bild setzen
imagefilledrectangle ($im, 0, 0, $breite,$hoehe, $background);
// Achsen
imageline($im,100,$hoehe_y,(100+$anz_tage+10),$hoehe_y,$black); // X-Achse
imageline($im,100,13,100,$hoehe_y,$black); // Y-Achse
// Pfeile
imageline($im,100+$anz_tage,$hoehe_y-2,(100+$anz_tage+10),$hoehe_y,$black); // X-Achse
imageline($im,100+$anz_tage,$hoehe_y+2,(100+$anz_tage+10),$hoehe_y,$black); // X-Achse
imageline($im,98,18,100,8,$black); // Y-Achse
imageline($im,102,18,100,8,$black); // Y-Achse
// Beschriftung X-Achse
for($j=0;$j<$anz_tage;$j+=7){
$x = 100+$j;
$kw = date(W,($kw_first_day+($j*86400))-7);
if($kw%4==1){
if($kw=='01'){
imagestring($im, 3, $x-14, $hoehe_y+32,date(Y,($kw_first_day+($j*86400))), $red);
imageline($im,$x,18,$x,$hoehe_y+30,$red);
}else{
imagestring($im, 3, $x-7, $hoehe_y+9,"$kw", $black);
imageline($im,$x,$hoehe_y,$x,$hoehe_y+7,$red);
}
}else{
imageline($im,$x,$hoehe_y,$x,$hoehe_y+5,$black);
}
}
// Differrenz zur Y 0 Achse
$min_y = floor($ek_max_min[0][0]*10)*10;
$max_y = ceil($ek_max_min[0][1]*10)*10;
// Beschriftung Y-Achse
for($j=$min_y;$j<=$max_y;$j+=10){
$y = $hoehe_y+$min_y-$j;
if($j%50==0){
imageline($im,90,$y,100,$y,$black);
imagestring($im, 3, 60, $y-6,number_format($j/100,2,',','.'), $black);
}else{//*/
imageline($im,95,$y,100,$y,$black);
imagestring($im, 3, $x-7, $hoehe_y+9,"$kw", $black);
}
}
// Diagramm schreiben
$last_x = 100;
$last_y = $hoehe_y;
foreach ($data as $value) {
$x = 100+(strtotime($value[2])-$kw_first_day)/86400;
$y = $hoehe_y + $min_y - ($value[0]*100);
imageline($im,$last_x,$last_y,$x,$y,$green);
imagestring($im, 3, $x, $y,$value[0], $black);
$last_x = $x;
$last_y = $y;
}
// Ausgabe des Bildes
imagepng($im);

Der Fehler liegt wohl hier irgendwo.
PHP-Code:
// Beschriftung X-Achse
for($j=0;$j<$anz_tage;$j+=7){
$x = 100+$j;
$kw = date(W,($kw_first_day+($j*86400))-7);
if($kw%4==1){
if($kw=='01'){
imagestring($im, 3, $x-14, $hoehe_y+32,date(Y,($kw_first_day+($j*86400))), $red);
imageline($im,$x,18,$x,$hoehe_y+30,$red);
}else{
imagestring($im, 3, $x-7, $hoehe_y+9,"$kw", $black);
imageline($im,$x,$hoehe_y,$x,$hoehe_y+7,$red);
}
}else{
imageline($im,$x,$hoehe_y,$x,$hoehe_y+5,$black);
}
}
Ich denke er kann die Wochen nicht richtig bestimmen. Mit
PHP-Code:
$kw%4==1
PHP-Code:
$kw = date(W,($kw_first_day+($j*86400))-7);
Kennt jemand vielleicht eine elegantere und vor allem funktionierend Lösung?
Viele Dank schon einmal.
Gruß Steve
Einen Kommentar schreiben: