Avatar billede frostware Nybegynder
15. april 2004 - 20:53 Der er 61 kommentarer og
1 løsning

daglig besøgstæller!

Hej

Jeg har en besøgstæller som registrerer antal besøgende i alt. Tælleren er bestemt ud fra dette script:

<?php
$ip = getenv("REMOTE_ADDR");
$fil = ".\count\count.txt";
$f = file($fil);
$antal = count($f);
$yest = time() - 1800;
$o = "0";
$xidag = "f";
$idag = time();
$idag2 = date("Y F d, H:i");
  while ($antal > $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);
  }
 
?>

Nu vil jeg gerne have en tæller som registrerer brugere pr. dag. Det som jeg så vil er at lave en ny fil som hedder count1.txt, og ellers følge scriptet ovenover. Men på en eller anden måde skal scriptet nulstille count1.txt én gang i døgnet!
Hvordan gør man det?????
Avatar billede coderdk Praktikant
15. april 2004 - 21:52 #1
Hvad med noget i stil med:

<?php

  function getCountToday()
  {
    $cnt = implode('',file('count1.txt'));
    if ($data = @unserialize($cnt))
    {
      if (isset($data[date('Ymd')]))
      {
        $data[date('Ymd')]:
      }
      else
      {
        unset($data);
        $data[date('Ymd')] = 0;
      }
    }
    else
    {
      $data[date('Ymd')] = 0;
    }
    return $data;
  }

  function addCount(&$data)
  {
    $data[date('Ymd')]++;
  }

  function writeCount(&$data)
  {
    $fp = fopen('count1.txt','w');
    flock($fp,LOCK_EX);
    fwrite($fp,serialize($data));
    flock($fp,LOCK_UN);
    fclose($fp);
  }

  $data = getCountToday();
  echo "Besøgende i dag: " . $data[date('Ymd')];
  addCount($data); // Tilføj én
  writeCount($data); // Gem

?>
Avatar billede dennismp Nybegynder
15. april 2004 - 21:55 #2
Heh du roder stadig med den tekstfil :)

Jeg ville bruge fileatime() til at finde ud af hvornår filen sidst er ændret - og hvis det er "igår" iforhold til nu, så vil jeg nulstille filen.

alså i stil med:

if( date("z",fileatime($fil) ) < date("z") ) {
  nustil fil.
}
Avatar billede frostware Nybegynder
15. april 2004 - 22:13 #3
Ja jeg roder stadigvææk med den fil ;-)

Hvor vil du indsætte:

if( date("z",fileatime($fil) ) < date("z") ) {
  nustil fil.
}

Er det i min kode eller i koden fra coderdk?
Avatar billede frostware Nybegynder
15. april 2004 - 22:18 #4
coderdk:

Jeg få en script fejl i linie 10! Altså:

$data[date('Ymd')]:
Avatar billede dennismp Nybegynder
15. april 2004 - 22:22 #5
Hvis du bare vil have overskrevet filen hver dag, så kan det gøre sådan her:

<?php
$ip = getenv("REMOTE_ADDR");
updateCount($ip,".\\count\\count.txt");  // Husk at bruge \\ istedet for \
updateCount($ip, ".\\count\\count1.txt", true);

function updateCount($ip,$fil,$daily=false) {
  if( $daily && date("z",fileatime($fil)) < date("z"))
    $f = array(); // nulstil
  }
  else {
    $f = file($fil);
  }
  $antal = count($f);
  $yest = time() - 1800;
  $o = 0;
  $xidag = "f";
  $idag = time();
  $idag2 = date("Y F d, H:i");
  while ($antal > $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);
  }
} 
?>
Avatar billede dennismp Nybegynder
15. april 2004 - 22:23 #6
$data[date('Ymd')]:
det skal være et semi-kolon, ikke kolon :)
Avatar billede frostware Nybegynder
15. april 2004 - 22:33 #7
jeg får en fejl i linie 10! altså:

