Gå til innhold

Hjelp med counter script


Anbefalte innlegg

Jeg har ett counterscript som fungerer veldig bra, men det er en utfordring.

 

Den teller hver gang du åpner siden.

 

Er det på en enkel måte mulig å legge til noe som gjør at den ikke teller samme IP mer enn 1 gang pr. dag.

 

Scripter ser sånn ut:

<?php

$id = htmlentities($_GET['id']);

$error = "No page id mentioned to count!";

if ($id =="")
{
echo "document.write('$error');";
}
else
{

/////////////////////////////// Code for counting hits ////////////////////////////

//Name of hit count file
$count_file = "counts/" . $id . ".txt";

if (! @$file = fopen($count_file,"r+"))
{
$count="1";
}
else {
$count = @fread($file, filesize($count_file)) or $count=0;
fclose($file);
$count++;
}
$file = fopen($count_file,"w+") or die("Error to write logs!");
fputs($file, $count);
fclose($file);
echo "document.write('$count');";
//==========================================================


/////////////////////////// Code for creating logs ////////////////////////////////////


//Name of log file
$log_file = "logs/" . $id . ".txt";


// Sets different variable for getting different informations of visitor of the page
$time = date("l, j F Y [h:i a]"); 
$ip = $_SERVER['REMOTE_ADDR']; 
$browser = $_SERVER['HTTP_USER_AGENT'];



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

fputs($fp, "<p>Time: $time<br>IP: $ip<br>Browser: $browser</p>");

fclose($fp); 

//==========================================================

exit(); 
}


?>

Lenke til kommentar
Videoannonse
Annonse

Du bør vurdere å bruke database da det kan gjøres mye lettere, men kan gi deg et lite hint hvordan du kan få det til med systemet du har.

 

få frem innholdet i fila di (sjekk file_get_contents), så kan du søke gjennom ip addressen. Nøkkelsetning for deg er da:

 

preg_match('#IP: (.*?)\<br\>#', $filaDi)

 

Kjør en if med denne betingelsen. Den vil ga da TRUE hvis ipen eksisterer fra før av, eller FALSE hvis den ikke gjør det. Resten bør være easy saker..

Endret av Zic0
Lenke til kommentar
Du bør vurdere å bruke database da det kan gjøres mye lettere, men kan gi deg et lite hint hvordan du kan få det til med systemet du har.

 

få frem innholdet i fila di (sjekk file_get_contents), så kan du søke gjennom ip addressen. Nøkkelsetning for deg er da:

 

preg_match('#IP: (.*?)\<br\>#', $filaDi)

 

Kjør en if på denne betingelsen. Den vil ga da TRUE hvis ipen eksisterer fra før av, eller FALSE hvis den ikke gjør det. Resten bør være easy saker..

 

Takker for svar, men jeg er desverre like grønn da jeg ikke er noen sjefsprogramerer.

 

Jeg har ikke laget dette scriptet selv, men funnet det på nett.

 

Jeg trenger newbie-hjelp som vil si; jeg må vite eksakt hva som må skrives hvor.

 

Mvh

Vidar

Lenke til kommentar

bare lag en cookie som varer i 24 timer som sier om hiten skal telle eller ikke.

if (!isset($_COOKIE["CounterCookie"])) {
  setcookie("CounterCookie", true, time()+ (3600*24));

  // increase counter here.
}

 

Takker, men hvor skal jeg sette inn dette for at den skal fungere?

Limte den i i samme fila som koden over, men det ga ingen resultater.

 

Har jeg gjordt noe feil?

 

Mvh

Vidar

Lenke til kommentar
  • 2 uker senere...
Det eneste du trenger å gjøre er å kopiere hele koden din og lime den inn der kami skrev "// increase counter here".

 

Dette fungerer ikke. Ingeting vises.

 

<?php
if (!isset($_COOKIE["CounterCookie"])) {
  setcookie("CounterCookie", true, time()+ (3600*24));

  // increase counter here.

$id = htmlentities($_GET['id']);

$error = "No page id mentioned to count!";

if ($id =="")
{
echo "document.write('$error');";
}
else
{

/////////////////////////////// Code for counting hits ////////////////////////////

//Name of hit count file
$count_file = "counts/" . $id . ".txt";

if (! @$file = fopen($count_file,"r+"))
{
$count="1";
}
else {
$count = @fread($file, filesize($count_file)) or $count=0;
fclose($file);
$count++;
}
$file = fopen($count_file,"w+") or die("Error to write logs!");
fputs($file, $count);
fclose($file);
echo "document.write('$count');";
//==========================================================


/////////////////////////// Code for creating logs ////////////////////////////////////


//Name of log file
$log_file = "logs/" . $id . ".txt";


// Sets different variable for getting different informations of visitor of the page
$time = date("l, j F Y [h:i a]"); 
$ip = $_SERVER['REMOTE_ADDR']; 
$browser = $_SERVER['HTTP_USER_AGENT'];



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

fputs($fp, "<p>Time: $time<br>IP: $ip<br>Browser: $browser</p>");

fclose($fp); 

//==========================================================

exit(); 
}

}
?>

 

Flere forslag??

Endret av vimael
Lenke til kommentar

Du må lagre en fil som count.txt som counterinfoen skal inn i. og for å hente frem tellerern må du ha med "?id=count" i url'en. Så hvis fila heter count.php blir url'en http://www.dinside.no/count.php?id=count

 

og denne linja her

if ($id =="")

kan du bytte ut med

if (!isset($id))

 

Og forresten, så må vel den count.txt chmod'es til 777 hvis jeg ikke husker galt(?)

