Herkunft meiner Besucher

von Benutzer gelöscht | 2 | 6177 Aufrufe

Anzeige Hier werben

Was wollen wir erreichen?

Bild zu Herkunft meiner Besucher
Kuchendiagramm (erfundene Statistik)

Wir möchten alle Herkunft Urls speichern um eine Übersicht zu erhalten, woher die meisten Klicks der eigenen Seite sind.

Das ganze soll in einem Kuchendiagramm dargestellt werden.
Nur die Top 10, denn sonst wird das Diagramm unüberschaubar.

Vorweg

Dieser Artikel ist nicht unbedingt für Anfänger geeignet, denn es werden Funktionen benutzt, die nicht jeder Anfänger kennt.

benötigte Funktionen

Ich zähle hier keine Funktionen auf die man eigtl. wissen sollte!

Es wird außerdem vorausgesetzt dass der Leser eine Datenbankverbindung herstellen kann, sowie die Tabelle für das Script eintragen kann.

Die Tabelle für das Script

 
sql
1
2
3
4
5
6
CREATE TABLE `referer` (
  `host` varchar(100) character set latin1 NOT NULL,
  `count` mediumint(8) NOT NULL default '1',
  `lastupdate` int(10) NOT NULL,
  PRIMARY KEY  (`host`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Wie muss das Script funktionieren

  1. Den Hostnamen / die Domain des aktuellen Referes heraufinden
  2. Prüfen ob dieser bereits in der Tabelle in der Datenbank steht
    • Wenn ja dann nur Klicks um 1 erhöhen
    • Wenn nein dann neu hinzufügen mit einem Klick speichern
  3. Bei der Prüfung muss zusätzlich darauf geachtet werden, ob die Refererdomain die selbe wie die eigene ist

Die Klasse

Die Klasse ist durchkommentiert, ich hoffe, dass damit alles klar ist.

 
PHP
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
<?php
class referer
{
    
    /**
     * eigener hostname
     *
     * @access  private
     * @var     $_OWN_HOSTNAME      string
     */
    private $_OWN_HOSTNAME;
    
    /**
     * tabelle mit den gespeicherten referer
     *
     * @access  private
     * @var     $_DB_TABLE      string
     */
    private $_DB_TABLE;
    
    /**
     * konstruktor
     *
     * @access  public
     * @param   $_OWN_HOSTNAME      eigener hostname
     * @return  void
     */
    public function __construct($_OWN_HOSTNAME, $_DB_TABLE = 'referer')
    {
        $this -> _OWN_HOSTNAME = $_OWN_HOSTNAME;
        $this -> _DB_TABLE = mysql_real_escape_string($_DB_TABLE);
    }
    
    /**
     * prüft ob host vorhanden
     *
     * @access  public
     * @param   $_HOST          hostname
     * @return  bool
     */
    public function i_exists($_HOST)
    {
        // Zähle alle Hosts die in der Spalte host den übergebene Host haben
        $row = mysql_fetch_assoc(mysql_query("SELECT COUNT(host) hosts FROM ".$this -> _DB_TABLE." WHERE host = '".mysql_real_escape_string(strtolower($_HOST))."'"));
        // ein Host?
        if($row['hosts'] == 1)
            return TRUE;
        else
            return FALSE;
    }
    
    /**
     * fügt einen neuen referer hinzu
     *
     * @access  public
     * @param   $_HOST hostname
     * @return  bool
     */
    public function i_addReferer($_HOST)
    {
        // Trage neuen Host ein
        if(mysql_query("INSERT INTO ".$this -> _DB_TABLE." (host, lastupdate) VALUES ('".mysql_real_escape_string(strtolower($_HOST))."', ".time().")"))
            return TRUE;
        else
            return FALSE;
    }
    
    /**
     * erhöht count in tabelle
     *
     * @access  public
     * @param   $_HOST hostname
     * @return  bool
     */
    public function i_updateReferer($_HOST)
    {
        // Erhöhe count um 1 bei übergebenem Host
        if(mysql_query("UPDATE ".$this -> _DB_TABLE." SET count = count + 1, lastupdate = ".time()." WHERE host = '".mysql_real_escape_string(strtolower($_HOST))."'"))
            return TRUE;
        else
            return FALSE;
    }
    
    /**
     * zählt alle counts von referern zusammen
     *
     * @access  public
     * @return  int
     */
    public function i_countAllReferer()
    {
        // Zähle alle Counts aller Hosts zusammen
        $row = mysql_fetch_assoc(mysql_query("SELECT SUM(count) count FROM ".$this -> _DB_TABLE));
        return $row['count'];
    }
    
    public function i_countReferer()
    {
        // parsen des Referers, Rückgabe dieser Funktion ist ein Array
        $currentReferer = parse_url($_SERVER['HTTP_REFERER']);
        // wir brauchen nur den Host
        $currentReferer = $currentReferer['host'];
        // Alle Leerzeichen vorne und hinten entfernen und auf "Leerheit" prüfen
        // Sollte der Referer leer sein, ist das ein Direktaufruf
        if(trim($currentReferer) == '')
            $currentReferer = 'direktaufruf';
        // Prüfen ob der Referer der selbe ist wie der eigene Hostname
        // Wenn ja dann abbrechen
        if($currentReferer == $this -> _OWN_HOSTNAME)
            return FALSE;
        // Prüfen ob der Referer bereits eingetragen ist
        // Wenn ja dann nur Count um 1 erhöhen
        // Wenn nein dann neu hinzufügen
        if($this -> i_exists($currentReferer))
            $this -> i_updateReferer($currentReferer);
        else
            $this -> i_addReferer($currentReferer);
    }
    
    public function e_printStatistic()
    {
        // Funktion für das Zusammenzählen alle Counts
        $allReferer = $this -> i_countAllReferer();
        // Neues Bild erstellen
        $image = imagecreatetruecolor(500, 200);
        // Bild mit Weis füllen
        imagefill($image, 0, 0, imagecolorallocate($image, 255, 255, 255));
        // Initialwerte
        $lastEnd = 0;
        $lastY = -5;
        
        // Zehn Hosts mit den höchsten Counts
        $sql = mysql_query("SELECT host, count FROM ".$this -> _DB_TABLE." ORDER BY count ASC LIMIT 10");
        while($row = mysql_fetch_assoc($sql))
        {
            // Zufällige Farbe
            $red = rand(0, 255);
            $green = rand(0, 255);
            $blue = rand(0, 255);
            $color = imagecolorallocate($image, $red, $green, $blue);
            // Prozent ausrechnen
            $percent = round($row['count'] / $allReferer * 100, 2);
            // Ende für das Kuchenstück für den aktuellen Host
            $thisEnd = $lastEnd + (360 / 100 * $percent);
            // Das Kuchenstück dem Bild hinzufügen
            imagefilledarc($image, 100, 100, 190, 190, $lastEnd, $thisEnd, $color, IMG_ARC_PIE);
            // Rechteck für das Identifiezeren des Kuchenstücks
            imagefilledrectangle($image, 210, $lastY += 18, 223, $lastY + 13, $color);
            // Hostname des aktuellen Hosts neben das Rechteck schreiben
            imagestring($image, 3, 227, $lastY, $row['host'].' ('.$percent.' %)', imagecolorallocate($image, 0, 0, 0));
            // Das Ende des aktuellen Kuchenstücks speichern für den Anfang des nächsten Kuchenstücks
            $lastEnd = $thisEnd;
        }
        // Sollten keine Hosts vorhanden sein dann Hinweis auf das leere Bild schreiben
        if(mysql_affected_rows() == 0)
            imagestring($image, 5, 5, 5, 'Momentan sind keine Referer gespeichert!', imagecolorallocate($image, 0, 0, 0));
        // Header mit dem content-type für ein PNG schicken
        header("content-type: image/png");
        // Das Bild als PNG ausgeben
        imagepng($image);
        // Das Bild zerstören
        imagedestroy($image);
        // Alle weiteren Ausgaben unterbinden
        exit;
    }
    
}
?>

Kurze Info zu i_ bzw e_ bei den Funktionsnamen.
Ich habe mir angewöhnt, dass davor zu schreiben um eine bessere Übersicht zu erhalten für was diese Funktion ist.
So ist i_ für intern, also meist für Prüfungen und e_ für extern, also für Templates, Bilderausgabe.

Verwendung

 
PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?php
// Die Klasse einbinden
include("class_referer.php");

// Klasse instanzieren, als Parameter wird die eigene Domain übergeben
$_CLASS_REFERER = new referer('meine_domain.tld');

// Wird diese Datei mit dem GET Parameter "showstatistic" aufgerufen
// Dann das Kuchendiagramm ausgeben und sonstige Ausgabe unterbinden
if(isset($_GET['showstatistic']))
    $_CLASS_REFERER -> e_printStatistic();

// Den Aufruf zählen
$_CLASS_REFERER -> i_countReferer();
?>
Über den Autor: Benutzer gelöscht
hat keine Beschreibung angegeben. Eine Beschreibung kann man unter dem Punkt "Profil bearbeiten" im Kontrollzentrum eintragen.
Profilseite betrachten