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?????
Annonceindlæg fra Computerworld
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 ?>
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. }
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?
15. april 2004 - 22:18
#4
coderdk: Jeg få en script fejl i linie 10! Altså: $data[date('Ymd')]:
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); } } ?>
15. april 2004 - 22:23
#6
$data[date('Ymd')]: det skal være et semi-kolon, ikke kolon :)
15. april 2004 - 22:33
#7
jeg får en fejl i linie 10! altså: else {
15. april 2004 - 22:34
#8
en anden ting, kan du forklare hvorfor der referes til både count1.txt og count.txt
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.
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?
15. april 2004 - 22:49
#11
fejlen er nu røget videre til: $f = array(); // nulstil
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); } }
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??
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);
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); } }
15. april 2004 - 23:12
#16
hvis jeg ligger count filerne i samme mappe som php filen, og fjerne // osv. Så registrere den!
15. april 2004 - 23:12
#17
ups.... \\ og ikke //
15. april 2004 - 23:15
#18
så tror jeg det virker....der skal stå .//count//count.txt og ikke .\\count\\count.txt
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?
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
15. april 2004 - 23:25
#21
jeg mangler også 2 scripts som sætter henholdsvis i dag og i alt
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!
16. april 2004 - 15:43
#23
Nej men det overskriver med ny data, det er vel ligeså godt?
16. april 2004 - 18:11
#24
aha...det har jeg ikke taget højde for. Hvordan sætter jeg tallene i et php script
16. april 2004 - 18:16
#25
? Skal du have talt antal linjer i filerne?
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å?
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
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; ?>
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
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)!
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
17. april 2004 - 13:45
#32
og du kalder updateCount() to gange, right? er filerne helt ens?
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.
18. april 2004 - 19:31
#34
nogen idéer????
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); } } ?>
18. april 2004 - 19:46
#36
fejl i linie 11, der hvor der står else {
18. april 2004 - 19:51
#37
erstat: if( true ) med if( true ) {
18. april 2004 - 20:13
#38
begge filer er stadig ens
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.
18. april 2004 - 20:52
#40
Jeg skal lige se noget film - bagefter installere jeg scriptet igen og ser om jeg kan genskabe fejlen
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?
20. april 2004 - 22:12
#42
Crap, glemte det igen :-) Kigger på det nu
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; } ?>
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.
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
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
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 :-)
22. april 2004 - 07:28
#48
den har ikke nulstillet.
22. april 2004 - 17:36
#49
prøv at erstatte fileatime med filemtime hvilken platform arbejder du på?
22. april 2004 - 18:55
#50
jeg har et web hotel hos web10, og det er unix.
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.
22. april 2004 - 19:32
#52
fileatime: 19:29:27 filemtime: 19:29:41 filectime: 19:29:41 det står på tidtest.php
22. april 2004 - 19:32
#53
hvad var det andet jeg skulle
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.
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
22. april 2004 - 19:47
#56
Goodie. Jeg slår mig selv, hvis det ikke virker inat :-)
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
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; } ?>
22. april 2004 - 19:55
#59
Nåja, husk at ændre filnavnene
22. april 2004 - 20:00
#60
så må vi bare vente og se hvad der sker!
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 ?>
24. april 2004 - 12:05
#62
Hvis det kun er de to echo's du har fjernet, så burde det virke :)
Vi tilbyder markedets bedste kurser inden for webudvikling