Willkommen zu der erste Folge einer neuen Serie mit dem Namen "PHP-Tips". Hierbei
handelt sich um eine Art PHP-Tutorial, bei dem zusätzlich nützliche
Tools herauskommen. Mark Kronsbein
leitet die Serie ein und beschreibt in dieser Folge die
Realisierung eines Redirectors in PHP.
Die entsprechenden Sourcen
stehen auch separat zur Verfügung.
PHP-Tips #1: Erweiterte Web-Statistiken per Redirector
Was ist PHP?
PHP ist eine serverseitige Skriptsprache,
d. h., im Vergleich zu z. B. JavaScript wird PHP vom Server ausgeführt,
nicht vom Browser.
PHP wurde von dem Kanadier Rasmus Lerdorf entwickelt, der anfangs damit
nur die Zugriffe auf seine Website auswerten wollte. Ab der Version 3.0
arbeitet ein internationales Entwicklerteam an der weiteren Entwicklung.
PHP ist in etwa das Linux/UN*X-Pendant zu Microsofts ASP (Active Server
Pages). Inzwischen läuft es auf über 130.000
Hosts, wobei die Frontpage Extentions auf Platz 1 liegen (aber stetig
Anteile an PHP verlieren ;-))
Warum dieses Tutorial?
Als wichtigsten Punkt, warum ich das hier schreibe, würde ich
folgenden anführen: Als ich im November 1998 PHP für mich entdeckte
gab es so gut wie keine Tutorials für Anfänger. Natürlich
gab und gibt es das Manual, welches aber gerade für Anfänger
nur sehr schwer zu verstehen ist. Dieses Tutorial soll für Anfänger
und Fortgeschrittene gleichermaßen sein. Profis werden hiermit wenig
anfangen können. Inzwischen gibt es einige mehr oder weniger gute
Bücher über PHP, allerdings sind diese meistens nur eine dokumentierte
und gedruckte Version des Manuals. Ich habe "MyRedirector" gewählt,
um gleich in die Welt dessen einzusteigen, was PHP eigentlich am meisten
ausmacht: Die Datenbankanbindung!
Was ist ein Redirector?
Sind Sie auch so neugierig wie ich? Sie haben eine Homepage, auf der
viele Links gesammelt wurden. Interessieren diese Links aber auch den Surfer,
oder werden sie ignoriert? Um das herauszufinden kommt ein sog. Redirector
ins Spiel. Er zählt jeden Klick, den der User von Ihrer Homepage über
einen Link auf eine andere Seite macht, mit und protokolliert die Anzahl
der Hits in einer Datenbank, in diesem Fall MySQL.
Geht es Ihnen wie mir? Wollen Sie auch nach und nach Ihre Website von
Perl-Scripts
befreien und komplett auf PHP umstellen?
Wenn ja, dann ist das nachfolgende Beispiel sicherlich sehr nützlich.
Es dreht sich um einen sogenannten Redirector, also ein Script, was
Clicks auf Links mitzählt. Zwar gibt es solche Scripts zuhauf in Perl
oder C, aber wir wollen uns ja mit PHP beschäftigen ;-))
Natürlich können Sie sich dieses Script herunterladen bzw.
abschreiben. Der Lerneffekt bleibt dabei aber aus.
Es geht los
Wir beginnen mit einigen Variablen:
$host = "http://www.hostname.de/";
Hier sollte Ihre Domain stehen, damit der User bei einem kaputten Link,
der beispielweise auf keine Seite (also redirect.php3? ohne das Argument
"url") aufgerufen wurde. Dann wird Ihre Homepage geladen.
$hostname = "localhost";
Hier geben Sie den Host ein, auf dem Ihre MySQL-Datenbank läuft. Meistens
ist dies "localhost", ein Wert wie "mysql.domain.de" kann aber auch möglich
sein. Bitte fragen Sie im Zweifelsfall Ihren Provider.
$username = "your-username";
Ihr MySQL-Username, d. h. Ihr Loginname.
$password = "your-password";
Ihr MySQL-Passwort
$userstable = "redirect";
Der MySQL-Table, in welchem die Daten eingetragen werden sollen. Natürlich
bleibt der Name Ihnen überlassen. Allerdings wird dieser Tabellename
beim einfügen von MyRedir.sql erzeugt.
$password = "your-password";
Ihr Datenbankname. Meistens haben Sie nur eine Datenbank zur Verfügung.
Wenn Sie mehrere Datenbanken anlegen können, steht es Ihnen natürlich
frei, eine Datenbank mit dem Namen "Redirect" oder "redirector" anzulegen.
Damit hätten wir die Variablen zur Verbindung zu MySQL definiert.
Beginnen wir nun mit dem eigentlichen Script:
if ($url != $host){
Checkt, ob die angegebene URL ungleich der $host-Angabe ist. Damit wird
vermieden, daß Sie auch Zugriffe von Ihrer Seite auf Ihre Seite mitloggen.
MYSQL_CONNECT($hostname, $username, $password)
OR DIE(mysql_error());
Die Verbindung zu MySQL wird mit obigen Angaben hergestellt. Bei einem
gibt MySQL eine Fehlermeldung aus.
mysql_select_db( "$dbName")
or die(mysql_error());
MySQL benützt nun die oben angegebene Datenbank oder gibt eine Fehlermeldung
aus.
$query =
mysql_fetch_row(mysql_query
( "select * from $userstable where(url = '$url')"));
Mit diesem Befehl sucht MySQL aus allen Ergebnissen (dafür der *)
jenes heraus, welches der über den Parameter $url angegebene Adresse
entspricht.
if ($query == false){
Wenn die Abfrage kein Ergbnis erzielt, dann wird die Variable $hits auf
den Wert 1 gesetzt.
$hits = "1";
$query2 =
"INSERT INTO $userstable (url,hits) VALUES('$url','$hits')";
Danach werden die URL und der eine Hit eingetragen, d. h. ein neuer Eintrag
wird in der Datenbank vorgenommen.
}
else {
Wenn bei der Abfrage oben ein Ergebnis gefunden wird,
$hitquery =
"select hits from $userstable where url = '$url'";
wird eine erneute Abfrage zur Weiterverarbeitung benutzt.
$result = mysql_query($hitquery);
Mit $result hat man dann das Ergebnis der Abfrage $hitquery.
$hits = mysql_result($result, 0, "hits");
Mit $hits wird das Feld "hits" angesteuert.
$query2 =
"update $userstable set hits = hits+1 where url = '$url'";
Die Hits der in $url definierten Adresse werden um 1 erhöht.
}
Nun wird die Weiterleitung vorgenommen.
MYSQL_QUERY($query2);
}
Wenn $url nicht angegeben wurde, wird zu der in $host angegebenen Adresse
weitergeleitet.
if(!$url) {
$url = "$host";
}
else {
Wenn eine Adresse in $url angegeben wurde, wird zu dieser weitergeleitet.
Header( "Location: $url");
}
Somit wären wir jetzt soweit, daß Sie die Hits zählen und
in die Datenbank eintragen können. Natürlich können Sie
die Ergebnisse über Telnet und den Befehl "mysql" abfragen. Weitaus
einfacher (und schöner anzusehen) geht es aber mit dem nächsten
Script, der grafischen Auswertung.
Die grafische Auswertung
Wir beginnen wieder mit den uns jetzt schon
bekannten Variablen zur Verbindung zu MySQL.
$hostname = "localhost";
$username = "your-username";
$password = "your-password";
$userstable = "redirect";
$dbName = "your-db-name";
Als nächstes definieren wir die gewünschten Farben für
die Anzahl der Hits.Selbstverständlich können Sie die Farben Ihren Wünschen
anpassen.
$color10 = "#FFFF00";
$color20 = "#FF0000";
$color50 = "#008000"
$color1k = "#0000FF"
$color2k = "#0000A0"
$color5k = "#000040"
Die Verbindung wird hergestellt.
MYSQL_CONNECT($hostname, $username, $password)
OR DIE("Unable to connect to database");
@mysql_select_db( "$dbName")
or die( "Unable to select database");
Jetzt werden wieder alle Daten ausgewählt und absteigend nach Hits
geordnet.
$query = "select * from $userstable order by hits desc";
$result = MYSQL_QUERY($query);
Die Anzahl der Ergebnisse, sprich der gefundenen Eintragungen wird ermittelt.
$number = MYSQL_NUMROWS($result)
or die (mysql_error());
$i = 0;
Wenn jetzt das Ergebnis von $number gleich 0 ist wird eine Fehlermeldung
ausgegeben.
IF ($number == 0) {
PRINT "<CENTER><P><b>No Links tracked yet!<
/b></CENTER>";
}
Wenn Ergbnisse, sprich Hits und URLs, gefunden wurden, also $number
größer oder gleich 1 ist:
ELSEIF ($number >= 1) {
WHILE ($i < $number){
Es wird definiert, daß
$hits = mysql_result($result,$i,hits);
$hits das Ergebnis des Feldes "hits" ist.
$url = mysql_result($result,$i,url);
$url das Ergebnis des Feldes "url" ist.
Nun werden die Hits gezählt und entsprechen der obigen Angaben
die gewünschte Farbe ausgewählt.
if ($hits < 10){
$color = "$color10";
}
elseif (($hits >= 10 )
AND ($hits < 20)){
$color = "$color20";
}
elseif (($hits >= 20 )
AND ($hits < 50)){
$color = "$color50";
}
elseif (($hits >= 50 )
AND ($hits < 100)){
$color = "$color1k";
}
elseif (($hits >= 100 )
AND ($hits < 200)){
$color = "$color2k";
}
elseif ($hits >= 200){
$color = "$color5k";
}
Nachdem die Farbe gewählt wurde, wird eine HTML-Tabelle aufgebaut,
die eine Zelle beinhaltet,
deren Breite (in Pixel) genau der Anzahl der Hits entspricht.
PRINT "<div align=\"left\">";
print "<table COLS=3 border=\"0\" width=
\"100%\"><tr><td ALIGN=LEFT with=\"400\">
<b><a href=\"$url\">$url</a></b></td>";
print "<td ALIGN=right WIDTH=\"60\">
<b>$hits</b></td>";
print "<td align=left WIDTH=\"$hits\"
BGCOLOR=\"$color\"></td></tr>";
PRINT "</table>\n";
}
}
Sämtliche Ergbnisse bei der Abfrage nach $url und $hits werden
ausgegeben.
$i++;
PRINT "</table>\n";
}
}
So, das wars dann auch. Jetzt haben Sie einen voll funktionsfähigen
Redirector, der sehr leicht
anpaßbar ist. |