Autor Zpráva
Kos
Profil *

$stranky = array('cau.html', 'nazdar.html', 'gutentag.html');
$pocet = count($stranky);

$cislo = floor(file_get_contents('cislo.dat'));
$cislo = ($cislo + 1) % $pocet;
include $stranka[$cislo - 1];
fwrite(fopen('cislo.dat', 'w'), $cislo);

Může se stát, že se občas záhadně nastaví nula při dvou současných přís
tupech na stránku, viz http://php.vrana.cz/atomicita-operaci.php


Co se tedy stane, když se v tomto případě záhadně nastaví 0? Vypíšeš se chybová hláška nebo se zobrazí CAU.HTML ??? Případně jak by se to dalo ošetřit.

P.S.: Co znamená % v PHP ($cislo = ($cislo + 1) % $pocet; )

Díky za radu
Kajman_
Profil *
% je modulo - zbytek po dělení

Takže když bude v souboru dvojka, pričte se jednička, bude zbytek nula.

A když se ještě od nuly odečte pri include jednička, tak už je to záporná hodnota a těžko to v poli stranky najde. Myslím, že v tom kódu je chyba a má tam být např.
include $stranka[$cislo];
mila
Profil
A stane se něci hrozného pokud dva lidé po sobě uvidí stejnou stránku?
llook
Profil
Když se záhadně nastaví nula, tak se zobrazí cau.html. To je celé.

Více to může vadit třeba u nějakých diskuzí, chatů apod. (v jedné knížce jsem viděl příklad na chat bez databáze, který to neměl ošetřené).

Jde o to, že fopen('soubor', 'w') nejdřív smaže obsah souboru. Druhý návštěvník může spustit skript tak nešikovně právě v ten okamžik, že si soubor přečte když byl právě vyprázdněn (fopen) a ještě do něj nebyla uložena nová data (fwrite + fclose).

A teď mě napadá, že mi v tom skriptu chybí fclose, takže poslední řádek bych spíš rozepsal takhle:
$fp = fopen('cislo.dat', 'w');

fwrite($fp, $cislo);
fclose($fp);
Toto téma je uzamčeno. Odpověď nelze zaslat.

0