[PHP/SQL] Balkendiagramme (Besucherstatistiken)

mbassus

Well-known member
ID: 104267
L
23 April 2006
5.071
449
Hallihallo,...

Kurze Vorgeschichte:
ich hab 2 Tabellen:

a) (besucher_real_stats) -> echte besucher
ID (auto_increment) | datum (datetime) | realdate | ip
b) (besucher_stats) -> klicks auf der seite, aktivität
ID (auto_increment) | datum (datetime)

In besucher_real_stats wird jede IP maximal einmal am Tag eingetragen
in besucher_stats wird jeder schritt, wie bei nem Tracking system eingebunden.

Was ist die beste möglichkeit um das ganze (meinetwegen die letztn 7-10 Tage) in ein Balkendiagramm zu bringen?

Hat da jemand nen Codeschnippsel, ein gutes Tut oder direkt nen Lösungsvorschlag?

Darüber wär ich sehr dankbar ;), denn mit Grafikzeugs in PHP bin ich n00b.

Liebe Grüße,
Martin.
 
Könnte eventuell so ablaufen:

:arrow: Werte der letzen x Tage abfragen
:arrow: Höchsten Wert bestimmen und diesen auf die volle Breite setzen (eventuell mit Rand, jenachdem wie man will)
:arrow: Die anderen Breite relativ zum höchsten Wert bestimmen
:arrow: Einen Balken mit der jeweiligen Breite des aktuellen Werts zeichnen.

Die GDLib ist ansonsten eigentlich selbsterklärend ...

Gruß
 
:rtfm:
Blöde Frage: Versuchst du deine Probleme iegentlich auch noch selbst zu lösen? Alle paar Tage nen neues Thema, wo nen Fehler in einem Codeschnippsel gefunden werden soll oder du einen neuen Ansatz brauchst. Informatik ist die strukturierte Prooblemlösung und net einfach was in die Tasten hauen. Mit einen DinA4-Blatt + Kulli wärst du auf die Lösung von Johnson auch alleine gekommen.

Und die gdlib ist in so gut wie jeder PHP-Installation vorhanden :roll: Ohne das könntest du keinen Grafen in ein ein Bild malen
 
:rtfm:
Blöde Frage: Versuchst du deine Probleme iegentlich auch noch selbst zu lösen?
Nein. Edit.. ich meine natürlich: Ja o_O
ice-breaker schrieb:
Alle paar Tage nen neues Thema, wo nen Fehler in einem Codeschnippsel gefunden werden soll oder du einen neuen Ansatz brauchst. .
Das ist mir neu ;) Wenn sich eine schnelle Lösungshilfe bietet, ist dieses Forum dafür gedacht, warum also nicht nachfragen ;) ?
 
BTW: Ice .. ich hab ja schon lang was,.. aber das will ewig nich.. vll. findet sich hier auch ein fehler.. (war ein Codeschnippsel..) ich versteh einfach nich, warum der einen Puren Text ausgibt..

Lokal schein ich´s nich drauf zu haben.. (bla bla bla kann nicht ausgegeben werden, weil die Grafik einen Fehler enthällt) ..
Und online zeigts ledeglich einen text an.. ( %VIERECKPNG ³] und tausend verwirrende zeichen, aber keine Grafik.. )

PHP:
<?php
echo "u";
//Konfiguration

$TableBesucher = "besucher_real_stats";


//Allgemeine Diagrammdaten

$Diagrammbreite = 500;
$Diagrammhoehe = 400;

$Diagrammtitel = "Besucherauswertung";


//Ränder & Abstände

$AbstandAussen = 3;

$RandOben = 30;
$RandLinks = 30;
$RandUnten = 80;
$RandRechts = 20;


//Diagrammfarben

$HintergrundfarbeR = 255;
$HintergrundfarbeG = 255;
$HintergrundfarbeB = 255;

$HintergrundfarbeAuswertungsbereichR = 224;
$HintergrundfarbeAuswertungsbereichG = 224;
$HintergrundfarbeAuswertungsbereichB = 224;

$TextfarbeR = 64;
$TextfarbeG = 64;
$TextfarbeB = 64;

$AchsenfarbeR = 0;
$AchsenfarbeG = 0;
$AchsenfarbeB = 0;

$BalkenfarbeR = 32;
$BalkenfarbeG = 128;
$BalkenfarbeB = 196;