else {
Avatar billede frostware Nybegynder
15. april 2004 - 22:34 #8
en anden ting, kan du forklare hvorfor der referes til både count1.txt og count.txt
Avatar billede dennismp Nybegynder
15. april 2004 - 22:39 #9
if( $daily && date("z",fileatime($fil)) < date("z"))
skal rettes til
  if( $daily && date("z",fileatime($fil) < date("z"))

Jeg troede du ville have en count.txt (all time) og count1.txt (daglig) - jeg har måske misforstået dig.
Avatar billede frostware Nybegynder
15. april 2004 - 22:44 #10
nej det er rigtigt nok, behøver jeg så kun ét script, og så skriver den i begge filer?
Avatar billede frostware Nybegynder
15. april 2004 - 22:49 #11
fejlen er nu røget videre til:

    $f = array(); // nulstil
Avatar billede dennismp Nybegynder
15. april 2004 - 22:51 #12
Jeg definere en funktion (linjen der starter med function).. og kalder den to gang med hver sin fil. Så genbruger jeg sådan set bare din kode (du kan sikkert genkende den) ..

function updateCount($ip,$fil,$daily=false) {
  if( $daily && date("z",fileatime($fil)) < date("z"))  {
    $f = array(); // nulstil
  }
  else {
    $f = file($fil);
  }
  $antal = count($f);
  $yest = time() - 1800;
  $o = 0;
  $xidag = "f";
  $idag = time();
  $idag2 = date("Y F d, H:i");
  while ($antal > $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);
  }
}
Avatar billede frostware Nybegynder
15. april 2004 - 23:01 #13
OK...nu er fejlen rettet. Det jeg har gjort er at kopiere hele koden ind i en hjemmeside. Men når man går ind på hjemmesiden, og bagefter kigger i log filerne er der ikke blevet skrevet noget. Er det mig som gør noget forkert??
Avatar billede dennismp Nybegynder
15. april 2004 - 23:04 #14
du har disse linjer med  på din side?

<?php
$ip = getenv("REMOTE_ADDR");
updateCount($ip,".\\count\\count.txt");  // Husk at bruge \\ istedet for \
updateCount($ip, ".\\count\\count1.txt", true);
Avatar billede frostware Nybegynder
15. april 2004 - 23:06 #15
ja...efterfulgt af:

function updateCount($ip,$fil,$daily=false) {
  if( $daily && date("z",fileatime($fil)) < date("z"))  {
    $f = array(); // nulstil
  }
  else {
    $f = file($fil);
  }
  $antal = count($f);
  $yest = time() - 1800;
  $o = 0;
  $xidag = "f";
  $idag = time();
  $idag2 = date("Y F d, H:i");
  while ($antal > $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);
  }
}
Avatar billede frostware Nybegynder
15. april 2004 - 23:12 #16
hvis jeg ligger count filerne i samme mappe som php filen, og fjerne // osv. Så registrere den!
Avatar billede frostware Nybegynder
15. april 2004 - 23:12 #17
ups.... \\ og ikke //
Avatar billede frostware Nybegynder
15. april 2004 - 23:15 #18
så tror jeg det virker....der skal stå .//count//count.txt og ikke
                                      .\\count\\count.txt
Avatar billede dennismp Nybegynder
15. april 2004 - 23:21 #19
hvis du skal lave backslashes så er det "\\", ellers bare / (Selvom // ikke gør noget)..

Jeg har en lille sidebemærkning til dit script. Da den henter hele filen ind, så kan det ske at hvis to hits kommer samtidigt (eller meget tæt på) at din fil(er) bliver smadret (den ene bruger skriver i filen mens den anden læser, og så får denne bruger kun halv data - som han så derefter skriver ned i filen.. nu har du en ødelagt fil) ..

Det er et problem du nok ikke ser med det samme, men det kan ske og det vil også, du skal bare være "uheldig nok".

Man kan løse det vha databaser eller ved at bruge flock().. Det er ikke særligt svært - er det noget jeg skal tilføje, eller vil du prøve selv?
Avatar billede frostware Nybegynder
15. april 2004 - 23:23 #20
du må gerne tilføje det...jeg er ikke meget for databaser (msql->der står jeg af) men hvis det kan løses med en funktionen i scriptet vil jeg gerne høre om det. Jeg lukker for i dag, så bare giv dig god tid
Avatar billede frostware Nybegynder
15. april 2004 - 23:25 #21
jeg mangler også 2 scripts som sætter henholdsvis i dag og i alt
Avatar billede frostware Nybegynder
16. april 2004 - 08:54 #22
Nu har jeg lige prøvet her til morgen. Og der er ingen af count filerne som bliver slettet!
Avatar billede dennismp Nybegynder
16. april 2004 - 15:43 #23
Nej men det overskriver med ny data, det er vel ligeså godt?
Avatar billede frostware Nybegynder
16. april 2004 - 18:11 #24
aha...det har jeg ikke taget højde for. Hvordan sætter jeg tallene i et php script
Avatar billede dennismp Nybegynder
16. april 2004 - 18:16 #25
?

Skal du have talt antal linjer i filerne?
Avatar billede frostware Nybegynder
16. april 2004 - 18:56 #26
nej...hvad skal jeg skrive der på siden hvor jeg vil have antallet af brugere i dag og antallet af brugere i alt til at stå?
Avatar billede dennismp Nybegynder
16. april 2004 - 20:27 #27
Nu returnerer funktionen antal besøgende.

<?php
$ip = getenv("REMOTE_ADDR");
$all = updateCount($ip,"./count/count.txt");
$daily = updateCount($ip, "./count/count1.txt", true);

print "visitors: $all today: $daily<br>";

function updateCount($ip,$fil,$daily=false) {
  if( $daily && date("z",fileatime($fil)) < date("z"))  {
    $f = array(); // nulstil
  }
  else {
    $f = @file($fil);
  }
  $antal = count($f);
  $yest = time() - 1800;
  $o = 0;
  $xidag = "f";
  $idag = time();
  $idag2 = date("Y F d, H:i");
  while ($antal > $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);
  }
  return count($f);
}
?>

Du kan ændre
print "visitors: $all today: $daily<br>";

til hvad du har brug for
Avatar billede frostware Nybegynder
16. april 2004 - 21:32 #28
Jep det virker. Ved godt at jeg er krævende, men jeg hvis jeg nu vil bare vil indsætte tallene uden tekst, udenfor scriptet men stadigvæk på samme side. Hvad skal man så kalde??

f.eks. noget i stil med:
<?php echo $daily; ?>
Avatar billede dennismp Nybegynder
16. april 2004 - 23:33 #29
Disse kald
$all = updateCount($ip,"./count/count.txt");
$daily = updateCount($ip, "./count/count1.txt", true);

giver dig to variabler du kan bruge. Så du kan bare skrive echo $all; hvis du kun ønsker et tal
Avatar billede frostware Nybegynder
17. april 2004 - 08:06 #30
så virker det næsten. Tallet for daglig besøgende er nøjagtig magen til tallet for ialt og det bliver ikke nulstillet når datoen skifter (altså kl. 24)!
Avatar billede frostware Nybegynder
17. april 2004 - 08:26 #31
hvis det er til nogen hjælp, bliver der skrevet magen til denne i count filen:

80.*.*.* 1082181669, 2004 April 17, 08:01
Avatar billede dennismp Nybegynder
17. april 2004 - 13:45 #32
og du kalder updateCount() to gange, right?

er filerne helt ens?
Avatar billede frostware Nybegynder
17. april 2004 - 13:48 #33
ja den bliver kaldt to gange, én med count.txt og én med count1.txt. Filerne er nøjagtig ens.
Avatar billede frostware Nybegynder
18. april 2004 - 19:31 #34
nogen idéer????
Avatar billede dennismp Nybegynder
18. april 2004 - 19:37 #35
Ah, glemte dig - beklager :)

Prøv at lave nogle hits, så der er data i begge filer..

så prøv derefter at bruge denne kode (den nulstiller altid).. Prøv
et lave et hit til og se om de stadig er ens.

<?php
$ip = getenv("REMOTE_ADDR");
updateCount($ip,".\\count\\count.txt");  // Husk at bruge \\ istedet for \
updateCount($ip, ".\\count\\count1.txt", true);

function updateCount($ip,$fil,$daily=false) {
  ///if( $daily && date("z",fileatime($fil)) < date("z"))
  if( true )
    $f = array(); // nulstil
  }
  else {
    $f = file($fil);
  }
  $antal = count($f);
  $yest = time() - 1800;
  $o = 0;
  $xidag = "f";
  $idag = time();
  $idag2 = date("Y F d, H:i");
  while ($antal > $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);
  }
} 
?>
Avatar billede frostware Nybegynder
18. april 2004 - 19:46 #36
fejl i linie 11, der hvor der står else {
Avatar billede dennismp Nybegynder
18. april 2004 - 19:51 #37
erstat:
if( true )
med
if( true ) {
Avatar billede frostware Nybegynder
18. april 2004 - 20:13 #38
begge filer er stadig ens
Avatar billede frostware Nybegynder
18. april 2004 - 20:23 #39
jeg har indsat nøjagtig det script du har skrevet, og har lavet de to filer med data. Og når jeg opdatere siden kommer der nye hits ind i filerne, men de er stadigvæk ens.
Avatar billede dennismp Nybegynder
18. april 2004 - 20:52 #40
Jeg skal lige se noget film - bagefter installere jeg scriptet igen og ser om jeg kan genskabe fejlen
Avatar billede frostware Nybegynder
20. april 2004 - 22:04 #41
det var da en lang film ;-)....hvis du har tid, lyst gider du så kigge på det i den nærmeste fremtid?
Avatar billede dennismp Nybegynder
20. april 2004 - 22:12 #42
Crap, glemte det igen :-) Kigger på det nu
Avatar billede dennismp Nybegynder
20. april 2004 - 22:19 #43
prøv dette. Du skal lige tjekke filnavnene, da jeg bruger linux.

