Bei vielen, wenn nicht gar bei allen Countern im Web sieht man die Zahl, der einige Nullen vorangestellt sind. Ich habe nun auf Basis des Tutorials zum grafischen Counter einen solchen Counter entwickelt.
Bei der Einbindung des Codes müssen zwei Variablen definiert werden: $number, das ist die gesamtzahl der Stellen, die der Counter haben soll, und $id, die id der Zeile in der MySQL-Tabelle. Da außerdem über eine Session-Variable sichergestellt wird, dass jeder Besucher nur einmal gezählt wird, muss eine Session gestartet werden.
Falls nicht schon passiert, muss eine Verbindung zur Datenbank hergestellt werden. Dies geschieht über die Datei mysqlconnect.php.
PHP-Code:
include 'mysqlconnect.php';
Alternativ kann man diese Zeile auch durch den Code, der zur Verbindung nötig ist, ersetzen.
Da wir jeden Besucher nur einmal zählen wollen, unabhängig davon, wie oft er im Verlauf der Session die Seite aktualisiert, fragen wir nun ab, ob die Session-Variable counted bereits definiert ist.
PHP-Code:
if(!array_key_exists('counted', $_SESSION) || !$_SESSION['counted'])
Falls dies nicht der Fall sein sollte, sprich der Besucher noch nicht gezählt wurde, wird die in der Datenbank gespeicherte Zahl um eins erhöht und der Session-Variable counted der Wert true zugewiesen.
PHP-Code:
{
//Wenn nein, wird die Zahl in Spalte hits in der Zeile mit der
//angegebenen id um 1 erhöht
mysql_query("UPDATE counter SET hits = hits +1 WHERE id = $id;");
//Die Session-Variable counted wird als true definiert.
$_SESSION['counted'] = true;
}
Widmen wir uns nun der grafischen Ausgabe der Daten. Dazu benötigen wir einen Ordner namens counter, in dem die Dateien counter0.gif bis counter9.gif liegen.
Als erstes müssen wir den gespeicherten Wert auslesen und dessen Länge ermitteln. Dies machen wir mit diesem Code:
PHP-Code:
//Wählt die Spalte hits aus der Zeile $id aus
$result = mysql_query("SELECT hits FROM counter WHERE id=$id;");
//Liest den Wert aus
$zahl = mysql_fetch_assoc($result);
//Bestimmt die Länge der Zahl
$laenge = strlen($zahl['hits']);
Falls der Webmaster schlampig ist und vergessen hat, $number (die Gesamtzahl der Stellen) höher zu setzen, wenn der Counter diese Länge überschritten hat, würde der Counter nicht funktionieren. Daher fragen wir jetzt ab, ob $number kleiner als die Länge der Zahl ist. Wenn ja, wird $number ein neuer Wert zugewiesen, der sich aus der Länge der Zahl plus 1 ergibt.
PHP-Code:
//wenn die gewünschte Zahl der Stellen kleiner als die tatsächliche
//Zahl der Stellen ist, wird $number neu definiert,
//sodass sie um 1 länger als die tatsächliche Anzahl der Stellen ist
if ($number < $laenge)
{
$number = $laenge + 1;
}
Jetzt wird die Differenz zwischen der gewünschten Gesamtzahl der Stellen und der tatsächlichen Länge der Zahl bestimmt.
PHP-Code:
$null = $number - $laenge;
Jetzt werden die Nullen grafisch ausgegeben. Hierzu machen wir eine for-Schleife, die so oft läuft, wie die Null ausgegeben werden soll, d.h. die Variable $null bestimmt die Anzahl der Durchläufe.
PHP-Code:
{
//gibt den HTML-Code für die Bilder der Nullen aus
echo '<img src="/counter/counter0.gif" border="0" alt="0" title="';
Der aufmerksame Leser wird gemerkt haben, dass im Code-Beispiel oben dder ausgegebene HTML-Code unvollständig und die for-Schleife nicht abgeschlossen ist.
Wir schreiben jetzt eine untergeordnete for-Schleife, die für das title-Attribut die Nullen ausgibt:
PHP-Code:
for ($zero = 0; $zero < $null; $zero++)
{
echo '0';
}
Nun wird die Zahl selbst als title-Attribut ausgegeben und die for-Schleife geschlossen.
PHP-Code:
echo "".$zahl['hits']."'>";
}
Jetzt wird die Zahl selbst grafisch ausgegeben. Dies geschieht dadurch, dass wir für jedes Zeichen eine Bild-Datei als HTML-Code ausgeben.
PHP-Code:
for ($i = 0; $i < $laenge; $i++)
{
//Gibt den HTML-Code des Bildes einer Ziffer aus
echo '<img src="/counter/counter'.$zahl['hits']{$i}.
'.gif" border="0" alt="'.$zahl['hits']{$i}.'" title="';
//Gibt die Nullen als title-Attribut aus
for ($zero = 0; $zero < $null; $zero++)
{
echo '0';
}
//gibt die Zahl als title-Attribut aus
echo "".$zahl['hits']."'>";
}
Die Ausgabe des title-Attributs ist analog zu oben besprochener.
Jetzt wird noch die MySQL-Verbindung geschlossen
und fertig ist unser Counter:
PHP-Code:
<?php
/*
Variablen die beim reqire/include-Befehl angegeben werden müssen:
$id ID des Counters in der MySQL-Datenbank
$number Gesamtzahl der Stellen, die der Counter hat
Außerdem muss eine Session gestartet werden.
*/
include 'mysqlconnect.php'; //Verbindung zur Datenbank
//fragt ab, ob in der Session die Variable counted als true definiert wurde
//d.h. ob derjenige bereits gezählt wurde
if(!array_key_exists('counted', $_SESSION) || !$_SESSION['counted'])
{
//Wenn nein, wird die Zahl in Spalte hits in der Zeile mit der
//angegebenen id um 1 erhöht
mysql_query("UPDATE counter SET hits = hits +1 WHERE id = $id;");
//Die Session-Variable counted wird als true definert.
$_SESSION['counted'] = true;
}
//Wählt die Spalte hits aus der Zeile $id aus
$result = mysql_query("SELECT hits FROM counter WHERE id=$id;");
//Liest den Wert aus
$zahl = mysql_fetch_assoc($result);
//Bestimmt die Länge der Zahl
$laenge = strlen($zahl['hits']);
//wenn die gewünschte Zahl der Stellen kleiner als die tatsächliche
//Zahl der Stellen ist, wird $number neu definiert,
//sodass sie um 1 länger als die tatsächliche Anzahl der Stellen ist
if ($number < $laenge)
{
$number = $laenge + 1;
}
$null=$number-$laenge;
//gibt die Nullen aus
for ($b = 0; $b < $null; $b++)
{
//gibt den HTML-Code für die Bilder der Nullen aus
echo '<img src="/counter/counter0.gif" border="0" alt="0" title="';
//gibt als title-Attribut die Nullen aus
for ($zero = 0; $zero < $null; $zero++)
{
echo '0';
}
//gibt als title-Attribut die Zahl aus.
echo "".$zahl['hits']."'>";
}
// gibt die Zahl aus
for ($i = 0; $i < $laenge; $i++)
{
//Gibt den HTML-Code des Bildes einer Ziffer aus
echo '<img src="/counter/counter'.$zahl['hits']{$i}.
'.gif" border="0" alt="'.$zahl['hits']{$i}.'" title="';
//Gibt die Nullen als title-Attribut aus
for ($zero = 0; $zero < $null; $zero++)
{
echo '0';
}
//gibt die Zahl als title-Attribut aus
echo "".$zahl['hits']."'>";
}
mysql_close();
?>
Lesezeichen