Endret av YaNkEs
Lenke til kommentar
Samme utfall med denne endringen.

 

Fungerte skriptet før du begynte å endre på det?

 

Med cookie løsningen vil den bare telle den første gangen du kjører skriptet uavhengig av hvilken side du åpner (index.php?id=home eller index.php?id=about) per browser.

 

Mens du tester kan det være fordelaktig å justere ned tiden til noen sekunder eller minutter istedet for 24 timer:

 

setcookie("CounterCookie", true, time()+10); // for at den skal gjelde i 10 sekunder

 

Slik skriptet er nå vil det ikke komme noe output fra det annet enn første gangen du kjører skriptet i browseren. Legg til en else på slutten:

 

else {
 echo "document.write('Denne IP-adressen er allerede talt');"; // eller noe
}

 

En banal løsning for å telle treff på alle sidene og ikke bare den første vil være og ha en cookie for hver id (noe som fort blir veldig sølete)

 

$id = htmlentities($_GET['id']);
$cookie = "CounterCookie${id}"; // en småkake for hver side
if(!isset($_COOKIE[$cookie])) {
  setcookie($cookie, true, time()+10);

  // det som skal skje når siden skal telles med
  // øke telleren og loggføre

} else {

  // det som skal skje når siden allerede er talt
  // for eksempel loggføring?
}

 

Hvis du ikke er avhengig av å bruke JavaScript på siden så vil det bli mindre forvirrende å fjerne document.write kallet, som er JavaScript sin echo/print.

 

echo "document.write('<p>hello world</p>');"; // Skriver ut gjennom JavaScript
echo "<p>hello world</p>"; // Skriver ut direkte

Endret av footnote
Lenke til kommentar

Nydelig.. ;)

 

Nå er jeg nærme der jeg vil være. Dette funket jo.

 

 

Men, en lite utfordring til.

-ID er i form av navnet på sidene, og scriptet takler bare de sidene hvor ID består av ett sammenhengende ord.

-Der hvor det blir to ord teller den hver gang fortsatt.

 

Og en ting til..

-Hvordan kan jeg få besøksantallet til å stå fremme hele tiden selv om det ikke teller?

-Nå kommer det frem når det teller, og forsvinner hvis jeg oppdaterer siden før tiden har gått ut.

 

 

Takk på forhånd..

Lenke til kommentar
-ID er i form av navnet på sidene, og scriptet takler bare de sidene hvor ID består av ett sammenhengende ord.

-Der hvor det blir to ord teller den hver gang fortsatt.

 

Cookies kan ikke ha mellomrom i navnet, skal du fortsette å bruke cookies må du gjøre noe med $id før du lager cookienavnet.

 

$pieces = explode(" ", $id);
$id = implode("_", $pieces);

 

f.eks. vil sørge for at $id = "Hello World" blir "Hello_World".

 

 

-Hvordan kan jeg få besøksantallet til å stå fremme hele tiden selv om det ikke teller?

-Nå kommer det frem når det teller, og forsvinner hvis jeg oppdaterer siden før tiden har gått ut.

 

Da bruker du $id for å lese rett fil, slik at du kan vise antall treff selv om du ikke oppdaterer den.

 

Du får prøve deg litt frem!

 

 

Husk at man kan jukse med denne metoden på flere måter. Cookien deles ikke mellom browsere, så du kan få ett treff per browser på hver av maskinene du har på hjemmenettet. I tillegg kan du bruke wget eller andre metoder for å hente siden å øke telleren for hvert treff. Du kan vel også bare slette cookien i browseren din (slett cache f.eks.)

Lenke til kommentar
Cookies kan ikke ha mellomrom i navnet, skal du fortsette å bruke cookies må du gjøre noe med $id før du lager cookienavnet.

 

$pieces = explode(" ", $id);
$id = implode("_", $pieces);

 

f.eks. vil sørge for at $id = "Hello World" blir "Hello_World".

 

Hvor i scriptet må jeg legge inn denne koden for at det skal fungere..

Prøvde å legge den på toppen, men da hadde den liten funksjon.

 

-Hvordan kan jeg få besøksantallet til å stå fremme hele tiden selv om det ikke teller?

-Nå kommer det frem når det teller, og forsvinner hvis jeg oppdaterer siden før tiden har gått ut.

 

Da bruker du $id for å lese rett fil, slik at du kan vise antall treff selv om du ikke oppdaterer den.

 

Du får prøve deg litt frem!

 

Noen andre som har inspill her? Jeg kan ikke prøve meg frem for så flink er jeg ikke.

 

Mvh

Vidar

Lenke til kommentar
hmmm. Er ikke akkurat snakk om å være så flink heller da...

 

hva om du prøver å sette det inn rett etter

 

$id = htmlentities($_GET['id']);

 

for eksempel? Du kan ikke gjøre noe med en variabel før den har fått en verdi.

 

Takker!!

Da virket det som bare det.

 

 

Da er bare min(eller deres :)) siste utfordring å få antallet til å vises uansett om man går inn på siden igjen innenfor samme tidsrom.

 

Mvh

Vidar

Lenke til kommentar
hmmm. Er ikke akkurat snakk om å være så flink heller da...

 

hva om du prøver å sette det inn rett etter

 

$id = htmlentities($_GET['id']);

 

for eksempel? Du kan ikke gjøre noe med en variabel før den har fått en verdi.

 

Takker!!

Da virket det som bare det.

 

 

Da er bare min(eller deres :)) siste utfordring å få antallet til å vises uansett om man går inn på siden igjen innenfor samme tidsrom.

 

Mvh

Vidar

 

 

bump

Lenke til kommentar
  • 4 uker senere...

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