g0mpen Skrevet 24. april 2009 Del Skrevet 24. april 2009 (endret) 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 5. mai 2009 av g0mpen Lenke til kommentar
ISOS6 Skrevet 24. april 2009 Del Skrevet 24. april 2009 (endret) 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 24. april 2009 av ISOS6 Lenke til kommentar
AlecTBM Skrevet 25. april 2009 Del Skrevet 25. april 2009 (endret) 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 1. mai 2009 av AlecTBM Lenke til kommentar
g0mpen Skrevet 26. april 2009 Forfatter Del Skrevet 26. april 2009 Takker for svar, skal se nærmere på de i morgen og teste ut Lenke til kommentar
g0mpen Skrevet 30. april 2009 Forfatter Del Skrevet 30. april 2009 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
AlecTBM Skrevet 1. mai 2009 Del Skrevet 1. mai 2009 (endret) 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 1. mai 2009 av AlecTBM Lenke til kommentar
g0mpen Skrevet 4. mai 2009 Forfatter Del Skrevet 4. mai 2009 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
AlecTBM Skrevet 5. mai 2009 Del Skrevet 5. mai 2009 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
[kami] Skrevet 5. mai 2009 Del Skrevet 5. mai 2009 hvor sikkert vil du ha det? Hvorfor ikke bare sende en cookie med 1 times levetid som sier om du skal gi siden en ny "hit" eller ikke? Lenke til kommentar
AlecTBM Skrevet 5. mai 2009 Del Skrevet 5. mai 2009 er vell egentlig det scriptet mitt gjør, bare med sessions og tid Lenke til kommentar
g0mpen Skrevet 5. mai 2009 Forfatter Del Skrevet 5. mai 2009 (endret) 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 5. mai 2009 av g0mpen Lenke til kommentar
AlecTBM Skrevet 5. mai 2009 Del Skrevet 5. mai 2009 du må kalle funksjonen echo counter() Ser nå at samme person blir telt på nytt hvert 60'ene sekund du kan endre tia med det første parameteret Lenke til kommentar
g0mpen Skrevet 5. mai 2009 Forfatter Del Skrevet 5. mai 2009 (endret) 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 5. mai 2009 av g0mpen Lenke til kommentar
AlecTBM Skrevet 5. mai 2009 Del Skrevet 5. mai 2009 ikke hatt siden oppe, men hvis brukeren oppdaterer siden etter en viss tid (default 60 sekunder) Lenke til kommentar
g0mpen Skrevet 5. mai 2009 Forfatter Del Skrevet 5. mai 2009 Supert! Tusen takk for all hjelp, det fungerer akkurat slik som jeg vil nå. Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå