Gå til innhold

Brukere online script?


Anbefalte innlegg

Hei

 

Jeg trenger hjelp av noen som kan hjelpe meg med å gjøre slik at visit counter scriptet mitt viser hvor mange som er på sida akkurat NÅ.

 

Scriptet viser dette nå:

    » I dag:  17

    » I går:  34

    » Totalt:  206

    » Besøk pr. dag:  23

 

Noen som har noe å bidra med?

 

Jeg kan sia at alle visitene og ip'ene blir lagra i flat filer.

 

Edit:La til filene.

 

Det er 3 filer i tillegg til de som er der;

count.db:00%00%00%0000 00 00%0

De to første nullene er for besøk i dag,

De to neste er for besøk i går,

De to neste er for totalt besøk,

De åtte neste er for dagens dato og

de 2 siste er for besøk pr dag.

 

ip.db: Der lagres alle ip'ene som besøker sida.

 

Index.html: den er tom.

counter.php

Endret av BigJackW
Lenke til kommentar
Videoannonse
Annonse

<?php
$gammel = file("online.txt");
$online_tid = time();
$timeout = $online_tid - 180;
$online_fil = fopen("data/online.txt", w);
fwrite($online_fil, "$REMOTE_ADDR|$online_tid\n");
foreach($gammel as $online_linje) {
$online_arr = explode("|", $online_linje);
if($online_arr[1] > $timeout) {
fwrite($online_fil, "$online_linje");
}
}
fclose($online_fil);
$ny = file("data/online.txt");
$ips_arr = array();
foreach($ny as $ny_online_linje) {
$ny_online_arr = explode("|", $ny_online_linje);
$ip = $ny_online_arr[0];
if (!isset($ips_arr[$ip])) { $ips_arr[$ip] = "1"; }
}
$antall_online = sizeof($ips_arr);
echo" $antall_online";
?>

 

Den skulle funkere =)

husk og lag online.txt og chmode til 666

Lenke til kommentar

Nei den fungerer ikke.

 

Den viser bare:

 

» Brukere online:  1

 

uansett hvor mange som er innpå sida.

 

Edit: Dette kommer i online.txt fila:

 

 

 

|1138734305

|1138734297

|1138734260

|1138734259

|1138734254

|1138734246

|1138734246

|1138734245

|1138734245

|1138734244

|1138734243

|1138734242

|1138734241

|1138734239

|1138734238

|1138734237

|1138734235

|1138734234

|1138734234

|1138734232

|1138734231

|1138734231

|1138734229

|1138734229

|1138734229

|1138734224

|1138734205

|1138734204

|1138734203

|1138734203

|1138734202

|1138734200

|1138734199

|1138734198

|1138734197

|1138734196

|1138734178

|1138734172

|1138734171

|1138734170

|1138734169

|1138734168

|1138734166

|1138734165

|1138734163

|1138734161

|1138734161

|1138734160

|1138734156

|1138734155

|1138734154

|1138734154

|1138734153

|1138734152

|1138734151

|1138734151

|1138734150

|1138734149

|1138734147

|1138734147

|1138734147

|1138734146

|1138734145

|1138734136

|1138734134

|1138734132

 

 

Endret av BigJackW
Lenke til kommentar

dette kan gjøres ved hjelp av mysql eller lignende på en veldig enkel måte.

 

Lag en tabell som ser slik ut:

 

IP | varchar(20)

tid | timestamp

 

lagre ip adressen til de som surfer der sammen med unix time ( time() i php)

 

oppdater om mulig og oppdater kolonnen for hver gang det refreses med time()+900

 

da kan du hente ut alle linjer som har tid > time()

 

slik jeg gjør det i allefall...

 

altså:

 

1: Sjekk om serferens ip finnes i db fra før:

2: Om funnet, oppdater denne med time() + 900 (15 min)

3: Om ikke funnet, legg til ny rad

4: SELECT * from online WHERE tid > time()

 

så er det bare å printe ut mysql_num_rows()

Lenke til kommentar

Jada. Det kan du, merk: denne er kun alpha testet, så om du finner noe feil si ifra, men den fungerer altså her, men ikke prøvd med flere brukere.

 

Den teller heller ikke totalt besøkende med unik treff på 24 timer, men kun unik treff på ip (altså teller kun 1 gang per ip uansett hvor lang tid det er mellom hvert besøk)

 

dette kan selfølgelig legges til om ønskelig.

 

Scriptet er laget i OOP så her er klassen. lagre som online.class.php

