Autor Zpráva
MartinMM
Profil *
Lidi, prosím, zkontrolujte mi tento kód. Funkce má být počítání kliknutí na jeden z 6 odkazů (docs.php) předáváním parametru $link a jejich zápis do řádků souboru (datclck.dat). Jednou za čas se mi soubor s hodnotami jakoby vyresetuje a počítá se odznova. Kde může být chyba?

docs.php:
<?php
define ("filename", "datclck.dat");
$fp = FOpen(filename, "r");
if ($fp) {
if (($link >= 1) && ($link <= 6)) {
$count = file(filename);
FClose($fp);
$count[$link-1] += 1;
$count[$link-1] .= " ";
$fp = FOpen(filename, "w");
for ($i = 0; $i <= 5; $i++) {
FPuts($fp, $count[$i]);
}
FClose($fp);
} else echo "Chyba! Takový odkaz neznám.<br /><a href='javascript:history.go(-1)'>Back (JS)</a>";
}

switch ($link) {
case 1:
header('Location: http://odkaz1...)');
break;
case 2:
header('Location: http://odkaz2...)');
break;
case 3:
header('Location: http://odkaz3...)');
break;
case 4:
header('Location: http://odkaz4...)');
break;
case 5:
header('Location: http://odkaz5...)');
break;
case 6:
header('Location: http://odkaz6...)');
break;
}
?>

datclck.dat:
1
3
4
1
12
1
Alphard
Profil
Jednou za čas se mi soubor s hodnotami jakoby vyresetuje a počítá se odznova. Kde může být chyba?
přiznám se, že jsem kód ani nečetl, ale vypadá to problém se současným přístupem více uživatelů
podívej se na funkci flock(); nebo ještě lépe na databázi, ta je na tohle stavěná
MartinMM
Profil *
Taky mě to napadlo. Zkusím pohledat.
MartinMM
Profil *
Stačilo by to takhle?
(předem říkám, že nejde o nějak extra důležitá data, ale nechci to obnovovat ze zálohy každý týden...)

define ("filename", "datclck.dat");
$fp = fopen(filename, "r");
if ($fp) {
if (($link >= 1) && ($link <= 6)) {
$count = file(filename);
FClose($fp);
$count[$link-1] += 1;
$count[$link-1] .= " ";
$fp = FOpen(filename, "w");
flock($fp,LOCK_EX);
for ($i = 0; $i <= 5; $i++) {
FPuts($fp, $count[$i]);
}
flock($fp,LOCK_UN);
FClose($fp);
} else echo "Chyba! Takový odkaz neznám.<br /><a href='javascript:history.go(-1)'>Back (JS)</a>";
}

...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: