Anzeige
Tutorialbeschreibung

Referrer-System

Referrer-System

Du willst wissen, wie oft auf deinen Link auf einer anderen Website geklickt wurde?
Hier hast du die Möglichkeit.


Du wolltest schon immer mal wissen, wie oft auf deinen Link auf der Website deines Linkpartners geklickt wurde? Dann könnte folgendes Tutorial zur Erstellung eines simplen Referrer-Systems genau das richtige sein! Benötigt wird:

  • PHP
  • MYSQL

Als Erstes musst du in deiner Datenbank eine neue Tabelle erstellen. Ich habe meine Tabelle "refs" genannt. Hier die SQL-Query zum Einfügen der Tabelle in deine Datenbank:
   CREATE TABLE `refs` (
  `ID` int(255) unsigned NOT NULL AUTO_INCREMENT,
  `url` varchar(255) NOT NULL,
  `hits` int(255) NOT NULL,
  PRIMARY KEY (`ID`)
)


So weit, so gut; nun geht es an das eigentliche Script: Wir benötigen ein Script, das den Referrer, welcher bei meinem Script über die URL übergeben wird, auswertet und in die Tabelle einträgt. (referrer.php)

<?php
$website = 'http://www.example.org'; // Gib hier deine Website-URL an

$cfg = array(
	  'db' => array(
		'host' => 'localhost', //Host, meist localhost
		'user' => 'root',   //Benutzername für Datenbank
		'pass' => '',        //Datenbankpasswort
		'base' => 'tutorials'     //Datenbankname
		)
	);
/* Mit der Datenbank verbinden */
$cfg['db'] = new mysqli($cfg['db']['host'], $cfg['db']['user'], $cfg['db']['pass'], $cfg['db']['base']);
if(mysqli_connect_errno()) die ('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');

$db = $cfg['db']; // Variable $db für DB-Verbindung für spätere Querys deklariert

if(isset($_GET['ref']) && !empty($_GET['ref'])) { // Falls der Referrer-Parameter mit der URL übergeben wird

     $ref = mysql_real_escape_string(htmlspecialchars($_GET['ref'])); // Übergebenen Referrer absichern (SQL-Injections verhindern)

$query = 'SELECT `ID`, `hits` FROM `ref_refs` WHERE `url` = ''.$ref.'' LIMIT 1';
$result = $db->query($query); // Query ausführen

if($result->num_rows) { // Falls diese URL bereits als Referrer existiert

   $row = $result->fetch_assoc(); // Dem Array $row die Tabelleneinträge (ID, hits) zuteilen 

   $hits = ++$row['hits']; // Hits + 1

   $update_query = 'UPDATE `ref_refs` SET `hits` = ''.$hits.'' WHERE `url` = ''.$ref.''';
      $update = $db->query($update_query); // Hits aktualisieren

} else { // Falls Seite noch nicht in die Datenbank eingetragen wurde

    $insert_query = 'INSERT INTO ref_refs (url, hits)
                           VALUES ("'.$ref.'", "1")';
    $insert = $db->query($insert_query);      

}

} else { // Falls kein Referrer übergeben wurde

}

  header("Location: ".$website); // Nach Eintrag sofort auf Startseite weiterleiten
  exit();
?>


WICHTIG: Vergiss nicht, die benötigten Daten zu ändern. Nun nochmal zur Erläuterung:

<?php
$cfg = array(
	  'db' => array(
		'host' => 'localhost', //Host, meist localhost
		'user' => 'root',   //Benutzername für Datenbank
		'pass' => '',        //Datenbankpasswort
		'base' => 'tutorials'     //Datenbankname
		)
	);
/* Mit der Datenbank verbinden */
$cfg['db'] = new mysqli($cfg['db']['host'], $cfg['db']['user'], $cfg['db']['pass'], $cfg['db']['base']);
if(mysqli_connect_errno()) die ('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');

$db = $cfg['db']; // Variable $db für DB-Verbindung f&uuml;r spätere Querys deklariert
?>


