PHP hit counter

Weer een php probleem , ik wil een hit counter maken maar hij dupliceerd een getal ipv dat hij erbij optelt :

[code:1:c86436e081]<body>

<?
$aantal = fopen("hit.txt","r");
$som = $aantal+1;
$fp = fopen("hit.txt", "a");
fputs($fp, "$som");
fclose($fp);
?>
This page is visited already <? include("hit.txt") ?> times .
</body>[/code:1:c86436e081]

Voobeeld op http://www.exekoo.be/php/hit.php

[code:1:0fc419ca32]$fp = fopen("hit.txt", "w"); [/code:1:0fc419ca32]

a is voor append
w is voor write

zie ook de www.php.net site over fopen .

Nu telt hij alleen maar tot 2 en blijft hij 2 weergeven zie : http://www.exekoo.be/php/hit.php

en op http://www.exekoo.be/php/hit.txt kan je de text file zien .

En ik gebruik nu deze code

[code:1:b42daf8e25]<body>

<?
$aantal = fopen("hit.txt","r");
$som = $aantal+1;
$fp = fopen("hit.txt", "w");
fputs($fp, "$som");
fclose($fp);
?>
This page is visited already <? include("hit.txt") ?> times .
</body>[/code:1:b42daf8e25]

Gebruik [url=http://www.php.net/file_get_contents]file_get_contents[/url] ipv fopen; fopen geeft alleen een filehandler terug, in jouw geval 1 waarbij 1 wordt opgeteld, 2 dus. Als je fopen gebruikt, moet je ook fread gebruiken.

Je kunt ook

[code:1:1efd26fc09]<? include("hit.txt") ?>[/code:1:1efd26fc09]
vervangen door

[code:1:1efd26fc09]<?php echo $som; ?>[/code:1:1efd26fc09]

:slight_smile:

Het lijkt wel alsof de rechten van hit.txt zijn veranderd toen de teller op twee stond. check even of hit.txt de permissies 777 heeft (dat moet als je dingen naar een bestand wilt schrijven toch...?)

OK, bedankt . Maar nu telt hij nooit verder dan 2 , in de txt file blijft altijd 2 staan .

[quote:93cb06f25d="rbroen"]Gebruik [url=http://www.php.net/file_get_contents]file_get_contents[/url] ipv fopen; fopen geeft alleen een filehandler terug, in jouw geval 1 waarbij 1 wordt opgeteld, 2 dus. Als je fopen gebruikt, moet je ook fread gebruiken.[/quote:93cb06f25d]

jemig wat gaat deze thread snel !

Ik dacht aan [code:1:769f3325c0]<? file_get_contents (hit.txt) { $aantal = fopen("hit.txt","r"); $som = $aantal+1; $fp = fopen("hit.txt", "w"); fputs($fp, "$som"); fclose($fp); } ?>[/code:1:769f3325c0]

Maar het werkt niet :?

[code:1:23ce3ca517]<? $aantal = file_get_contents ("hit.txt"); $som = $aantal+1; $fp = fopen("hit.txt", "w"); fwrite($fp, "$som"); // fputs is alleen een alias voor fwrite fclose($fp); } ?>[/code:1:23ce3ca517]

Fatal error: Call to undefined function: file_get_contents() in /var/www/html/php/hit.php on line 12

[code:1:cfadc06cd5]<?
$aantal = file_get_contents("hit.txt"); //Hier is regel 12 en zit de fout
$som = $aantal+1;
$fp = fopen("hit.txt", "w");
fwrite($fp, "$som"); // fputs is alleen een alias voor fwrite
fclose($fp);

?>[/code:1:cfadc06cd5]

Kijk maar op http://www.exekoo.be/php/hit.php

Kijk ook eens op de [url=http://www.php.net]php[/url] site, daar kun je alle functies op zoeken door de functie achter de url te typen, zo dus [url=http://www.php.net/file_get_contents]www.php.net/file_get_contents[/url].

“file_get_contents” is pas in versie 4.3.0 toegevoegd.

[code:1:93603f1366]function file_get_contents($filename) {
$fd = fopen("$filename", "rb");
$content = fread($fd, filesize($filename));
fclose($fd);
return $content;
} [/code:1:93603f1366]

Hij werkt gewoon hoor :) Als je trouwens al iets met een DB doet in die site is het wat mooier om daar een hitcounter in te maken. Zon call naar een file is ook wat onveiliger dan een db_query waar je getalletje naartoe queriet.

[quote:b297fccc24="Thijs"]Zon call naar een file is ook wat onveiliger dan een db_query waar je getalletje naartoe queriet.[/quote:b297fccc24]

Niet alleen onveiliger maar ook onsympathieker en trager. Bij een site met veel hits bestaat er een kans dat 2 scripts tegelijk het bestand willen schrijven, wat fout gaat. De snelheid om dit in dee dB zoals MySQL te doen is stukken sneller. Overweeg 't eens.

Naja ik ging van veiligheid uit maar je hebt inderdaad gelijk, deadlockende php scripts die vechten voor een write lock op een file wil je niet ;) Overweeg ook eens PostgreSQL, kan je tenminste wel subquery's in doen ;)