Gå til innhold

Hvordan gjøre tellerscript unikt?


Anbefalte innlegg

Vil gjøre dette scriptet unikt, slik at det teller en ip en gang og lagrer den i tekstfilen kun en gang..

 

function teller($fil1){
$ip = getenv("REMOTE_ADDR");
$fil = "". $fil1 ."";
$f = file($fil);
$id4 = count($f);
$yest = time() - 99999999999999999999999999999999999999999999999999999;
$o = "0";
$xidag = "f";
$idag = time();
$idag2 = date("Y F d, H:i:s");
   while ($id4 > $o) {
       $streg = explode(" ", $f[$o]);
           if ($ip == $streg[0]) {
           $x = "t";
               if ($streg[1] > $yest) {
                   $xidag = "t";
               }
           }
       $o++;
   }
   if ($xidag == "f") {
       $logg = fopen("$fil", "a");
       fputs ($logg, "$ip $idag, $idag2\n");
       
       fclose ($logg);
   }
$f = file($fil);
$id4 = count($f);

} 

 

Som dere kansje ser har jeg bare satt 9999999999999999999... nå men synst det ble litt for uproffesjonelt..

Lenke til kommentar
Videoannonse
Annonse
Har tillgang til mySQL, noen som har ett bra script? :)

5733265[/snapback]

<?php

/*
Database tabel:

CREATE TABLE `teller` (
 `ip` varchar(20) NOT NULL default '',
 `tid` datetime NOT NULL default '0000-00-00 00:00:00'
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1;



*/


// Går utifra at du alt har opprettet kontakt med databasen


// denne teller og returnere antall uniqe treff.
function tell(){
$query = 'INSERT INTO teller ( ip, tid) VALUES ( "'.addslashes($_SERVER['REMOTE_ADDR']).'", now())';
mysql_query($query);
return hent_treff();
}


// denne returnere bare uniqe treff.
function hent_treff(){

$resultat = mysql_query('SELECT count(1) AS antall FROM teller group BY ip');
$data = mysql_fetch_assoc($resultat);
return $data['antall'];
}

?>

 

Dette er en ganske simel en da.. du kan også opprette "ip" som en UNIQUE KEY, slik at IP'n bare kan registeres en gang. Men hvis du gjør det slik som det er blitt gjort her så vil du ha muligheten til å få antall treff fra samme ip også.. men som sagt, dette er ganske simelt.. og jeg liker å bruke functioner :D

Lenke til kommentar

Jeg har selv laget ett som er en smule mere avansert i OOP:

 

klassen:

<?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);	
}
}
?>

 

 

tabell strukturen:

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;

 

Eksempel til bruk:

 

<?php
//helt øverst på alle sider som skal telle/vise statestikken
require_once('online.class.php'); //includer klassen
$online = new online(); //tilordne den til et objekt

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

 

Som du ser så har dette scriptet ytterlige to funksjoner, nemlig antall online, og unike treff i dag (Går på dato)

 

Det er testet og burde fungere utmerket. Men en IP kan KUN telles 1 gang så lenge den eksisterer i databasen (enkelt å endre så den sletter ip etter et visst antall dager... )

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