Gå til innhold

*LØST*Tekstbasert teller som teller samme bruker om igjen etter en viss periode


Anbefalte innlegg

Hei

Har et veldig enkelt tekstbasert PHP script som lagrer unike IP-adresser til besøkende og viser det på den siden jeg kjører det på. Problemet er at det altså bare lagrer hver besøkende en gang, men jeg vil gjerne at det skal kunne telle samme besøkende om igjen, dersom det f.eks. er noen timer siden sist gang vedkommende var inne. Jeg vil altså heller ikke at den skal telle samme person om og om igjen hver gang han trykker refresh!

 

Scriptet jeg bruker nå er som følger:

<?php

$file = "my_hits.txt";
$user_ip = $_SERVER['REMOTE_ADDR'] . "\n";
$ip_list = file($file);
$visitors = count($ip_list) - 1;

if (in_array($user_ip, $ip_list))
{
echo ("$visitors");
} else {

$fp = fopen($file,"a");
fwrite($fp, "$user_ip");
fclose($fp);

$visitors++;
echo $visitors;
}

?>

 

Har grunnleggende forståelse for bruk og endring av PHP script, men ikke nok til at jeg kan skrive inn vesentlige endringer slik som dette. Noen som kan hjelpe meg?

Endret av g0mpen
Lenke til kommentar
Videoannonse
Annonse

HEi, jeg fant denne for deg, tigligere skrevet av ZoRac

 

<?php

 

/* Don't forget to CHMOD $file to 777 */

$file = "my_hits.txt";

 

 

// Obtain users IP address

$ipadd = getenv(REMOTE_ADDR);

$addip = "TRUE";

$hits = 0;

 

 

if (file_exists($file))

{

} else

{

echo "$file does not exist!";

exit;

}

 

 

// Open $file and search each line (IP address) for a match

$fp = fopen($file,"r");

while (!feof($fp))

{

$line = fgets($fp, 4096); //gets one line at a time

$line=trim($line);

if ($line != "")

{

$hits++;

}

// If IP is already logged

if ($line==$ipadd)

{

$addip = "FALSE";

}

}

fclose($fp);

 

// If the IP was not previously logged, append it to $file

if ($addip == "TRUE")

{

$fp = fopen($file,"a");

fwrite($fp, "\n");

fwrite($fp, $ipadd);

fclose($fp);

$hits++;

}

 

// Display hits

echo $hits;

?>

Endret av ISOS6
Lenke til kommentar

Her har du en liten counter funksjon

Ip loggen er ikke testa, og den blir veldig tung etter hvert

function time2sec($time,$type) { // converts days, hours and minuties to seconds; $time = the input value; $type = days/hour/min
	if($type == 'min') {
		return $time * 60;
	} elseif($type == 'hour') {
		return $time * 60 * 60;
	} elseif($type == 'days') {
		return $time * 24 * 60 * 60;
	} else {
		return 'ERROR: Unknow type';
	}
}

function counter($time_limit=false, $log_ip = false) { // $time_limit = seconds before a new entry; $log_ip = true/false | Log the IP or not (can slow the script if you get many unice visitors)
	if(!$time_limit) {
		$time_limit = 60; // Default timelimit
	}

	$request = htmlspecialchars($_SERVER['REQUEST_URI']); // Get requesten URL
	$ip = $_SERVER['REMOTE_ADDR']; // Get IP address
	$time = time(); // Get time
	$filename = 'counter.txt'; // Counter file
	$log_filename = 'ip.txt'; // Log file
	if(!is_file($filename) OR !is_writable($filename)) { // Check if the counter file exists and is writable
		return 'ERROR opening counter file';
	}
	if($log_ip) { // Log the ip?
		if(!is_file($log_filename) OR !is_writable($log_filename)) { // Check if the log file exists and is writable
			return 'ERROR opening log file';
		}
		$ip_limit = time2sec(1,'days'); // How many days the file is valid
		$log_file = file($log_filename); // Get log file, this can be heavy for the server, and can after many entres stop the script. If you know of a beter way, post it
		$log_file[0] = str_replace("\n",'',$log_file[0]); // Remove newline at the end of time
		if(($log_file[0] <= time()-$ip_limit) || !is_numeric($log_file[0])) {
			$fp = fopen($log_filename,'w'); // Open and empty log file
			fwrite($fp,time()."\n"); // Add new time header
			fclose($fp); // Close file
		}
		if(!in_array($ip."\n",$log_file)) { // Check if the ip is in the log file
			$fp = fopen($log_filename,'a'); // Open log file
			fwrite($fp,$ip."\n"); // Add ip to log file
			fclose($fp); // Close file
		}
	}

	$file = file_get_contents($filename); // Get the number of visitors

	$session = $_SESSION[$ip][$request]; // Get the cache session

	if(($time - $session) > $time_limit) { // Check if the user have been logged before within the last $time_limit seconds
		$_SESSION[$ip][$request] = $time; // Set new time
		$fp = fopen($filename,'w'); // Open the counter file and delete the content
		$file++; // Add one visitor
		fwrite($fp,$file); // Write a new, updated counter file
		fclose($fp); // Close file
	}
	return $file; // Return the number
}

Husk session_start(); øverst i alle filene du skal lagre

 

EDIT:

Oppdatert kode

Endret av AlecTBM
Lenke til kommentar

