Usercount

PHP programming forum. Ask questions or help people concerning PHP code. Don't understand a function? Need help implementing a class? Don't understand a class? Here is where to ask. Remember to do your homework!

Moderator: General Moderators

Post Reply
mlitton
Forum Newbie
Posts: 11
Joined: Sun Sep 21, 2003 4:52 pm
Location: Sweden

Usercount

Post by mlitton »

Hi,

How do I count users that are currently visiting my site using PHP?
Could I use sessions and register a specific IP address? How do I remove the from the 'user quota' when they leave the site. Thank you!

-- Mike
qads
DevNet Resident
Posts: 1199
Joined: Tue Apr 23, 2002 10:02 am
Location: Brisbane

Post by qads »

don't need to use sessions, you just a database table with:

ip, timestamp

fields, then insert records in db table with user IP and a time stamp (tim()), use another query to delete old records, how old? thats up to you, i have used from 10sec to 5min at times.

then its matter of simple quesry counting number of rows....
Nay
Forum Regular
Posts: 951
Joined: Fri Jun 20, 2003 11:03 am
Location: Brisbane, Australia

Post by Nay »

Take a look at:

http://www.evilwalrus.com/viewcode.php?codeEx=778

it might help ;).

-Nay
mlitton
Forum Newbie
Posts: 11
Joined: Sun Sep 21, 2003 4:52 pm
Location: Sweden

Thanks

Post by mlitton »

It helped!
qads
DevNet Resident
Posts: 1199
Joined: Tue Apr 23, 2002 10:02 am
Location: Brisbane

Post by qads »

always with the easy way eh :?
Nay
Forum Regular
Posts: 951
Joined: Fri Jun 20, 2003 11:03 am
Location: Brisbane, Australia

Post by Nay »

Well, I hope he read through it. I tried some tutorials for that on google but couldn't find a nice one - so I resorted to Wally :D.

-Nay
Aaron
Forum Commoner
Posts: 82
Joined: Sun May 12, 2002 2:51 pm

Post by Aaron »

Well it doesnt work for me, I edited it further ofcourse and now it always says theres 1 user online when theres more!

Code: Select all

function userdofirst()
	{$remote_add = $REMOTE_ADDR;
	
	$tsql = mysql_query("SELECT ip, timeout FROM unz_online where ip = '$remote_add '") or die (mysql_error());
	$numrows = mysql_num_rows($tsql); 
	if ($numrows <= '0') 
	{$added = mysql_query("INSERT into unz_online (ip, timeout) values ('$remote_add ', '$time')") or die (mysql_error()); 
	if(!$added)
	{echo "Insert Error occurred";}} 
	else
	{$usql= mysql_query("UPDATE unz_online SET timeout = '$time' where ip = '$remote_add '")or die (mysql_error()); 
	mysql_query($usql);}} 

function usersOnline()
	{$seconds = '360';     
    $tstamp = $time - $seconds; 
    $result = mysql_query("SELECT ip, timeout FROM unz_online WHERE timeout >= '$tstamp'"); 
    if($result)
	{$numrows = mysql_num_rows($result);} 
    else
	$numrows = '0'; 
	
    if($numrows == '0')
	{echo "There are <b>no</b> users online.";}
	elseif($numrows <= 1)
	{echo "There is <b>" . $numrows . "</b> user online.";}
	else
	{echo "There are <b>" . $numrows . "</b> users online.";} 
    $delstamp = time() - $seconds; 
   // clean up file of outdated ip's 
   $cqry = mysql_query("DELETE from unz_online where timeout < ".$delstamp."") or die (mysql_error()); 
   $rslt = mysql_query($cqry);}
http://www.wuggawoo.co.uk/sections/forumz/index.php
User avatar
delorian
Forum Contributor
Posts: 223
Joined: Sun May 04, 2003 5:20 pm
Location: Olsztyn, Poland

Post by delorian »

Ok, I've written a script, based on that user Nay put here. It's fully operational and in class shell. I've also added some features, like MAX USERS EVER, and some error correction. Sorry for not providing any comments, but I've to erase them casue nobody here could understand them (they were in Polish).

Code: Select all

class whoisonline {

	var $rMyConnection; 
	var $sHost;			
	var $sUser;			
	var $sPassword;	
	var $sDatabase;	
	var $sTableName;
	var $sIP;		
	var $iInterval;		
	var $iActualTime;	

