Tom: Klicks zählen

Beitrag lesen

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&amp;'.       '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