#######################################

//Daten aus der MySQL-Tabelle auslesen


$ResultPointer = mysql_query("SELECT SUBSTRING(Datum, 1, 10) Datum, COUNT(ID) AnzahlBesucher FROM $TableBesucher GROUP BY SUBSTRING(Datum, 1, 10) ORDER BY SUBSTRING(Datum, 1, 10)");

for($i=0, $XWerte="", $YWerte=""; $i<mysql_num_rows($ResultPointer); $i++)
{
    $Besucher = mysql_fetch_object($ResultPointer);
    $XWerte[] = $Besucher->Datum;
    $YWerte[] = $Besucher->AnzahlBesucher;
}


//Festlegung der Minima und Maxima der X- und Y-Werte

$XMin = 0;
$XMax = count($XWerte);

$Tmp = $YWerte;
sort($Tmp);
$YMin = $Tmp[0];
rsort($Tmp);
$YMax = $Tmp[0];


//Festlegung des Inhalttyps für den Webbrowser

header("Content-type: image/png");
$Grafik = imagecreatetruecolor($Diagrammbreite, $Diagrammhoehe);


//Festlegung der verwendeten Farben

$Textfarbe = imagecolorallocate($Grafik, $TextfarbeR, $TextfarbeG, $TextfarbeB);
$Hintergrundfarbe = imagecolorallocate($Grafik, $HintergrundfarbeR, $HintergrundfarbeG, $HintergrundfarbeB);
$HintergrundfarbeAuswertungsbereich = imagecolorallocate($Grafik, $HintergrundfarbeAuswertungsbereichR, $HintergrundfarbeAuswertungsbereichG, $HintergrundfarbeAuswertungsbereichB);
$Achsenfarbe = imagecolorallocate($Grafik, $AchsenfarbeR, $AchsenfarbeG, $AchsenfarbeB);
$Balkenfarbe = imagecolorallocate($Grafik, $BalkenfarbeR, $BalkenfarbeG, $BalkenfarbeB);


//Allgemeinen Hintergrund und Auswertungsbereich einfärben

imagefill($Grafik, 0, 0, $Hintergrundfarbe);
imagefilledrectangle($Grafik, $AbstandAussen+$RandLinks, $AbstandAussen+$RandOben, $Diagrammbreite-1-$AbstandAussen-$RandRechts, $Diagrammhoehe-1-$AbstandAussen-$RandUnten, $HintergrundfarbeAuswertungsbereich);


//Allgemeine Berechnungen zur X- und Y-Achse

if($YMax>10)
{
    $YMaxAbstand = 10;
}
else
{
    $YMaxAbstand = $YMax;
}

$YAbstand = ($Diagrammhoehe-2*$AbstandAussen-$RandOben-$RandUnten-10)/$YMaxAbstand;
$YWertHoehe = ($Diagrammhoehe-2*$AbstandAussen-$RandOben-$RandUnten-10)/$YMax;
$XAbstand = ($Diagrammbreite-2*$AbstandAussen-$RandRechts-$RandLinks-10)/$XMax;
$Balkendicke = ($XAbstand-4)/2;


//Hilfslinien einzeichnen

imagesetstyle($Grafik, array($Achsenfarbe, $Achsenfarbe, IMG_COLOR_TRANSPARENT, IMG_COLOR_TRANSPARENT));

for($i=0; $i<$YMaxAbstand; $i++)
{
    imageline($Grafik, $AbstandAussen+$RandLinks, $AbstandAussen+$RandOben+10+($YAbstand*$i), $Diagrammbreite-$AbstandAussen-$RandRechts-1, $AbstandAussen+$RandOben+10+($YAbstand*$i), IMG_COLOR_STYLED);
}


//X-Achse einzeichnen

