Ich   Entwicklung   Lösungen Apache PHP mySQL  
 

Domain-Statistik

Wenn Sie (wie auf intermitto.net) Ihre Webseite mit PHP betreiben und die HTML-Ausgabe dynamisch je nach übergebenem Parameter erstellen, dann helfen Ihnen die üblichen Statistiken des Webservers meist nicht weiter. Es wird immer nur die index.php aufgerufen, die meisten Statistik-Programme (wie beispielsweise Webalizer) können Ihnen also keine Auskunft darüber geben, welche Seiten besucht wurden.

Durch ein kurzes PHP-Skript und eine mySQL-Tabelle können Sie trotzdem Seiten-Statistiken erzeugen. Für eine grafische Auswertung ist dann etwas mehr PHP erforderlich, ich gebe Ihnen eine kleine Einführung.

Die Tabelle

Wir benutzen für unsere Statistiken acht Felder, wir speichern tagesbezogene Daten. Falls Sie auch die Uhrzeit speichern möchten, erweitern Sie die Tabelle und das Skript entsprechend. In den folgenden Beispielen heißt die Tabelle in_log, die Feldnamen und -eigenschaften können Sie dem folgenden SQL-Skript entnehmen:

CREATE TABLE `in_log` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `count` int(10) unsigned NOT NULL default '0',
  `year` varchar(4) NOT NULL default '',
  `month` char(2) NOT NULL default '',
  `day` char(2) NOT NULL default '',
  `main` varchar(60) NOT NULL default '',
  `site` varchar(60) NOT NULL default '',
  `sub` varchar(60) NOT NULL default '',
  PRIMARY KEY  (`id`)
);

Das Speichern eines Zugriffs

Die unten benutzte Funktion sitelog() ermöglicht in Zusammenarbeit mit der oben beschriebenen Tabelle eine Speicherung mit einer Navigationstiefe bis maximal drei. Wird, wie bei intermitto.net, die dritte Ebene nicht genutzt, wird einfach ein leerer String gespeichert:

<?php
function sitelog($main, $site, $sub, $tableName) {
    $year = date("Y");
    $month = date("n");
    $day = date("d");
    $statement = "SELECT count, id FROM ".$tableName;
    $statement.= " WHERE year='".$year."' AND month='".$month."' AND day='".$day."'";
    $statement.= " AND main='".$main."' AND site='".$site."' AND sub='".$sub."'";
    $ergebnis = @mysql_query($statement);

    $count = @mysql_fetch_row($ergebnis);
    if(!empty($count[0])) {
        $count[0] += 1;
        $statement = "UPDATE ".$tableName." SET count='".$count[0]."' WHERE id='".$count[1]."'";
    } else {
        $statement = "INSERT INTO ".$tableName;
        $statement.= " SET count='1', year='".$year."', month='".$month."', day='".$day."',";
        $statement.= " main='".$main."', site='".$site."', sub='".$sub."'";
    }
    @mysql_query($statement);
}
?>

Um die Tabelle nicht unnötig groß werden zu lassen, wird nicht für jeden Zugriff ein neuer Datensatz angelegt. Stattdessen steht jeder Datensatz für eine Kombination aus Datum und besuchter Seite, es wird jeweils die Anzahl der Zugriffe gespeichert.

Der Aufruf geschieht dann in der index.php und sieht dann beispielsweise so aus:

sitelog($thema, $seite, "", "in_log");

Wir nehmen hier an, dass eine Navigationstiefe vorhanden ist, d.h. Aufrufe von der Form index.php?thema=foo&seite=bar sind. Da wir nur zwei Parameter benötigen bleibt der dritte leer. Der vierte Parameter gibt den Tabellennamen an.

Die Auswertung

Ich zeige Ihnen hier im Ansatz, wie Sie die gespeicherten Daten auswerten können. Das Ergebnis wird eine Tagesstatistik sein, wie sie auch für intermitto.net existiert.

Festlegen des anzuzeigenden Monats

Zuerst wollen wir ein Auswahlfeld für den anzuzeigenden Monat anbieten. Dazu geben wir an, in welchem Monat und Jahr die Statistiken anfangen ($startYear und $startMonth). In einer for-Schleife erzeugen wir die option-Elemente, wobei die Schleife abgebrochen wird, sobald der aktuelle Monat erreicht ist.

<form method="post" action="/?thema=start&amp;seite=statistik.tag">
<p>Wählen Sie den anzuzeigenden Monat: <select name="monthselection">
<?php