Dieser Teil verbindet dein Script mit der Datenbank, welche später für das Einfügen der Referrer benötigt wird.

$ref = mysql_real_escape_string(htmlspecialchars($_GET['ref'])); // Übergebenen Referrer absichern (SQL-Injections verhindern) 

Wie hier der Kommentar schon beschreibt, wird mithilfe von mysql_real_escape_string() und htmlspecialchars() für die Sicherheit gesorgt.

 header("Location: ".$website); // Nach Eintrag sofort auf Startseite weiterleiten
  exit();

Dieser Teil leitet nach dem Aufruf des Scripts direkt auf die am Anfang des Scripts angegebene Website weiter. Dein Linkpartner muss nur noch den Link anpassen (z. B. example.org/referrer.php?ref=spiegel.de) und schwups! - funktioniert es. Der Rest des Scripts sollte, denke ich, klar sein. Falls nicht, bitte einfach 'nen Kommentar schreiben!

 


DVD-Werbung
Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von samtron
  • 08.02.2012 - 20:16

hi danke dir
MfG
samtron

Portrait von The_Own
  • 05.03.2010 - 20:56

Thx, kann ich sehr gut gebrauchen für meine kleine Homepage :)

Portrait von mystery2072
  • 26.02.2010 - 21:36

Hi
also ich weiss auch nicht wo zu das Sinnvoll sein soll.
Da die meisten Datenbanken es ja schon als Standart haben und alles weitere von einer Sofware die man verwendet eingetragen wird!

Portrait von sychron
  • 06.03.2010 - 21:19

Was bitte haben die Datenbanken als Standard? Reflink-Tracker?

Portrait von netspy
  • 26.02.2010 - 12:38

Da SET HITS=HITS+1 atomar ist, kann MySQL das eigentlich auch nicht zweimal mit den gleichen Werten ausführen. Beim zweiten Aufruf ist HITS ja schon größer und es wird immer der aktuelle Wert von HITS um 1 erhöht. Aber egal, Transaktionen sind für einen solch simplen Zähler natürlich übertrieben und die SET HITS=HITS+1 Variante reicht vollkommen aus, da es damit selbst bei hoher Last kaum bis nie zu Überschneidungen kommen kann.

Portrait von netspy
  • 26.02.2010 - 08:56

Ich weiß nicht, ob solche Tut wirklich sinnvoll sind. Wenn man als Autor selber noch nicht so versiert ist, sollte man vielleicht noch nicht für andere Tuts schreiben.

Wie sychron schon schreibt, ist das Zählen der Hits nicht atomar und führt definitiv zu falschen Zahlen. Die Lösung dafür ist aber einfach und braucht keine zwei Tabellen. SQL kann nämlich selber rechnen und im SQL schreibst du dann einfach:

UPDATE `ref_refs` SET `hits`=`hits`+ 1 …

Außerdem solltest du dir das SELECT am Anfang komplett sparen. Da in den meisten Fällen ein Eintrag ja schon existiert, macht man in solchen Fällen immer erst mal aufs Blaue ein UPDATE des Datensatz. Danach testest du mit:

if ($db->affected_rows == 0)

… ob der Datensatz wirklich geschrieben wurde. Wenn nicht (also == 0), dann machst du dein INSERT. Das sparten in 99.9 % der Fälle eine unnötige Abfrage.

Auch verstehe ich nicht, warum du den Referer nur als Parameter übergibts und nicht versuchst, den in den meisten Fällen im HTTP-Header übergebenen Referer auszuwerten.

Trotzdem, weiter so. Das nächste Tut wird bestimmt noch besser!

Portrait von sychron
  • 26.02.2010 - 12:24

Wenn wir schon technisch werden: MyISAM unterstützt keine Transaktionen. Selbst die Updates mit SET HITS=HITS+1 sind zwar atomar, aber nicht exklusiv. Das bedeutet: MySQL rechnet zwar selbst, aber trotzdem verhindert niemand, daß MySQL das zweimal gleichzeitig tut. Und jedesmal die Tabelle locken, erzeugt nur noch mehr Overhead. <br>
Wenn Du das ganze sicher über Updates lösen möchtest, musst Du die Tabelle auf InnoDB stellen und mit Transaktionen und Commit arbeiten. Aber ob das weniger Aufwand ist?