ISOS6: Sletter det scriptet loggen med jevne mellomrom? Mulig det er jeg som overser noe, men for meg ser det ut som at den bare logger IP til alle som er innom, og det har jeg jo et script som gjør fra før.

 

AlecTBM: Hvorfor blir log filen tung? Skal den ikke slette innholdet med jevne mellomrom eller noe slikt?

Lenke til kommentar
ISOS6: Sletter det scriptet loggen med jevne mellomrom? Mulig det er jeg som overser noe, men for meg ser det ut som at den bare logger IP til alle som er innom, og det har jeg jo et script som gjør fra før.

 

AlecTBM: Hvorfor blir log filen tung? Skal den ikke slette innholdet med jevne mellomrom eller noe slikt?

Hvis du vil slette logg filen så er jo vitsen med logging borte (etter min mening da)

Men kan legge til slik at loggen blir sletta etter x dager eller noe

 

Og logg filen blir tung etter ca 30 000 linjer xD

 

EDIT:

Da var det fiksa

function time2sec($time,$type) { // converts days, hours and minuties to seconds; $time = the input value; $type = days/hour/min
	if($type == 'min') {
		return $time * 60;
	} elseif($type == 'hour') {
		return $time * 60 * 60;
	} elseif($type == 'days') {
		return $time * 24 * 60 * 60;
	} else {
		return 'ERROR: Unknow type';
	}
}

function counter($time_limit=false, $log_ip = false) { // $time_limit = seconds before a new entry; $log_ip = true/false | Log the IP or not (can slow the script if you get many unice visitors)
	if(!$time_limit) {
		$time_limit = 60; // Default timelimit
	}

	$request = htmlspecialchars($_SERVER['REQUEST_URI']); // Get requesten URL
	$ip = $_SERVER['REMOTE_ADDR']; // Get IP address
	$time = time(); // Get time
	$filename = 'counter.txt'; // Counter file
	$log_filename = 'ip.txt'; // Log file
	if(!is_file($filename) OR !is_writable($filename)) { // Check if the counter file exists and is writable
		return 'ERROR opening counter file';
	}
	if($log_ip) { // Log the ip?
		if(!is_file($log_filename) OR !is_writable($log_filename)) { // Check if the log file exists and is writable
			return 'ERROR opening log file';
		}
		$ip_limit = time2sec(1,'days'); // How many days the file is valid
		$log_file = file($log_filename); // Get log file, this can be heavy for the server, and can after many entres stop the script. If you know of a beter way, post it
		$log_file[0] = str_replace("\n",'',$log_file[0]); // Remove newline at the end of time
		if(($log_file[0] <= time()-$ip_limit) || !is_numeric($log_file[0])) {
			$fp = fopen($log_filename,'w'); // Open and empty log file
			fwrite($fp,time()."\n"); // Add new time header
			fclose($fp); // Close file
		}
		if(!in_array($ip."\n",$log_file)) { // Check if the ip is in the log file
			$fp = fopen($log_filename,'a'); // Open log file
			fwrite($fp,$ip."\n"); // Add ip to log file
			fclose($fp); // Close file
		}
	}

	$file = file_get_contents($filename); // Get the number of visitors

	$session = $_SESSION[$ip][$request]; // Get the cache session

	if(($time - $session) > $time_limit) { // Check if the user have been logged before within the last $time_limit seconds
		$_SESSION[$ip][$request] = $time; // Set new time
		$fp = fopen($filename,'w'); // Open the counter file and delete the content
		$file++; // Add one visitor
		fwrite($fp,$file); // Write a new, updated counter file
		fclose($fp); // Close file
	}
	return $file; // Return the number
}

Endret av AlecTBM
Lenke til kommentar

Jeg vil at samme besøkende skal kunne telles flere ganger, men med en tidsbegrensning på feks en time, slik at det ikke legges til en besøkende hver gang man trykker f5. Da må vel nødvendigvis vedkommendes IP lagres, og så slettes etter en time? Jeg vet ikke om det er noen enklere måte å gjøre det på, derfor jeg spør her :)

Lenke til kommentar

jeg bruker ikke ip logging, men sessions

Ip logging er en mulighet jeg la til, og etter en viss tid (1 dag) så slettes ip loggen.

 

Det blir altså 2 filer, en som inneholder antall besøkene, og en annen som inneholder ip (valgfri)

 

Prøv scriptet så får du se

Lenke til kommentar

Hvis scriptet ditt teller et treff per person per session, så funker det for meg :)

 

Edit: Kommer verken noe tall eller en feilmelding der som jeg puttet scriptet. Lagde to .txt filer som het ip.txt og counter.txt og CHMODDA de til 777. Putta <?php session_start(); ?> øverst i index.php fila mi, og så i den sida som har telleren (den er inkludert i index.php) putta jeg hele scriptet. Prøvde også å ha scriptet i en egen fil og inkludere den derfra, men det ga samme resultat. Hva har jeg gjort feil?

Endret av g0mpen
Lenke til kommentar

Nå virker det ja :)

Så gjenstår det bare å se hvordan det vil reagere på andre besøkende.

 

Edit: Ser ut som at det virker som det skal. Jeg forstår det sånn at:

Hver person som besøker siden lagres som en ny besøkende i telleren dersom vedkommende ikke har vært inne før

ELLER

Dersom vedkommende har hatt siden oppe i en viss tid (første parameter)

Stemmer dette?

Endret av g0mpen
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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...