	function whoisonline($sHost,$sUser,$sPassword,$sDatabase,$sTableName,$sIP,$iInterval) {
		

		$this->sHost = $sHost;
		$this->sUser = $sUser;
		$this->sPassword = $sPassword;
		$this->sDatabase = $sDatabase;
		$this->sTableName = $this->_validate_name($sTableName);
		$this->sIP = $this->_validate_ip($sIP);	// IP poddamy walidacji
		$this->iInterval = intval($iInterval);
		
		
		$this->_open_db();	
		$this->_select_db();	
	
		
		$this->set_max(1);	
		$this->set_user();
	}


	
	function _open_db() {
		$this->rMyConnection = @mysql_connect($this->sHost,$this->sUser,$this->sPassword) or die("Nie mo&#380;na po&#322;&#261;czy&#263; si&#281; z baz&#261; danych. ".mysql_error());		
	}
	
	function _select_db() {
		@mysql_select_db($this->sDatabase,$this->rMyConnection) or die("Nie mo&#380;na wybra&#263; bazy danych. ".mysql_error());
	}
	
	function _query_db($sQuery) {
		$rResult = @mysql_query($sQuery,$this->rMyConnection) or die("Kwerenda nie mo&#380;e by&#263; wykonana. ".mysql_error());
		return $rResult;
	}
	
	function _validate_ip($sIP) {
		$sPattern = "/[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}.[\d]{1,3}/"; 
		if(preg_match($sPattern,$sIP)) {
			return $sIP;
		}
		return "127.0.0.1";	
	}
	
	
	function _validate_name($sTableName) {
		$sPattern = "/[\w\-]+/i"; 
		if(preg_match($sPattern,$sTableName)) {
			return $sTableName;
		}
		return "whoisonline";	
	}
	


	
	function set_max($iHowMany)	{
		
		
		$sQuery = "SELECT ip FROM ".$this->sTableName." ORDER BY timestamp DESC LIMIT 1";
		$rResult = $this->_query_db($sQuery);
		$aMax = @mysql_fetch_assoc($rResult);
		

		if(intval($aMax['ip'])<intval($iHowMany)) {
			$sQuery = "UPDATE ".$this->sTableName." SET ip=".intval($iHowMany)." WHERE ip=".intval($aMax['ip']);
			$this->_query_db($sQuery);
		}
	}

	
	function set_user() {
	
		
		$this->iActualTime = time();	
	
		
		$sQuery = "SELECT * FROM ".$this->sTableName." WHERE ip = '".$this->sIP."'";
		$rResult = $this->_query_db($sQuery);
		
		
		if(!mysql_num_rows($rResult)) {
			$sQuery = "INSERT INTO ".$this->sTableName." VALUES ('".$this->sIP."', ".$this->iActualTime.")";
			$this->_query_db($sQuery);
		} else { // je&#347;li znalaz&#322; to nadpisz jego czas, tak zeby byl aktualny
			$sQuery = "UPDATE ".$this->sTableName." SET timestamp = ".$this->iActualTime." WHERE ip = '".$this->sIP."'";
			$this->_query_db($sQuery);
		}
	}

	
	function whois_online() {
		
		$iOverTime = time() - $this->iInterval;
		
	
		$sQuery = "SELECT COUNT(*) AS users_count FROM ".$this->sTableName." WHERE timestamp >= ".$iOverTime; // -1 dlatego ze jest tam MAX
		$rResult = $this->_query_db($sQuery);
		$aCount = mysql_fetch_assoc($rResult);
		
		// sprawdzamy czy aby nie bylo teraz wiecej userow niz jest max
		$this->set_max($aCount['users_count']-1); // -1 dlatego, &#380;e jest tam ju&#380; jeden wiersz z wartoscia MAX
		
		// kasowanie starych wartosci
		$sQuery = "DELETE FROM ".$this->sTableName." WHERE timestamp < ".$iOverTime;
		$this->_query_db($sQuery);
		
		return $aCount['users_count']-1; // -1 dlatego, &#380;e jest tam ju&#380; jeden wiersz z wartoscia MAX
	}
	
	
	function max_online() {
		
		// pobieramy aktulany max z tabeli
		$sQuery = "SELECT ip FROM ".$this->sTableName." ORDER BY timestamp DESC LIMIT 1";
		$rResult = $this->_query_db($sQuery);
		$aMax = @mysql_fetch_assoc($rResult);
	
		return $aMax['ip'];
	}
}

// and the usage


$sHost = 'localhost';			
$sUser = '';			
$sPassword = '';		
$sDatabase = '';		
$sTableName = 'whoisonline';	
$sIP = $_SERVER['REMOTE_ADDR'];		
$iInterval = 300;	


$whoisonline = new whoisonline($sHost,$sUser,$sPassowrd,$sDatabase,$sTableName,$sIP,$iInterval);

echo "USERS ON-LINE: ".$whoisonline->whois_online();
echo "<br>MAX USERS EVER: ".$whoisonline->max_online();
And some SQL

Code: Select all

CREATE TABLE whoisonline (
	ip VARCHAR(15),
	timestamp INT(10) UNSIGNED
);
-- the 9999999999 here doesn't matter, but it should be the very very large number, larger than 2-3 bilions. 
INSERT INTO whoisonline VALUES (0,9999999999);
Nay
Forum Regular
Posts: 951
Joined: Fri Jun 20, 2003 11:03 am
Location: Brisbane, Australia

Post by Nay »

delorian wrote:Ok, I've written a script, based on that user Nay put here.....
Hey! lol

Call me Nay :D

-Nay
User avatar
delorian
Forum Contributor
Posts: 223
Joined: Sun May 04, 2003 5:20 pm
Location: Olsztyn, Poland

Post by delorian »

Nay wrote: Call me Nay :D
Sorry, Nay. :P
Aaron
Forum Commoner
Posts: 82
Joined: Sun May 12, 2002 2:51 pm

Post by Aaron »

I dont like classes and I dont need the db bit so I wont try to deciefer your code, if it works Id have like to have used it :(
User avatar
delorian
Forum Contributor
Posts: 223
Joined: Sun May 04, 2003 5:20 pm
Location: Olsztyn, Poland

Post by delorian »

Aaron wrote:I dont like classes and I dont need the db bit so I wont try to deciefer your code, if it works Id have like to have used it :(
You don't need to, It is in a class so the only thing you've got to know is how to construct it and what to use to make it work properly. :D


BTW: Here's an update, because I forgot something usefull and written in good manner :P (the close_db() method)

Code: Select all

class whoisonline { 

   var $rMyConnection; 
   var $sHost;          
   var $sUser;          
   var $sPassword;    
   var $sDatabase;    
   var $sTableName; 
   var $sIP;       
   var $iInterval;       
   var $iActualTime;    

   function whoisonline($sHost,$sUser,$sPassword,$sDatabase,$sTableName,$sIP,$iInterval) { 
       

      $this->sHost = $sHost; 
      $this->sUser = $sUser; 
      $this->sPassword = $sPassword; 
      $this->sDatabase = $sDatabase; 
      $this->sTableName = $this->_validate_name($sTableName); 
      $this->sIP = $this->_validate_ip($sIP);   // IP poddamy walidacji 
      $this->iInterval = intval($iInterval); 
       
       
      $this->_open_db();    
      $this->_select_db();    
    
       
      $this->set_max(1);    
      $this->set_user(); 
   } 


    
   function _open_db() { 
      $this->rMyConnection = @mysql_connect($this->sHost,$this->sUser,$this->sPassword) or die("Nie mo&#380;na po&#322;&#261;czy&#263; si&#281; z baz&#261; danych. ".mysql_error());       
   } 
    
   function _select_db() { 
      @mysql_select_db($this->sDatabase,$this->rMyConnection) or die("Nie mo&#380;na wybra&#263; bazy danych. ".mysql_error()); 
   } 
    
   function _query_db($sQuery) { 
      $rResult = @mysql_query($sQuery,$this->rMyConnection) or die("Kwerenda nie mo&#380;e by&#263; wykonana. ".mysql_error()); 
      return $rResult; 
   } 
    
   function _validate_ip($sIP) { 
      $sPattern = "/[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}.[\d]{1,3}/"; 
      if(preg_match($sPattern,$sIP)) { 
         return $sIP; 
      } 
      return "127.0.0.1";    
   } 
    
    
   function _validate_name($sTableName) { 
      $sPattern = "/[\w\-]+/i"; 
      if(preg_match($sPattern,$sTableName)) { 
         return $sTableName; 
      } 
      return "whoisonline";    
   } 
    // THIS IS WHAT I ADD
   function close_db() {
	@mysql_close($this->rMyConnection) or die(mysql_error());
	}    
   function set_max($iHowMany)   { 
    // END - THIS IS WHAT I ADD       
       
      $sQuery = "SELECT ip FROM ".$this->sTableName." ORDER BY timestamp DESC LIMIT 1"; 
      $rResult = $this->_query_db($sQuery); 
      $aMax = @mysql_fetch_assoc($rResult); 
       

      if(intval($aMax['ip'])<intval($iHowMany)) { 
         $sQuery = "UPDATE ".$this->sTableName." SET ip=".intval($iHowMany)." WHERE ip=".intval($aMax['ip']); 
         $this->_query_db($sQuery); 
      } 
   } 

    
   function set_user() { 
    
       
      $this->iActualTime = time();    
    
       
      $sQuery = "SELECT * FROM ".$this->sTableName." WHERE ip = '".$this->sIP."'"; 
      $rResult = $this->_query_db($sQuery); 
       
       
      if(!mysql_num_rows($rResult)) { 
         $sQuery = "INSERT INTO ".$this->sTableName." VALUES ('".$this->sIP."', ".$this->iActualTime.")"; 
         $this->_query_db($sQuery); 
      } else { // je&#347;li znalaz&#322; to nadpisz jego czas, tak zeby byl aktualny 
         $sQuery = "UPDATE ".$this->sTableName." SET timestamp = ".$this->iActualTime." WHERE ip = '".$this->sIP."'"; 
         $this->_query_db($sQuery); 
      } 
   } 

    
   function whois_online() { 
       
      $iOverTime = time() - $this->iInterval; 
       
    
      $sQuery = "SELECT COUNT(*) AS users_count FROM ".$this->sTableName." WHERE timestamp >= ".$iOverTime; // -1 dlatego ze jest tam MAX 
      $rResult = $this->_query_db($sQuery); 
      $aCount = mysql_fetch_assoc($rResult); 
       
      // sprawdzamy czy aby nie bylo teraz wiecej userow niz jest max 
      $this->set_max($aCount['users_count']-1); // -1 dlatego, &#380;e jest tam ju&#380; jeden wiersz z wartoscia MAX 
       
      // kasowanie starych wartosci 
      $sQuery = "DELETE FROM ".$this->sTableName." WHERE timestamp < ".$iOverTime; 
      $this->_query_db($sQuery); 
       
      return $aCount['users_count']-1; // -1 dlatego, &#380;e jest tam ju&#380; jeden wiersz z wartoscia MAX 
   } 
    
    
   function max_online() { 
       
      // pobieramy aktulany max z tabeli 
      $sQuery = "SELECT ip FROM ".$this->sTableName." ORDER BY timestamp DESC LIMIT 1"; 
      $rResult = $this->_query_db($sQuery); 
      $aMax = @mysql_fetch_assoc($rResult); 
    
      return $aMax['ip']; 
   } 
} 

// and the usage 


$sHost = 'localhost';          
$sUser = '';          
$sPassword = '';       
$sDatabase = '';       
$sTableName = 'whoisonline';    
$sIP = $_SERVER['REMOTE_ADDR'];       
$iInterval = 300;    


$whoisonline = new whoisonline($sHost,$sUser,$sPassowrd,$sDatabase,$sTableName,$sIP,$iInterval); 

echo "USERS ON-LINE: ".$whoisonline->whois_online(); 
echo "<br>MAX USERS EVER: ".$whoisonline->max_online(); 
$whoisonline->close_db();
Aaron
Forum Commoner
Posts: 82
Joined: Sun May 12, 2002 2:51 pm

Post by Aaron »

the db confuses me to hell, can you remove the that for me?

I get confused with classes, they arent called like functions?
User avatar
delorian
Forum Contributor
Posts: 223
Joined: Sun May 04, 2003 5:20 pm
Location: Olsztyn, Poland

Post by delorian »

Aaron wrote:the db confuses me to hell, can you remove the that for me?
Common, the db's aren't such a bad thing as you say. I can't remove them cause you won't get anything from the database :D :lol:
Aaron wrote: I get confused with classes, they arent called like functions?
Classes aren't called. You make an object which has the properties of class, and then you can call one of the property. So the "problem" with calling class functions (which in fact are methods) is that you have to use the object name before the method and then '->' (pointer) mark

so the typical funciton is called like this:

function_name();

and the object method:

$object->method_name();

BTW: Don't be affraid of classes, they are great after all. And also read: viewtopic.php?t=8873
Aaron
Forum Commoner
Posts: 82
Joined: Sun May 12, 2002 2:51 pm

Post by Aaron »

Well these functions work well

Code: Select all

function usersonline($uid) 
	{$ip = $_SERVER["REMOTE_ADDR"]; 
	$time = time();
	$timeoutseconds = '300'; 
	$timeout = $time - $timeoutseconds; 
	$delete = mysql_query("DELETE FROM unz_online WHERE time < '$timeout'");
	$insert = mysql_query("INSERT INTO unz_online VALUES ('$time','$ip','$uid')");} 

	function show_usersonline() 
	{$check = mysql_num_rows(mysql_query("SELECT DISTINCT ip FROM `unz_online`")); 
	echo "$check Users online";}
I wish it stored the most visitors ever though XD

Ill read up on classes, but they seem blehish.
Post Reply