Klicks zählen
Annette
- php
HuHu euch allen :-)
joa nun will ich hier auch mal was schreiben und hoffe dass mir hier mal jemand helfen kann. Denn mit meinen Büchern komme ich nicht so ganz weiter :-(
Ich habe eine Seite von mir erstellt. Da gibts dann folgende Rubriken:
Jetzt will ich das so machen, dass ich in einer Datenbank sehe (verwende SQL und PHPMyAdmin) sehe, wie oft die einzelnen Seiten angeklickt worden sind.
Kann ich das umsetzten?= Wenn ja wie muss ich das machen? Kann mir da jemand helfen? Das währe echt supper net.
Gruß Annette
Hi,
Jetzt will ich das so machen, dass ich in einer Datenbank sehe (verwende SQL und PHPMyAdmin) sehe, wie oft die einzelnen Seiten angeklickt worden sind.
Hmm, dafür gibt es ja eigentlich die Log-Datei des Servers. Und die Billig-Angebote, die dem Webmaster darauf keinen Zugriff geben, verbieten i.d.R. auch explizit die Nutzung der SQL-Datenbank für solche Zwecke. ;-)
Gruß, Cybaer
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
<?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 ----------------
#------------------------------------------------------------------------------
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; } #------------------------------------------------------------------------------
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; }
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
$_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"; }
###############################################################################
############################################################################### ?> <!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>
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
Hi,
Dafür benötigst Du keine Datenbank.
Das habe ich ja auch nicht behauptet. :-o Galt dein Post Annette?
Ich schrieb, daß Provider mitunter die Nutzung der SQL-Datenbank für Log-Zwecke explizit untersagen (und ja auch aus guten Gründen). Dem ist halt so - nicht mehr, nicht weniger. 8-)
Gruß, Cybaer
Hello,
Das habe ich ja auch nicht behauptet. :-o Galt dein Post Annette?
Ja, aber unter Berücksichtigung Deines Hinweises, dass einige Provider das nicht möchten...
Die access_log Dateien können das ja schließlich auch ;-)
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi,
Ja, aber unter Berücksichtigung Deines Hinweises, dass einige Provider das nicht möchten...
Ja, die Nutzung der SQL-Datenbank zum Loggen.
Die access_log Dateien können das ja schließlich auch ;-)
Was aber nichts mit SQL-Datenbanken zu tun hat ... =;-)
Gruß, Cybaer
Hello,
Ja, aber unter Berücksichtigung Deines Hinweises, dass einige Provider das nicht möchten...
Ja, die Nutzung der SQL-Datenbank zum Loggen.
Die access_log Dateien können das ja schließlich auch ;-)
Was aber nichts mit SQL-Datenbanken zu tun hat ... =;-)
Genau! so meinte ich das auch. Und da ich ja sowieso bekannt dafür bin dass ich immer sage: Solange man einfache Probleme nicht mit Flatfiles lösen kann, sollte man es auch unterlassen, für noch einfachere Probleme gleich eine Datenbank einzusetzen *hihi*
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi,
Und da ich ja sowieso bekannt dafür bin dass ich immer sage: Solange man einfache Probleme nicht mit Flatfiles lösen kann, sollte man es auch unterlassen, für noch einfachere Probleme gleich eine Datenbank einzusetzen *hihi*
*grins*
Gruß, Cybaer
BTW:
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.phpIch zähle hier die IPs, aber Du kannst das leicht auf das Zählen der Seiten umbauen.
Aus ethisch/moralischen Gründen, hänge ich *meine* Tracking- und User-Analyse-Programme übrigens *nicht* an die "große Glocke". Mir ist die Mißbrauchsgefahr durch ggf. zwielichtige Gesellen zu groß. Wer so etwas haben möchte, soll sich das gefälligst selbst ausdenken oder sowas kaufen (was qualitativ allerdings einem Vergleich nicht standhalten würde >;->).
Gruß, Cybaer
Moin Annette,
Jetzt will ich das so machen, dass ich in einer Datenbank sehe (verwende SQL und PHPMyAdmin) sehe, wie oft die einzelnen Seiten angeklickt worden sind.
Kann ich das umsetzten?= Wenn ja wie muss ich das machen? Kann mir da jemand helfen? Das währe echt supper net.
Ja, mache deine Links etwa so:
href="forward.php?gaestebuch.php"
in dem Script forward.php wertes du den Klick aus und zählst den counter hoch, dann leitest du weiter.
in forwrad.php:
$url = urldecode($QUERY_STRING);
Auswerten, Counter erhöhen und speichern.
Weiterleiten:
header("Location: $url");
regds
Mike©