Hello,
Dafür benötigst Du keine Datenbank. Es reicht, in jedem Script eine Funktion aufzurufen, die einen Zähler incrementiert:
Ich habe das mal nach IPs sortiert erstellt:
<?php ### count_visitors.php ###
ini_set('track_errors','1'); ## verdeckte Fehlermeldung aktivieren ## $php_errormsg wird nun geplegt $dateiname = 'visitors.dat';
$fh1 = @fopen($dateiname,'a+'); ## Datei anlegen, falls nicht vorhanden if(!$fh1) { ## Fehlerbehandlung, wenn Dateianlage/öffnung fehlgeschlagen ist. die('Es ist ein Fehler aufgetreten.'. $php_errormsg); } fclose($fh1); ## Hilfshandle zurückgeben
$fh = @fopen($dateiname,'r+'); ## Datei zum Lesen und Schreiben öffnen if(!$fh) { ## Fehlerbehandlung, wenn Dateiöffnung fehlgeschlagen ist. die('Es ist der Fehler 002 aufgetreten. Bitte informieren Sie den Operator'. '<a href="mailto:webmaster@example.com?subject=Fehler 002 beim Counter&'. 'body='.$php_errormsg.'"> '. 'per eMail</a>'); }
$lock_ok = flock($fh,LOCK_EX); ## Dateisperre beantragen. $file_len = filesize($dateiname); ## Dateigröße erfragen
if($file_len > 0) { $datastream = fread($fh,$file_len); ## vorhandene Daten lesen $_visitors = unserialize($datastream); ## Array wiederherstellen if ($_visitors === false) ## Fehler beim Umwandeln { mail('tom@bitworks.de','Fehler 105 beim Visitor-Zähler',date('Y-m-d H:i:s')); $_visitors = array(); ## Array neu anlegen } } else ## es waren keine Daten da { $_visitors = array(); ## Array neu anlegen }
$_visitors[$_SERVER['REMOTE_ADDR']]++; ## Besucher zählen $datastream = serialize($_visitors); ## Array serialisieren
$seek_ok = fseek($fh,0,SEEK_SET); ## Dateizeiger auf Anfang zurückstellen $write_ok = fwrite($fh,$datastream); ## Daten zurückschreiben $trunc_ok = ftruncate($fh,strlen($datastream)); ## Datei trimmen auf neue Datenlänge fclose($fh); ## Datei schließen und freigeben
echo "<p>Sie wurden gezählt</p>"; ?>
<?php ### show_visitors.php ###
error_reporting(E_ALL); ## alle Fehler anzeigen ini_set('track_errors','1'); ## verdeckte Fehlermeldung aktivieren ## $php_errormsg wird nun geplegt $dateiname = 'visitors.dat'; ## Dateiname der Log-Datei
$error_no = 0; ## Merker für die Fehlerbearbeitung #---- Error Codes ---------------- # 0: kein Fehler aufgetreten #---- Low Level Errors ----------- # 1: # 2: File not Found # 3: File already exists # 4: Could not read file, no data # 5: Could not open file # 6: Could not lock file # 7: #---- Data Errors ----------------
11: No valid data format
#------------------------------------------------------------------------------
Datei im shared-Lock Modus zum Lesen öffnen
function readlock($lockfile_name,&$error_no) { if ($error_no > 0) return false;
for ($x=0;$x<5;$x++) ## Schleife 5 mal durchlaufen { if($lh = @fopen($lockfile_name,"rb")) break; ## oder bei Erfolg abbrechen usleep(8000); ## 8ms warten bis zum nächsten } ## Öffnungsversuch
if (!$lh) { $error_no = 5; ## konnte Datei nicht öffnen return false; ## bei Misserfolg Funktionsende }
# Lockversuch for ($x=0;$x<5;$x++) { if (@flock($lh,LOCK_SH + LOCK_NB)) return $lh; usleep(8000); ## 8ms warten bis zum nächsten Versuch }
$error_no = 6; ## konnte Datei nicht sperren fclose($lh); return false; } #------------------------------------------------------------------------------
Daten aus der Datei holen
function get_data($lockfile_name,&$error_no) { if ($error_no > 0) return false;
$fh = readlock($lockfile_name,$error_no); if ($error_no > 0) { return false; }
$len = filesize($lockfile_name); if ($len == 0) { $error_no = 4; ## File enthält keine Daten return false; }
$filedata = fread($fh,filesize($lockfile_name)); if (!$filedata) { $error_no = 4; ## File enthält keine Daten return false; }
$_data = unserialize($filedata); if (!is_array($_data)) { $error_no = 11; ## Dateiformat passt nicht return false; }
fclose($fh); ## Datei schließen
return $_data; ## Daten zurückliefern
}
#------------------------------------------------------------------------------ function make_out_table($_data) { $out_table ="<table>\n"; $out_table .= " <tr bgcolor="#CCCCDD">\n"; $out_table .= " <th align="right">lfd. Nr</th>\n"; $out_table .= " <th align="left">IP-Nummer</th>\n"; $out_table .= " <th align="right">Besuche</th>\n"; $out_table .= " </tr>\n";
$_data=array_flip($_data); natsort($_data); $_data=array_flip($_data);
$_color = array('#AAFFEE','#AAEEFF');
$count = 0; if (is_array($_data)) { foreach ($_data as $ip => $visits) { $count++; $out_table .= " <tr bgcolor="".$_color[$count%2]."">\n"; $out_table .= " <td align="right">$count</td>\n"; $out_table .= " <td>$ip</td>\n"; $out_table .= " <td align="right">$visits</td>\n"; $out_table .= " </tr>\n"; } } else { $out_table .= " <tr bgcolor="".$_color[$count%2]."">\n"; $out_table .= " <td align="right"> </td>\n"; $out_table .= " <td>keine (weiteren) Daten</td>\n"; $out_table .= " <td align="right"> </td>\n"; $out_table .= " </tr>\n"; }
$out_table .="</table>\n";
return $out_table; }
#------------------------------------------------------------------------------
main - Berechnung der Ausgaben
#------------------------------------------------------------------------------
$_data = get_data($dateiname,$error_no);
switch ($error_no) { case 0: $out = make_out_table($_data); break;
default: $out = "Es ist Fehler $error_no aufgetreten"; }
###############################################################################
HTML output
############################################################################### ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <TITLE>Besucheranzeige</TITLE> <META NAME="Author" CONTENT="Thomas Schmieder"> <META NAME="Keywords" CONTENT="Besucheranzeige"> </HEAD>
<BODY> <h3>Besucheranzeige</h3> <?php echo $out;?>
<p> <a href="http://validator.w3.org/check?uri=referer"><img border="0" src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!" height="31" width="88"></a> </p>
</BODY> </HTML>
Und ausprobieen kannst Du den Zähler dann unter http://selfhtml.bitworks.de/artikel_locking/count_visitors.php
Anzeige unter http://selfhtml.bitworks.de/artikel_locking/show_visitors.php
Ich zähle hier die IPs, aber Du kannst das leicht auf das Zählen der Seiten umbauen. Und wie man aus Scripten Funktionen in einer Sammlung macht, das weißt Du doch auch.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen Nur selber lernen macht schlau