PHP Besucherzähler

08/10/2012 13:42 CracyCrazz#1
Servus,


ich wende mich nochmals an euch damals konnte man mir ja bei meinem Problem helfen. Ich versuche gerade einen Besucherzähler zu programmieren.

Das ganze soll einfach gehalten sein, ich möchte zählen wieviele Besucher pro Tag auf der Seite waren, wieviele am Tag davor online waren und wieviele im Monat auf der Seite waren und die gesamt Zahl.


Das Gesamte ist kein Problem. Bei dem Punkt wieviele es heute waren hapert es schon, ich kann euch ja mal den Ausschnitt hier zeigen:

PHP Code:

    
#Besucher heute
    
        
$time time();
        
        
$heute date("d.m.Y");
        
        
$sql_besucher_heute 'SELECT * FROM counter WHERE date = \''.$heute.'\'';
        
        
$query_besucher_heute mysql_query($sql_besucher_heute);
        
        
$fetch_besucher_heute mysql_fetch_array($query_besucher_heute);
        
        
$besucher_heute $fetch_besucher_heute['id'];
        
        echo 
'Besucher heute:';
        
        echo 
'<b><p style="padding-left: 5px;">'.$besucher_heute.'</p></b>';
        
    
    
#Besucher gestern
    
    
        
echo 'Besucher gestern:';
        
        echo 
'<b><p>'.$besucher_gestern.'</p></b>';
    
    
    
#Besucher im Monat
    
    
        
echo '<p>Besucher letzten Monat:</p>';
        
        echo 
'<b><p>'.$besucher_monat.'</p></b>';
    
    
    
#Besucher gesamt
    
        
$sql_gesamt_besucher 'SELECT * FROM counter';
        
        
$query_gesamt_besucher mysql_query($sql_gesamt_besucher);
        
        
$fetch_array_besucher_gesamt mysql_fetch_array($query_gesamt_besucher);
        
        
$gesamt_besucher $fetch_array_besucher_gesamt['id'];
        
        echo 
'<p>Besucher gesamt:</p>';
        
        echo 
'<b><p style="padding-left: 5px;">'.$gesamt_besucher.'</p></b>';
        
    
#Derzeit eingeloggte Nutzer

    
$sql_online_users 'SELECT username, now_online FROM users WHERE now_online = \'yes\'';
    
    
$query_online_users mysql_query($sql_online_users);
    
    echo 
'<p>Derzeit sind folgende Nutzer eingeloggt:';
    
    if(
mysql_num_rows($query_online_users) != 0)
    {
        
        while(
$fetch_online_users mysql_fetch_assoc($query_online_users))
        {
            
            echo 
'<p>'.$fetch_online_users['username'].'</p>';
        }
        
    }else{
        
        echo 
'<p style="padding-left: 5px;">Keine Nutzer sind derzeit online.</p>';
        
    } 
Ich schätze mal es hängt bei dem WHERE in der PHP Abfrage den wenn ich das ganze in phpMyAdmin ausprobiere gibt er ebenfalls ein leeres Resultat zurück leider, weiß ich nicht wieso :x. Ich hoffe ihr könnt mir da bisschen was zusagen.


Liebe Grüße

CracyCrazz
08/10/2012 14:13 kissein#2
MySQL's standard format ist:

PHP Code:
date("Y-m-d H:i:s"
wenn dein db column das "DATE_FORMAT" hat(glaub mysql5.0+) ist es noch einfacher/effizienter da php wegfällt.
[Only registered and activated users can see links. Click Here To Register...]

z.b. in deinem fall dann
Quote:
SELECT DATE_FORMAT( `dbfeldname` , '%d.%m.%Y' ) FROM counter
08/11/2012 10:46 playa18#3
moin,

gib mal $sql_besucher_heute aus dann schau mal wie dein select aussieht...

\''.$heute.'\'' = falsch

'".$heute."' = richtig

und debugge erst mal bevor du ein kiddy script reinpostest
08/11/2012 13:07 CracyCrazz#4
Quote:
Originally Posted by playa18 View Post
moin,

gib mal $sql_besucher_heute aus dann schau mal wie dein select aussieht...

\''.$heute.'\'' = falsch

'".$heute."' = richtig

und debugge erst mal bevor du ein kiddy script reinpostest
Ja, es mag ein Kiddy Skript sein, aber jetzt mal ehrlich ich arbeite nicht so super lange damit, also ne mehr sag ich dazu mal nicht.

Ich hab das Problem selbst hinbekommen, es war alles richtig. Ich hatte nur einen kleinen Denkfehler.

Von daher brauch ich keine Hilfe mehr. Das Ding ist fertig, zwar nicht 100% effizient, aber es funktioniert für den Anfang reicht es mir persönlich.

Achja ,und PS: es kam folgendes raus: SELECT * FROM counter WHERE datum = '11.08.2012'

Ich habs schon richtig maskiert..^^
08/11/2012 15:27 mdna#5
Alternativer Denkanstoss: Du gibst jedem User nen Cookie der sagt, dass er schon auf der Seite war (Haltbarkeit 24h) und countest für jeden der keinen solchen Cookie hat deinen Dayli-Wert + 1 --> sollte vill n bischen eleganter sein :)

MfG, Mdna
08/11/2012 17:28 boxxiebabee#6
Quote:
Originally Posted by mdna View Post
Alternativer Denkanstoss: Du gibst jedem User nen Cookie der sagt, dass er schon auf der Seite war (Haltbarkeit 24h) und countest für jeden der keinen solchen Cookie hat deinen Dayli-Wert + 1 --> sollte vill n bischen eleganter sein :)