<?php
$ip = getenv("REMOTE_ADDR");
print "Ialt: " . updateCount($ip,"/tmp/count.txt");  // Husk at bruge \\ istedet for \
print "<br>Idag: " . updateCount($ip, "/tmp/count1.txt", true);

function updateCount($ip,$fil,$daily=false) {
  $f = file($fil);
  $antal = count($f);
  $yest = time() - 1800;
  $o = 0;
  $xidag = "f";
  $idag = time();
  $idag2 = date("Y F d, H:i");
  while ($antal > $o) {
    $streg = explode(" ", $f[$o]);
      if ($ip == $streg[0]) {
      $x = "t";
        if ($streg[1] > $yest) {
          $xidag = "t";
        }
      }
    $o++;
  }

  if ($xidag == "f") {
    if( $daily && date("z",fileatime($fil)) < date("z"))
        $logg = fopen("$fil", "w");
    else
        $logg = fopen("$fil", "a");
    fputs ($logg, "$ip $idag, $idag2\n");

    fclose ($logg);
    $antal++;
  }

  return $antal;
}
?>
Avatar billede frostware Nybegynder
21. april 2004 - 07:34 #44
Det er stadigvæk det samme. Filerne er stadigvæk ens og der står det samme på tællerne. F.eks.

Ialt: 25
Idag: 25

I log filen er alle hitsene langt fra, fra i dag.
Avatar billede dennismp Nybegynder
21. april 2004 - 11:07 #45
Hvis du har kørt den gamle version idag, så vil den ikke resette for idag. Men for at teste kan du godt tvinge den til at resette;

erstat
  if( $daily && date("z",fileatime($fil)) < date("z"))
        $logg = fopen("$fil", "w");
    else
        $logg = fopen("$fil", "a");
med
  //if( $daily && date("z",fileatime($fil)) < date("z")) {
  if( $daily && true ) {
        $logg = fopen("$fil", "w");
        $antal = 0;
    }
    else {
        $logg = fopen("$fil", "a");
    }

så vil det næste hit resette den ved hver hit. Du skal bare fjern if( $daily && true ) igen og bruge den øverste (udkommenteret if()) hvis du vil ha' den til at virke normalt
Avatar billede frostware Nybegynder
21. april 2004 - 12:03 #46
så nu er den resat...jeg forstår ikke helt hvad det er jeg skal ændre tilbage igen for at det virker normalt
Avatar billede dennismp Nybegynder
21. april 2004 - 12:11 #47
find disse
  //if( $daily && date("z",fileatime($fil)) < date("z")) {
  if( $daily && true ) {
og erstat dem med
  if( $daily && date("z",fileatime($fil)) < date("z")) {
  //if( $daily && true ) {


.. så skal du vel bare vente til midnat for at se om det virker :-)
Avatar billede frostware Nybegynder
22. april 2004 - 07:28 #48
den har ikke nulstillet.
Avatar billede dennismp Nybegynder
22. april 2004 - 17:36 #49
prøv at erstatte fileatime med filemtime

hvilken platform arbejder du på?
Avatar billede frostware Nybegynder
22. april 2004 - 18:55 #50
jeg har et web hotel hos web10, og det er unix.
Avatar billede dennismp Nybegynder
22. april 2004 - 19:03 #51
Ok, lad os bruge tiden fornuftig før midnat :-) Nu skal det komme til at virke.

lav et sript.. fx. tidstest.php
<?php
$file = 'count.txt';
print "fileatime: " . date("H:i:s", fileatime($file)) . "<br>";
print "filemtime: " . date("H:i:s", filemtime($file)) . "<br>";
print "filectime: " . date("H:i:s", filectime($file)) . "<br>";
?>

