Logo - MyWebsolution.de
User gesamt  :  2787611
User online  :  2
KubaSeoTräume, PHP Forum, PHP Community and more ... MyWebsolution.de!
   
   
 
Registrieren Login User F.A.Q Suche Home

eingeloggt bleiben

MyWebsolution.de Foren » PHP und MYSQL » Counter

Seite: 1 Posts pro Seite: 5 10 20
Autor Thread
06.05.2007 11:38 Uhr Counter
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
Profil ansehen
06.05.2007 16:20 Uhr
Negura
Forenposter
 
registriert 06.12.2006
wohnt in
Beiträge 57
Hallo mdean,

deine Datenbank wird sicherlich nicht bei 5000 Datensätzen überlastet sein, eine Anzahl von 50.000.000 Datensätzen ist kein Problem.

Gruß Negura
Profil ansehen
06.05.2007 17:44 Uhr
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";
?>



Profil ansehen Mail senden
Seite: 1 no reply
Powered by Pascal Landau © 2006 MyWebsolution.de
Designed by Pascal Landau © 2006 MyWebsolution.de
 
 
 
 
Home Email Impressum Disclaimer Statistik