Link Klicks zählen

Dies ist eine ganz banale Aufgabe, aber mir ist eine Unschönheit aufgefallen bei vielen Scripts die ich gefunden haben, deswegen ein ganz kleiner Artikel zu diesem Thema.

Die Aufgabe ist relativ einfach – wir wollen die Anzahl Klicks auf einem Link zählen. Dazu gibt es viele Varianten und meistens sind die auch sinnvoller als meine..

Zahlreiche Scripts die ich gefunden haben, manipulieren die Adresse die aufgerufen wird:

<a href="http://localhost/linkcounter.php?link=http://www.link.com">

(Der Wert von link müsste noch entsprechend “angepasst” werden so dass alle Zeichen korrekt übergeben werden – php: urlencode, asp: Server.URLEncode usw.)

Nun hat dies zur Folge, dass in der Statuszeile eine unschöne Adresse steht. Wie löst man dies? Per JavaScript die Statuszeile anpassen – falsch! Früher hat die ganz gut funktioniert, inzwischen ist diese Funktion aber oft deaktiviert. http://de.selfhtml.org/javascript/objekte/window.htm#status

Wie es besser gemacht wird

Wir belassen den Wert in “href” so wie er ist. Jedoch erweitern wir den link um einen kleinen JavaScript aufruf

<a href="http://www.codeblog.ch" onmousedown="clickCounter(this)">super blog</a>

Dann noch ein kleines JavaScript in den Header einfügen:

<script type="text/javascript" language="JavaScript" >
function clickCounter(obj)
{
   obj.href = "http://localhost/linkcounter.php?link=" + escape(obj.href)
}
</script>

Dadurch wird die Zieladresse dynamisch bei jedem Klick verändert – google macht dies übrigens auch so, die Idee ist also alles andere als neu..

Vollständigkeitshalber hier noch ein simples PHP Script das die Links zählt. Für einen praktischen Einsatz aber wohl etwas zu einfach.

Ich habe als DB MySQL verwendet da dies einfach und schnell einzurichten ist. Tabelle “linkcounter” mit zwei Spalten erstellen (link,hits). Wichtig ist hier, dass “link” eindeutig ist (Primary Key).

CREATE TABLE linkcounter (link VARCHAR (255) NOT NULL, hits INT UNSIGNED, PRIMARY KEY(link))

Dann im PHP Script die Zugangsdaten anpassen und fertig!

<?php
// we must have an item "link" in the url
if (!array_key_exists('link',$_REQUEST)) exit;
 
// connect to database
$db = mysql_connect('server','user','password');
mysql_select_db('database',$db);
 
$link = mysql_real_escape_string($_REQUEST['link']);
 
// build query
$query = 'INSERT INTO linkcounter (link,hits) VALUES (\'%s\',1) ON DUPLICATE KEY UPDATE hits=hits+1;';
$query = sprintf($query,$link);
 
// execute query and close db connection
mysql_query($query,$db);
mysql_close($db);
 
// redirect
header('location: ' . $link);
?>

Zum Schluss sei noch ein kleiner Trick erwähnt. Das Insert Query hat eine kleine Erweiterung “ON DUPLICATE KEY”. Dies ist eine MySQL spezifische Anweisung die für diese Anwendung sehr nützlich ist. Dadurch müssen wir kein zweites Query absetzen für den Fall dass der Link bereits in der Datenbank steht. Es gibt schliesslich zwei Operationen: Neue Links einfügen (dies soll ja automatisch geschehen) und den Hit-Counter erhöhen.

Dank MySQL können wir dies mit einem Query tun!
http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html




9 Comments

Hallo Jürgen,

mein Beispiel-Code läuft auf einem lokalen Webserver (localhost). Wenn du das Script verwenden willst, so musst du es auf deinem eigenen Server installieren!

Ich biete hier keinen Link Counter Service an, es geht lediglich darum, einen möglichen Weg aufzuzeigen wie man sowas umsetzen kann.

Gruss Laubi

Servus,

ich möchte das Skript in einem WordPress einsetzen und deshalb anstatt dem Link einfach die PostID übergeben. Allerdings bekomm ich dann bei dem hier Probleme, wenn ich einfach die ID übergebe

function clickCounter(obj)
{
obj.href = “http://localhost/linkcounter.php?link=” + escape(obj.href)
}

mir ist ehrlich gesagt etwas unklar was das hier genau macht? ersetzt es den link durch einen aufruf von http://localhost/linkcounter.php?link… Damit wäre das ja nicht so optimal für mich. Haste ne idee, wie ich das lösen kann?

Grüße
Benny

Hey Laubi,

ne das plugin ist genau nicht das was ich brauche. Ich hab ne “fun” seite und verlinke jedentag spaßige links. Ich möchte nur tracken wie oft auf das jeweilige Bild mit dem Link geklickt wurde.

Ich würde das Skript gerne umschreiben, dass es die PostID zählt und nicht die URL. Haste ne Idee, wie ich das lösen kann?

Grüße
Benny

Script funktioniert gut, ABER… wenn man die Links in einer neuen Seite laden läßt, dann ändert sich der Link auf die gesamte URL ..linkcounter.php?link=… und beim zweiten Klick dann alles nochmal hinten dran usw…

Ja, das stimmt. Ich hab dieses Problem auf der einzigen Seite wo das Script läuft mit einem (zugegeben unschöne) Check gelöst:

function clickCounter(obj)
{
if(obj.href.substring(0,35) != ‘http://www.abcde.ch/abcdefg/link.php’)
obj.href = “http://www.abcde.ch/abcdefg/link.php?p=test&c=” + obj.innerHTML + “&l=” + escape(obj.href)
}

Am besten eine Variable für die Adresse von link.php definieren und die Länge dynamisch auslesen…

Falls es jemand mal sucht, ich habe in einem Forum die verbesserte Version gefunden…

function clickCounter(obj)
{
location = “http://localhost/linkcounter.php?link=” + escape(obj.href);
return false;
}

im Link window.open=”return clickCounter(this)”

Hoffe das hilft euch auch!

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *