mdean
|
Forenposter
|
|
registriert
|
03.01.2007
|
wohnt in
|
Schweiz
|
Beiträge
|
90
|
|
Hallo!
Ich hab mithilfe eines Tutorials folgenden Counter gemacht:
PHP:
<?php
include ("variables.php");
include ("dbconnect.php");
//updaten der onlinetabelle
$sql = "UPDATE $onlinetable set onl_exp = '1' WHERE DATE_ADD(onl_dt, INTERVAL 3 MINUTE) < NOW();";
$result = mysql_query($sql);
//online-abfragen
$ip = $_SERVER['REMOTE_ADDR'];
// abfrage ob IP an diesem tag schon vorhanden ist
$sql = "SELECT * FROM $onlinetable WHERE DATE_FORMAT(onl_dt, '%d') = DATE_FORMAT(NOW(), '%d') AND onl_ip = '$ip';";
$result = mysql_query($sql);
$anzahlip = mysql_num_rows($result);
if($anzahlip > 0)
{
// abfrage ob noch aktiv, bei vorhandener ip
$row = mysql_fetch_array($result);
if ($row['onl_exp'] == 1)
{
// updaten bei inaktivität
$sql1 = "UPDATE $onlinetable set onl_exp = '0', onl_dt = NOW() WHERE DATE_FORMAT(onl_dt, '%d') = DATE_FORMAT(NOW(), '%d') AND onl_ip = '$ip';";
$result1 = mysql_query($sql1);
}
}
else
{
$sql = "INSERT INTO $onlinetable (onl_ip, onl_dt, onl_exp) VALUES ('$ip',NOW(),'0');";
$result = mysql_query($sql);
}
// ausgaben der variablen online und hits
// user-total:
$sql = "SELECT * FROM $onlinetable";
$result = mysql_query($sql);
$user_total = mysql_num_rows($result);
?>
Jetzt gefällt mir nicht, dass derjenige alles in ne DB schreibt, denn wenn man irgendwann mal 5000 Besucher gezählt hat, ist die DB doch total überlastet. Wäre es nicht besser wenn er die Besucherzahl in ne Text Datei schreiben würde, und die Daten jeden Tag wieder aus der DB löscht? Wüsstest du wie das zu bewerkstelligen wäre?
Wie machst du das den bei deinem Counter?
Danke im voraus
mdean
|
Flitze
|
Administrator
|
|
registriert
|
17.10.2006
|
wohnt in
|
Eschwege
|
Beiträge
|
332
|
|
Trotzdem hast du recht, es macht keinen Sinn, die IPs länger als einen Tag zu speichern, weil t-online z.B. nen 24 h disconnect hat, wodurch sich die IP ändert. Ich würde einen Counter folgendermaßen aufbauen:
Erstmal zwei Tabellen in der MySQL Datenbank
1. Online
PHP:
<?php
$sql = 'CREATE TABLE `Online` ('
. ' `IP` VARCHAR(15), '
. ' `Datum` DATETIME '
. ' )';
mysql_query($sql) OR die ("<pre>\n".$sql."</pre>\n".mysql_error());
echo "Online erstellt..<br>";
?>
Diese Tabelle speichert die IPs der Leute, die sich gerade auf der Seite befinden.
2. Counter
PHP:
<?php
$sql = 'CREATE TABLE `Counter` ('
. ' `ID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, '
. ' `Datum` DATE, '
. ' `Anzahl` INT NULL DEFAULT \'0\' '
. ' )';
mysql_query($sql) OR die ("<pre>\n".$sql."</pre>\n".mysql_error());
echo "Counter erstellt..<br>";
?>
Diese Tabelle speichert für jeden Tag einen neuen Datensatz, in dem die Anzahl der User diesen Tages stehen.
Dann erstellst du eine Datei, nennen wir sie counter.php, die du zu Beginn jeden Scriptes includierst. In dieser Datei werden folgende Aktionen durchgeführt:
PHP:
<?php
error_reporting(E_ALL);
// Counter erstellen
// Tagescounter auf Existenz prüfen
$sql = "SELECT
ID
FROM
Counter
WHERE
Datum = CURDATE()
";
$result = doQuery($sql);
// ist der Tag nocht nicht vorhanden, wird ein neuer Tagescounter erstellt
if(!mysql_num_rows($result)){
$sql = "INSERT INTO
Counter
SET
Datum = CURDATE()
";
doQuery($sql);
}
// Alte (mehr als 1 Tag) IPs in 'Online' löschen
$sql = "DELETE FROM
Online
WHERE
DATE_SUB(NOW(), INTERVAL 1 DAY) > Datum
";
doQuery($sql);
//Überprüfe, ob die IP des Users bereits gespeichert ist
$sql = "SELECT
COUNT(*)
FROM
Online
WHERE
IP = '".$_SERVER['REMOTE_ADDR']."'";
$result = doQuery($sql);
$anzahl = mysql_result($result, 0);
//Ist die IP noch unbekannt, wird sie nun gespeichert...
if (!$anzahl){
$sql = "INSERT INTO
Online
(IP,
Datum
)
VALUES ('".$_SERVER['REMOTE_ADDR']."',
NOW()
)
";
doQuery($sql);
//... und der Tagescounter wird um 1 erhöht
$sql = "UPDATE
Counter
SET
Anzahl = Anzahl+1
WHERE
Datum = CURDATE()
";
doQuery($sql);
}
// Ist die IP bereits bekannt, wird ihr Zugriffdatum aktualisiert
else {
$sql ="UPDATE
Online
SET
Datum = NOW()
";
doQuery($sql);
}
?>
So, nun musst du die Daten noch ausgeben. Dazu erstellst du am besten eine neue Datei mit dem Namen counter_ausgabe.php oder so. Darin werden folgende Queries ausgeführt:
PHP:
<?php
error_reporting(E_ALL);
// User zählen, die..
// .. 'jetzt gerade' (d.h währende der letzten 2 Minuten)
// auf der Seite waren
$sql = "SELECT
COUNT(*)
FROM
Online
WHERE
DATE_SUB(NOW(), INTERVAL 2 MINUTE) < Datum
";
$result = doQuery($sql);
$user_now = mysql_result($result, 0);
// .. 'heute' auf der Seite waren
$sql = "SELECT
Anzahl
FROM
Counter
WHERE
Datum = CURDATE()
";
$result = doQuery($sql);
$row = mysql_fetch_assoc($result);
$user_heute = $row['Anzahl'];
//.. 'gestern' (optional) auf der Seite waren
$sql = "SELECT
Anzahl
FROM
Counter
WHERE
Datum = DATE_SUB(CURDATE(), INTERVAL 1 DAY)
";
$result = doQuery($sql);
$row = mysql_fetch_assoc($result);
$user_gestern = $row['Anzahl'];
//.. insgesamt die Seite besucht haben.
// Dazu wird die Gruppenfunktion SUM()
// verwendet, die alle Werte der Spalte 'Anzahl' summiert
$sql = "SELECT
SUM(Anzahl)
FROM
Counter
";
$result = doQuery($sql);
$user_gesamt = mysql_result($result, 0);
// Die Ausgabe kann z.B. so aussehen:
echo "<h1>Statistik</h1>\n";
echo "<table cellpadding=\"2\" style=\"margin:auto 0px auto 10px;".
" border:solid 1px #bbb; border-width:0px 1px 1px 0px;".
" font-size:10px; font-weight:bold; width:190px;\">\n".
" <tr style=\"background-color:#e7e7e7\">\n".
" <td>\n".
"Jetzt\n".
" </td>\n".
" <td style=\"text-align:right;\">\n".
$user_now."\n".
" </td>\n".
" </tr>\n".
" <tr style=\"background-color:#e3e3e3\">\n".
" <td>\n".
"Heute\n".
" </td>\n".
" <td style=\"text-align:right;\">\n".
$user_heute."\n".
" </td>\n".
" </tr>\n".
" <tr style=\"background-color:#e0e0e0\">\n".
" <td>\n".
"Gestern\n".
" </td>\n".
" <td style=\"text-align:right;\">\n".
$user_gestern."\n".
" </td>\n".
" </tr>\n".
" <tr style=\"background-color:#ddd;\">\n".
" <td>\n".
"Gesamt\n".
" </td>\n".
" <td style=\"text-align:right;\">\n".
$user_gesamt."\n".
" </td>\n".
" </tr>\n".
"</table>\n";
?>
|