$aktYear = date("Y");
$aktMonth = date("n");
$startYear = 2005;
$startMonth = 3;

if(empty($_POST["monthselection"])) {
    $selMonth = $aktMonth;
    $selYear = $aktYear;
} else {
    $montharray = explode("-", $_POST["monthselection"]);
    $selMonth = $montharray[0];
    $selYear = $montharray[1];
}

for($year = $startYear; $year <= $aktYear; $year++) {
    for($month = 1; $month <= 12; $month++) {
        if(($year == $startYear) && ($month < $startMonth)) continue;
        if(($year == $aktYear) && ($month > $aktMonth)) break;
        echo "<option value=\"".$month."-".$year."\"";
        if(($month == $selMonth) && ($year == $selYear)) {
            echo " selected=\"selected\"";
        }
        echo ">".$month."/".$year."</option>";
    }
}
?>
</select> <input type="submit" value="Aktualisieren" /></p>
</form>

Natürlich müssen Sie für Ihre Webseite einige Anpassungen vornehmen, beispielsweise das action-Attribut des form-Elements anpassen.

Funktion zum Anzeigen der Statistik einer Seite

Die folgene Funktion nutzen wir später, um eine Tabelle auszugeben. Sie zeigt die Anzahl der Zugriffe an den Tagen des Monats an.

<?php
function displayStat($stat, $main, $site, $maxDay) {
    echo "<table class='startBackTable'>";
    echo "<tr>";
    echo "<td colspan='".$maxDay."'>".$site."</td>";
    echo "</tr>";
    echo "<tr>";
    for($i = 1; $i <= $maxDay; $i++) {
        echo "<td>";
        if(!empty($stat[$main][$site][$i])) {
            echo "<img src='/images/lila.gif' width='10' height='".(2 * $stat[$main][$site][$i])."' />";
        }
        echo "</td>";
    }
    echo "</tr>";
    echo "<tr>";
    for($i = 1; $i <= $maxDay; $i++) {
        echo "<td>";
        if(empty($stat[$main][$site][$i])) {
            echo "0";
        } else {
            echo $stat[$main][$site][$i];
        }
        echo "</td>";
    }
    echo "</tr>";
    echo "<tr>";
    for($i = 1; $i <= $maxDay; $i++) {
        echo "<td>".$i."</td>";
    }
    echo "</tr>";
    echo "</table>";
}
?>

Aufruf der Funktion

Wir legen ein Array mit den Themen an, um die Reihenfolge der Anzeige bestimmen zu können:

$themen[] = "start";
$themen[] = "ich";
$themen[] = "entwicklung";
$themen[] = "loesungen";
$themen[] = "apache";
$themen[] = "php";
$themen[] = "mysql";

Schließlich führen wir die Datenbank-Abfrage aus und rufen die oben beschriebene Funktion auf:

<?php
$statement = "SELECT * FROM in_log WHERE year='".$selYear."' AND month='".$selMonth."'";
$ergebnis = @mysql_query($statement);
$maxDay = 1;
while($daten = @mysql_fetch_assoc($ergebnis)) {
    $stat[$daten["main"]][$daten["site"]][$daten["day"]] += $daten["count"];
    if($daten["day"] > $maxDay) $maxDay = $daten["day"];
}

for($i = 0; $i < count($themen); $i++) {
    echo "<h3>".$themen[$i]."</h3>";
    if(isset($stat[$themen[$i]])) {
        displayStat($stat, $themen[$i], "_index", $maxDay);
        foreach($stat[$themen[$i]] as $key => $value) {
            if($key != "_index") displayStat($stat, $themen[$i], $key, $maxDay);
        }
    }
}
?>

Seiten-Statistiken für intermitto.net

Schauen Sie sich die Statistiken für intermitto.net an, um das Ergebnis zu sehen:

Die Gesamtstatistik zeigt die Zugriffe insgesamt nach Monaten.

Die Monatsstatistik zeigt die Zugriffe auf verschiedene Webseiten nach Monaten.

Die Tagesstatistik zeigt die Zugriffe auf verschiedene Webseiten nach Tagen (für einen Monat).


Das Syntax-Highlighting der Codebeispiele wurde mit QFormat erreicht.

URL: www.intermitto.net/loesungen/skripte/statistik/
© 2004-05 Jens Becker - intermitto.net v5.1
Letzte Änderung: 23.08.2005

Home - Kontaktformular - Downloads - Suche und Sitemap - Impressum
Entwicklung - Problemlösungen - Tutorials: Apache PHP mySQL

user  pass