Kør det, paste resultatet her.

Brug counteren (så der bliver skrevet i filerne), og kør scriptet igen.. Paste outputtet her.. Forhåbenlig er filemtime() ændret.
Avatar billede frostware Nybegynder
22. april 2004 - 19:32 #52
fileatime: 19:29:27
filemtime: 19:29:41
filectime: 19:29:41

det står på tidtest.php
Avatar billede frostware Nybegynder
22. april 2004 - 19:32 #53
hvad var det andet jeg skulle
Avatar billede dennismp Nybegynder
22. april 2004 - 19:38 #54
Så skal du kører det script (som jeg ikke kan få til at resette ordenligt) så den skriver i filerne. Det kan være du lige skal sikre at der rent faktisk bliver ændret i filerne.

Du kan også bare istedet åbne dem i en editor og gemme dem (måske nemmere)

og så køre tidstest.php igen.
Avatar billede frostware Nybegynder
22. april 2004 - 19:45 #55
På siden:
fileatime: 04:27:51
filemtime: 19:45:14
filectime: 19:45:14

Efter scriptet er kørt:
fileatime: 04:27:51
filemtime: 19:45:31
filectime: 19:45:31
Avatar billede dennismp Nybegynder
22. april 2004 - 19:47 #56
Goodie. Jeg slår mig selv, hvis det ikke virker inat :-)
Avatar billede frostware Nybegynder
22. april 2004 - 19:49 #57
kan du ikke lige skrive det script som du mener bør stå på min side....bare så det er det rigtige
Avatar billede dennismp Nybegynder
22. april 2004 - 19:54 #58
<?php
$ip = getenv("REMOTE_ADDR");
print "Ialt: " . updateCount($ip,"/tmp/count.txt");  // Husk at bruge \\ istedet for \
print "<br>Idag: " . updateCount($ip, "/tmp/count1.txt", true);

function updateCount($ip,$fil,$daily=false) {
  $f = file($fil);
  $antal = count($f);
  $yest = time() - 1800;
  $o = 0;
  $xidag = "f";
  $idag = time();
  $idag2 = date("Y F d, H:i");
  while ($antal > $o) {
    $streg = explode(" ", $f[$o]);
      if ($ip == $streg[0]) {
      $x = "t";
        if ($streg[1] > $yest) {
          $xidag = "t";
        }
      }
    $o++;
  }

  if ($xidag == "f") {
    if( $daily && date("z",filemtime($fil)) < date("z")) {
        $logg = fopen("$fil", "w");
        $antal = 0;
    }
    else {
        $logg = fopen("$fil", "a");
    }

    fputs ($logg, "$ip $idag, $idag2\n");

    fclose ($logg);
    $antal++;
  }

  return $antal;
}
?>
Avatar billede dennismp Nybegynder
22. april 2004 - 19:55 #59
Nåja, husk at ændre filnavnene
Avatar billede frostware Nybegynder
22. april 2004 - 20:00 #60
så må vi bare vente og se hvad der sker!
Avatar billede frostware Nybegynder
24. april 2004 - 09:01 #61
Så virker det!!! Tror du også det virker med de her par ændringer?

<?php
$ip = getenv("REMOTE_ADDR");
$all = updateCount($ip,"/tmp/count.txt");  // Husk at bruge \\ istedet for \
$day = updateCount($ip, "/tmp/count1.txt", true);

function updateCount($ip,$fil,$daily=false) {
  $f = file($fil);
  $antal = count($f);
  $yest = time() - 1800;
  $o = 0;
  $xidag = "f";
  $idag = time();
  $idag2 = date("Y F d, H:i");
  while ($antal > $o) {
    $streg = explode(" ", $f[$o]);
      if ($ip == $streg[0]) {
      $x = "t";
        if ($streg[1] > $yest) {
          $xidag = "t";
        }
      }
    $o++;
  }

  if ($xidag == "f") {
    if( $daily && date("z",filemtime($fil)) < date("z")) {
        $logg = fopen("$fil", "w");
        $antal = 0;
    }
    else {
        $logg = fopen("$fil", "a");
    }

    fputs ($logg, "$ip $idag, $idag2\n");

    fclose ($logg);
    $antal++;
  }

  return $antal;
}
?>

<?php echo $ialt ?>
<?php echo $day ?>
Avatar billede dennismp Nybegynder
24. april 2004 - 12:05 #62
Hvis det kun er de to echo's du har fjernet, så burde det virke :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester