Logo - MyWebsolution.de
User gesamt  :  2393944
User online  :  1
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($result0);

    
//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($result0);

    
// .. '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($result0);

    
// 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