imageline($Grafik, $AbstandAussen+$RandLinks, $Diagrammhoehe-$AbstandAussen-$RandUnten, $Diagrammbreite-$AbstandAussen-$RandRechts, $Diagrammhoehe-$AbstandAussen-$RandUnten, $Achsenfarbe);
imageline($Grafik, $AbstandAussen+$RandLinks, $Diagrammhoehe-$AbstandAussen-$RandUnten-1, $Diagrammbreite-$AbstandAussen-$RandRechts, $Diagrammhoehe-$AbstandAussen-$RandUnten-1, $Achsenfarbe);
for($i=0; $i<$XMax; $i++)
{
    imageline($Grafik, $AbstandAussen+$RandLinks+($XAbstand*$i)+($XAbstand/2+3), $Diagrammhoehe-$AbstandAussen-$RandUnten-2, $AbstandAussen+$RandLinks+($XAbstand*$i)+($XAbstand/2+3), $Diagrammhoehe-$AbstandAussen-$RandUnten+2, $Achsenfarbe);
    imagestringup($Grafik, 1, $AbstandAussen+$RandLinks+($XAbstand*$i)+($XAbstand/2), $Diagrammhoehe-$AbstandAussen-$RandUnten+4+(imagefontwidth(1)*strlen($XWerte[$i])), $XWerte[$i], $Achsenfarbe);
}


//Y-Achse einzeichnen

imageline($Grafik, $AbstandAussen+$RandLinks, $AbstandAussen+$RandOben, $AbstandAussen+$RandLinks, $Diagrammhoehe-$AbstandAussen-$RandUnten, $Achsenfarbe);
imageline($Grafik, $AbstandAussen+$RandLinks+1, $AbstandAussen+$RandOben, $AbstandAussen+$RandLinks+1, $Diagrammhoehe-$AbstandAussen-$RandUnten, $Achsenfarbe);
for($i=0; $i<=$YMaxAbstand; $i++)
{
    imageline($Grafik, $AbstandAussen+$RandLinks-2, $AbstandAussen+$RandOben+10+($YAbstand*$i), $AbstandAussen+$RandLinks+2, $AbstandAussen+$RandOben+10+($YAbstand*$i), $Achsenfarbe);
    if($YMax>10)
    {
        imagestring($Grafik, 1, $AbstandAussen+$RandLinks-4-(imagefontwidth(1)*strlen(round($YMax-(($YMax/10)*$i), 0))), $AbstandAussen+$RandOben+10-(imagefontheight(1)/2)+($YAbstand*$i), round($YMax-(($YMax/10)*$i), 0), $Achsenfarbe);
    }
    else
    {
        imagestring($Grafik, 1, $AbstandAussen+$RandLinks-4-(imagefontwidth(1)*strlen($YMax-$i)), $AbstandAussen+$RandOben+10-(imagefontheight(1)/2)+($YAbstand*$i), $YMax-$i, $Achsenfarbe);
    }
}


//Werte einzeichnen

for($i=0; $i<$XMax; $i++)
{
    imagerectangle($Grafik, $AbstandAussen+$RandLinks+($XAbstand*($i+1))-($XAbstand/2-3)-$Balkendicke, $Diagrammhoehe-$AbstandAussen-$RandUnten-($YWertHoehe*$YWerte[$i]), $AbstandAussen+$RandLinks+($XAbstand*($i+1))-($XAbstand/2-3)+$Balkendicke, $Diagrammhoehe-$AbstandAussen-$RandUnten, $Achsenfarbe);
    imagefilledrectangle($Grafik, $AbstandAussen+$RandLinks+($XAbstand*($i+1))-($XAbstand/2-3)-$Balkendicke+1, $Diagrammhoehe-$AbstandAussen-$RandUnten-($YWertHoehe*$YWerte[$i])+1, $AbstandAussen+$RandLinks+($XAbstand*($i+1))-($XAbstand/2-3)+$Balkendicke-1, $Diagrammhoehe-$AbstandAussen-$RandUnten-2, $Balkenfarbe);
}


//Diagrammtitel einzeichnen

imagestring($Grafik, 5, $AbstandAussen+$RandLinks+($Diagrammbreite-(2*$AbstandAussen+$RandLinks+$RandRechts)-imagefontwidth(5)*strlen($Diagrammtitel))/2, $AbstandAussen, $Diagrammtitel, $Textfarbe);


// Ausgabe des Bildes und Freigabe des belegten Speichers
$header="Klicks";
imagepng($Grafik);
$text="bla";
box($header,$text,600);
?>
 
header angaben weg und error_reporting auf E^All stellen, oder log_errors aktivieren, bei bildern nen fehler zu finden ist etwas tricky
 
header angaben weg und error_reporting auf E^All stellen, oder log_errors aktivieren, bei bildern nen fehler zu finden ist etwas tricky
Ah, zu spät gelesen, ich habs anders gemacht.. ;)

Ich hab die Datei Standalone gemacht, per iframe eingebunden,.. so tuts..
Schwierig zu erklären das System, wie´s nich tat.. o_O

Aber trotzdem danke!
 
Lokal schein ich´s nich drauf zu haben.. (bla bla bla kann nicht ausgegeben werden, weil die Grafik einen Fehler enthällt) ..
Und online zeigts ledeglich einen text an.. ( %VIERECKPNG ³] und tausend verwirrende zeichen, aber keine Grafik.. )

Evtl. kein Header vergessen?

Das mit dem iframe... ist das aktuelle "Lösung".. oder das vorher?
 
omg, Beruf: Systeminformatiker | Softwareentwicklung
ohne Kommentare :roll: (Beruf verfehlt? - konnte ich mir net verkneifen)
IHK schrieb:
unterstützen Entwickler bei der Entwicklung und Realisierung von Lösungen für Kunden, der Analyse geforderter Funktionalitäten, der Konzipierung von Systemen und Softwarelösungen, der Auswahl von Datenübertragungsmedien und von Hard- und Softwarekomponenten;
montieren und prüfen Hardwarekomponenten, installieren und konfigurieren Komponenten und Geräte der Informationstechnologie, montieren und konfigurieren Sensoren und Aktoren;
installieren und konfigurieren Betriebssysteme und Netzwerke;
etc.
Naja, ich hab da was gefunden.
Der Beruf hat jedenfalls nicht viel mit Softwareentwicklung zu tun, sondenr mehr mit Support und Assistenz.
 
Soll ichn screenshot machn ;) ?
Du machst Ausgaben bevor die richtigen header gesendet werden, dann ist es kein Wunder dass Du unverständliches Zeugs bekommst und dein Browser es Dir als Text anzeigt und nicht als Grafik.

Bestimmt die IHK die Praktische Ausbildung und weiterbildung.. oder der Betrieb ? ;)
Es ist schwer das Gegenteil zu beweisen, aber der Satz (angenommen als rhetorische Frage und damit als Aussage) ist selbst unbewiesen und damit nichts weiter als eine seltsame Hypothese, bzw. dummes Geschwätz. :mrgreen:
 
Du machst Ausgaben bevor die richtigen header gesendet werden, dann ist es kein Wunder dass Du unverständliches Zeugs bekommst und dein Browser es Dir als Text anzeigt und nicht als Grafik.
Fast richtig. ;) Nicht komplett,.. aber dennoch aufmerksam

DocTrax schrieb:
Es ist schwer das Gegenteil zu beweisen, aber der Satz (angenommen als rhetorische Frage und damit als Aussage) ist selbst unbewiesen und damit nichts weiter als eine seltsame Hypothese, bzw. dummes Geschwätz. :mrgreen:
Ist alles unbewiesene Dummes Geschwätz? Das Universum ist unendlich.. (Geschwätz..) Das Universum ist nicht unendlich.. (Geschwätz)..

Denk mal über deine Aussage nach.. ;) Denk was du willst, geh nun woanders spielen.. die post´s hier werden sicherlich eh gelöscht, oder verschoben ;)
 
Fast richtig. ;) Nicht komplett,.. aber dennoch aufmerksam
Das sind eben so Dinge, die man sofort sieht. Ich habe das Script tatsächlich nicht genauer untersucht und zwar aus einem guten Grund:
Es ist ein grundsätzliches Problem von unvollständigen Codestücken, die Du schon öfter gepostet hast, und wie ice-breaker auch schon richtig bemerkt hat nicht gut nachzuvollziehen sind. Konkret fehlt diesesmal die zu Grunde liegende Tabellenstruktur, die Du nicht genannt hast. Man könnte sich natürlich den Aufwand machen die Tabellenstruktur aus dem Code zu rekonstrieren, aber wer will das schon wirklch?

Ist alles unbewiesene Dummes Geschwätz? Das Universum ist unendlich.. (Geschwätz..) Das Universum ist nicht unendlich.. (Geschwätz)..
Dieses Beispiel ist noch relativ leicht als Hypothese zu erkennen. Bei anderen Dingen wird es mitunter schwieriger.

die post´s hier werden sicherlich eh gelöscht, oder verschoben ;)
Unwahrscheinlich - noch führen wir eine gepflegte Diskussion.