(husk å redigere den øverste delen i minsql klassen som hostname, username etc,

endre også standard databasen som du finner inne i () i minsql funskjon deklarasjonen:

 

function minsql($db = 'databasen_min')

 

<?php
class minsql{
var $hostname = 'localhost';
var $username = 'root';
var $password = '';
var $db;	

function minsql($db = 'test'){
 $this->db = $db;
 $ret = mysql_connect($this->hostname, $this->username, $this->password);
 mysql_select_db($db, $ret);
 return $ret;
}

function getDB(){
 return $this->db;	
}
}

class online extends minsql {

var $ip;
var $conn;
 
function online(){
 $this->conn = parent::minsql();
 
 $ip = $_SERVER['REMOTE_ADDR'];
 $this->ip = $ip;
 $sql = "SELECT time FROM online WHERE ip='$ip'";
 $result = mysql_query($sql);
 
 if(!$result){
 	$this->addip();	
 } else {
 	$num = mysql_num_rows($result);
 	if( $num == 1){
   $this->refreship();	
 	} else if ($num > 1){
   $this->eraseip();
   $this->addip();	
 	} else {
   $this->addip();	
 	}
 }	
}

function addip(){
 $sql = sprintf("INSERT into online (ip, time, dato) VALUES ('%s', %d, NOW())", $this->ip, time()+900);
 $result = mysql_query($sql);
}

function refreship(){
 $sql = sprintf("UPDATE online SET time=%d, dato=NOW() WHERE ip='%s'", time()+900, $this->ip);
 $result = mysql_query($sql) or die(mysql_error());	
}

function eraseip(){
 $sql = "DELETE from online WHERE ip='$this->ip'";
 $result = mysql_query($sql);	
}

function end(){
 mysql_close($this->conn);	
}

function visidag(){
 $sql = "SELECT * FROM online WHERE dato = CURRENT_DATE()";
 $result = mysql_query($sql) or die(mysql_error());
 
 return mysql_num_rows($result);	
}

function visonline(){
 $sql = sprintf("SELECT ip FROM online WHERE time > '%d'", time());
 $result = mysql_query($sql);
 
 if(!$result){
 	return 0;	
 }
 
 return mysql_num_rows($result);	
}

function visunike(){
 $sql = "SELECT ip FROM online";
 $result = mysql_query($sql);
 
 if(!$result){
 	return 0;	
 }
 
 return mysql_num_rows($result);	
}
}
?>

 

Her er SQLen for å lage db en

 

CREATE TABLE `online` (
 `ip` varchar(20) collate latin1_general_ci NOT NULL default '',
 `time` int(15) default NULL,
 `dato` date NOT NULL default '0000-00-00'
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

 

Her er et VELDIG enkelt eksempel på bruk:

 

<?php
//helt øverst på alle sider som skal telle/vise statestikken
require_once('online.class.php');
$online = new online();

//der du vil det skal vises kan du bruke disse klasse komandoene
echo '<br />';
echo "Online: ". $online->visonline() ."<br />";
echo "Besøk i dag: ". $online->visidag() ."<br />";
echo "Unike treff:". $online->visunike() ."<br />";


?>

 

Har du flere spørsmål så si ifra ;)

Endret av NH
Lenke til kommentar
<?php
$gammel = file("online.txt");
$online_tid = time();
$timeout = $online_tid - 180;
$online_fil = fopen("data/online.txt", w);
fwrite($online_fil, "$REMOTE_ADDR|$online_tid\n");
foreach($gammel as $online_linje) {
$online_arr = explode("|", $online_linje);
if($online_arr[1] > $timeout) {
fwrite($online_fil, "$online_linje");
}
}
fclose($online_fil);
$ny = file("data/online.txt");
$ips_arr = array();
foreach($ny as $ny_online_linje) {
$ny_online_arr = explode("|", $ny_online_linje);
$ip = $ny_online_arr[0];
if (!isset($ips_arr[$ip])) { $ips_arr[$ip] = "1"; }
}
$antall_online = sizeof($ips_arr);
echo" $antall_online";
?>

 

Den skulle funkere =)

husk og lag online.txt og chmode til 666

5529549[/snapback]

 

Husk at $REMOTE_ADDR ikke vil fungere på alle PHP-servere pga register_globals kan være slått av. Husk alltid å bruke $_ på slike variabler. $_SERVER["remote_addr"] f.eks.. Imo, så er det en stygg uvane å kode phpkode som er avhenig av at register_globals er satt til on

Lenke til kommentar

Edit: NH: Jeg tok bort noe av den siste koden slik at det står bare dette igjen:

echo "Brukere online:". $online->visonline() ."<br />";?>

 

For jeg har de andre counterne på sida, men hvor lang tid "holder" mysql på ip'ene til de som er inne på sida? Og da meneer jeg "online" statusen!

Endret av BigJackW
Lenke til kommentar

databasen oppdateres med ett kvarter for hver refresh.

 

den koden om bruk var der for eksempel så du så alle mulighetene, Infoen lagres i databsen uansett da det kun er snakk om forksjellige SQL spørringer som utgjør den forskjellige infoen.

 

annbefaler å bruke $online->end() etter visning av alle tellerne da den da kjører mysql_close() opp mot koblingen sin til mySQL. eventuelt kan du legge til:

 

$this->end() nederst i visonline() funksjonen. så sparer du deg for en linje i index fila di.

Endret av NH
Lenke til kommentar

Tilsvarer ikke 900 sekund 15 min?

 

Tror det er sjelden det er noen innpå der 15 min :p

 

den koden om bruk var der for eksempel så du så alle mulighetene, Infoen lagres i databsen uansett da det kun er snakk om forksjellige SQL spørringer som utgjør den forskjellige infoen.

 

annbefaler å bruke $online->end() etter visning av alle tellerne da den da kjører mysql_close() opp mot koblingen sin til mySQL. eventuelt kan du legge til:

 

$this->end() nederst i visonline() funksjonen. så sparer du deg for en linje i index fila di.

 

Jeg skjønner ikke hva du mener?!?

Endret av BigJackW
Lenke til kommentar

900sek / 60sek = 15min (60 sekunder i 1 minutt :p )

 

jeg sa de andre mulighetene (som unike treff, og treff i dag) kun er andre spørringer opp mot samme informasjon.

 

legg til:

$online->end() etter

$online->visonline()

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...