MfG, Mdna
Noch besser wäre es die Zeit auszurechnen bis der Tag vorbei ist, un das als Lebensdauer des Cookie zu setzen.
08/18/2012 04:20 FR28#7
index.php:
PHP Code:
<?php
require_once'includes/mysql_connect.php';
require_once
'classes/SimpleCounter.class.php';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>
  <title>Counter</title>
</head>

<body>

<?php
$counter 
= new SimpleCounter();
//count
$counter->count();
//visitors total
echo $counter->getVisitors().'<br />';
//visitors total one day ago
echo $counter->getVisitors(0,$counter->getTime(0)).'<br />';
//visitors today
echo $counter->getVisitors($counter->getTime(),time()).'<br />';
//visitors one day ago
echo $counter->getVisitors($counter->getTime(1),$counter->getTime(0)).'<br />';
//visitors two days ago
echo $counter->getVisitors($counter->getTime(2),$counter->getTime(1)).'<br />';

for (
$i=0$i<=10$i++)  {
  
$from=date("d.m.Y",$counter->getTime($i));
  
$to=date("d.m.Y",$counter->getTime($i-1));
  echo 
"visitors from $from to $to : ".$counter->getVisitors($counter->getTime($i),$counter->getTime($i-1)).'<br />';
}


?>

</body>

</html>
includes/mysq_connect.php:
PHP Code:
<?php
  $dbhost 
'localhost';
  
$dbuser 'root';
  
$dbpass '';
  
$db 'counter';
  
mysql_connect($dbhost$dbuser$dbpass) or die('Error connecting to mysql');
  
mysql_select_db($db);
?>
classes/SimpleCounter.class.php:
PHP Code:
<?php
require_once'DBController.class.php';
class 
SimpleCounter extends DBController{

  public function 
getTime($daysAgo=0){
    return 
time()-(date("H")*3600+date("i")*60+date("s"))-($daysAgo*86400);
  }

  public function 
count(){
    if(!isset(
$_COOKIE['cookie'])){
      
$this->setCookie();
      
$this->addVisitor();
    }
  }

  private function 
setCookie(){
    
setcookie("cookie""counter"$this->getTime()+86400);
  }

}
?>
classes/DBController.class.php:
PHP Code:
<?php
require_once'MysqlHelper.class.php';
class 
DBController extends MysqlHelper{

  private function 
addVisitor(){
    
$this->_('insert into counter set ip=')->esc($_SERVER['REMOTE_ADDR'])->exec();
  }

  public function 
getVisitors($from=0,$to=0){
    
$to=($to==0)?time():$to;
    return 
$this->_('select count(*) from counter where UNIX_TIMESTAMP(timestamp) between ')->esc($from)->_(' and ')->esc($to)->execSelect('single');
  }


}
?>
classes/MysqlHelper.class.php:
PHP Code:
<?php
class MysqlHelper{
    private 
$__query;

    protected function 
esc($value){
     
mysql_real_escape_string($value);
     
$value=(is_string($value))?"'".$value."'":$value;
     
$this->__query.=$value;
     return 
$this;
    }

    public function 
escape($value){
      
mysql_real_escape_string($value);
      return  
$value=(is_string($value))?"'".$value."'":$value;
    }

    protected function 
_($string){
      
$this->__query.=$string;
      return 
$this;
    }

    protected function 
execSelect($returnValues='numeric,row,single'){
      
$result mysql_query($this->__query);
      
$this->__query='';
      while (
$row mysql_fetch_assoc($result)) {
        
$columns=mysql_num_fields($result);
        
$rows mysql_num_rows($result);
          for (
$i 0$i $columns$i++) {
            
$fieldName=mysql_field_name($result$i);
              switch (
$returnValues) {
                case 
'row':
                  
$values[$fieldName]=$row[$fieldName];
                  break;
                case 
'single':
                  
$values=$row[$fieldName];
                  break;
                case 
'numeric':
                  
$values[]=$row[$fieldName];
                  break;
                case 
'numeric,row,single':
                  
$values[$fieldName][]=$row[$fieldName];
                  break;
              }
           }
      }
      
mysql_free_result($result);
      return 
$values;
    }

     protected function 
exec($returnOption=''){
       
$result=mysql_query($this->__query);
       
$this->__query='';
       if(
$returnOption=='insert_id'){
          return 
mysql_insert_id();
       }
       return 
mysql_affected_rows();
     }
}
?>
DB:
Code:
CREATE TABLE IF NOT EXISTS `counter` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ip` varchar(15) NOT NULL,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
[Only registered and activated users can see links. Click Here To Register...]
08/18/2012 22:08 dowhile#8
Wenn Kritik erlaubt ist:

Code:
    protected function esc($value){
     mysql_real_escape_string($value);
     $value=(is_string($value))?"'".$value."'":$value;
     $this->__query.=$value;
     return $this;
    }
Du verwendest mysql_real_escape_string() falsch. Die Funktion gibt den maskierten String zurück - Du aber ignorierst den Rückgabewert. Der Aufruf hat ergo keinen Effekt.

Ansonsten finde ich aber deine Vererbungshierarchie komisch. Wieso muss SimpleCounter von DBController erben, und wieso erbt DBController von MysqlHelper? Welchen Sinn macht hier eine Ist-ein-Beziehung? Ich würde das so gestalten, dass SimpleCounter eine Instanz von DBController erstellt und verwendet (oder injiziert bekommt) - gleiches für DBController.
Ich kann meine Meinung nicht wirklich begründen, aber irgendwie wirkt diese Struktur einfach ... "Komisch?" ... Auf mich. Vielleicht habe ich aber auch keine Ahnung davon. Ich bin schließlich kein allwissender Fachinformatiker wie unser Guru playa18.