Portrait von silv
  • 24.02.2010 - 09:45

schönes tut! erstmal danke dafür. wie meine vorredner schon sagten eher schlecht bei hohen besucherströmen wurde aber auch schon sehr gut gelöst von sychron auch danke dafür! :-)

have a nice day!

Portrait von mfgleo
  • 24.02.2010 - 06:35

Als Grundsystem für den späteren Ausbau nicht schlecht. Potenzial ist vorhanden. Dein Tuto soll ja wahrscheinlich nur einen kurzen Einblick geben und nicht gleich ein ganzes SYSTEM beschreiben, oder? ;-) Danke, fürs Tuto.

Portrait von XxKlenerxX
  • 23.02.2010 - 14:27

In der Tat ist es noch ausbaufähig, Stichworte wie "Reload-Sperre", "anschauliche Graphen", etc. doch das Grundsystem ist denke ist ein guter Baustein.

Wie sychron schon sagte, kann es bei großen Besucherströmen von einer Website zu Problemen führen, er hat bereits auch schon eine Lösung gesagt, danke dafür!

Portrait von sychron
  • 22.02.2010 - 01:10

Das System funktioniert so bei normalem Hit-Aufkommen ganz gut. Wenn die Seite aber massiv Hits bekommt, gibt das Update ein Problem:

Nehmen wir an, die Seite hat 322 Hits. Der erste Hit triggert das Update und sorgt dafür, daß Hits = Hits + 1 =323 berechnet wird. In der Zeit kommt der zweite Hit rein, und es wird ebenfalls Hits = Hits + 1 = 323 berechnet, bevor das erste Update in die DB geschrieben wird.

Um das zu umgehen, gibt es einen einfachen Trick:
Man nimmt einafch zwei Tabellen, die erste enthält die URL's mit ID, und die zweite enthält nur ein Autowert-Feld und eine RefID-Spalte.
Ein Hit wird gezählt durch ein INSERT INTO zweiteTabelle (refID) VALUES "id der aufgerufenen URL".

Das bedeutet: Jeder Hit erzeugt einen neuen Eintrag. Gehen zwei Hits gleichzeitig ein, werden beide gezählt, da die Inserts sich nicht gegenseitig stören können.

Gezählt wird as ganze mit SELECT COUNT (*) FROM zweiteTabelle WHERE RefID = "richtige RefID".

Portrait von Rage2008
  • 21.02.2010 - 13:53

cool danke sowas hab ich gesucht :)

Portrait von Cokxxie
  • 21.02.2010 - 10:44

ich persönlich würde das Script noch ein wenig verbessern ;D

unzwar kann man Zeile 18 bis 20 mit dem Code ersetzen:

-----------------------------

if(isset($_SERVER['HTTP_REFERER'])) {

// get host name from URL
preg_match("/^(https?://)?([^/]+)/i", $_SERVER['HTTP_REFERER'], $matches);
$host = $matches[2];

// get last two segments of host name
preg_match("/[^./]+.[^./]+$/", $host, $matches);
$ref = $matches[0];

} elseif(isset($_GET['ref']) && !empty($_GET['ref'])) {

$ref = mysql_real_escape_string(htmlspecialchars($_GET['ref']));

}

if(isset($ref)) {

-----------------------------

Dadurch wird erst überprüft, von welcher Seite der User kommt ohne dass ein Parameter übergeben werden muss. Es kann aber vorkommen, das kein Referer mitgesendet wird. Unter anderem wenn,

-der Browser das nicht unterstützt
-der User das Mitsenden des Referers im Browser deaktivert
-Der User einen Proxyserver verwendet

dann wird überprüft, ob ein Parameter übergeben wird

x
×
×