Mám problém s Guest Bookem, docela dost dlouhou dobu mi běhal v pořádku, ale pak se mi prostě všechny vzkazy smazaly (2x během týdne). Ve skriptu je příkaz, ať se vytvoří nový soubor, kde se mají vzkazy ukládat, pokud neexistuje, tak jsem se chtěl zeptat, jestli je možné, že se třeba nějak nenačetl, vytvořil se nový a tím se ten starý vymazal... díky za odpověď...
Jó mě taky, asi vinou přerušeného přenosu. Moderátor Richard tu někde píše o zamčení souboru, vypadalo nějak takhle:
Flock($fp, LOCK_EX);
FWrite($fp, "$write");
Flock ($fp, LOCK_UN);
Ještě to na WZ nemám, ale na localhostu mám jednoduchou knihu, jestli budu připojen, zkus si ji stáhnout v prvním příspěvku.
http://havel3.ralsko.net/first.php?str=kniha/kniha
Je to způsobeno zápisem dvou návštěvníků najednou. pokud používáš pro otevření souboru Fopen("soubor.dat","w") tak se prvním požadavkem soubor vyprázdní a při troše "štěstí" se server v tu chvíly rozhodne obsloužit druhý požadavek, který zapíše do prázdného souboru. Řešením je zmíněný Flock.
Doufám, že sem to moc nezamotal :)
>> Fopen("soubor.dat","w")
Tohle prepise soubor VZDY. Ukladani na konec zarizuje flag "a" (append).
Ne ve skriptu se načte starý obsah, pak se zapíše nový vzkaz a jako druhý v řetězci starý obsah - ten řetězec je to w.
Je to zbytečně komplikované, tak jsem to sesmolil podle Richarda, zápis normálně od shora a načítání řádků od spodu. Mělo by to být spolehlivější - kratší proces zápisu. Musí se použít replace místo NL2BR, jinak to načítá v textara zalomené řádky taky od spodu. Vzkaz musí být v dat. souboru v jednom řádku.
http://havel3.ralsko.net/kniha/kniha.zip
Sojkovec: Já věděl, že sem to tam někde posr
To nic, já si tady kecám rozumy a přitom houby umím (v PHP). Teď zápasím se závorkama v htmlspecialchars a nějak prohrávám, v té knize to ošetřeno neni, furt tam jsou lomítka.
Díky vám všem, hlavně Havlovi-st. Zkusím tam šoupnout to zamčení. Já ale v tym PHP teda nějak neumím... kam to tam mám šoupnout? ;-)
Kolem toho kritického řádku, kde se provádí zápis. První řádek nad a třetí pod. Druhý, prostřední, je tu uveden pro příklad.
Stáhni si ode mě tu knihu a podívej se do write.php, tam to najdeš.
Tak ne. Je to v pr... dal jsem tam ten Lock a zase se mi to smazalo...
Protože:
Flock($fp, LOCK_EX);
FWrite($fp, "$write");
Flock ($fp, LOCK_UN);
je vítězný kód soutěže "O nejzbytečnější flock()" - ten kód vůbec nekontroluje, jestli se povedlo soubor uzamknout a může se tedy do něj zapisovat!
Přečti si můj příspěvek k týhle problematice:
http://www.webzdarma.cz/forum/read.php?f=6&i=16096&t=16096
najdeš tam podrobnej popis problému a jeho řešení.
Ahojte,
myslim, ze se mi asi stalo to samy. Jeden den mi kniha normalne fungovala a dneska jsem se mrk na moji "guestbook" a nic tam. Soubor kniha.dat prazdnej. Mohl byste nekdo, prosim, vysvetlit nejak polopatycteji, o co se jedna, proc se to smazalo? V PHP toho zatim moc neumim.... tak vam tu moc nerozumim. :)
Muj script prilepim nize. Slo by to nejak upravit, aby se to nesmazavalo? (Ja tomu nerozumim, delal mi to kamarad.)
Dik moc za pripadnou pomoc.
<?php
// neni-li jmeno souboru (tema) urceno, nastavi standardni kniha.dat
if (!$fn) $fn = "kniha.dat";
if ($write):
// zformatovani prispevku pro zapis
$prispevek = "<ul><li> <u><b> " . htmlspecialchars($name) . "</u>; </b>";
if ($email)
$prispevek .= "<b>" . htmlspecialchars($email) . "; </b>";
$prispevek .= "<b><i><font size='-1'>" . date("j.n.Y") . "</font></i>: </b>" .
nl2br(htmlspecialchars($text)) . "<hr width='100%' noshade color='#003366' size='1'></li></ul>";
// pokud soubor existuje, nacteme jeho obsah za novy zaznam
if (File_exists($fn)) {
$fp = fopen($fn, "r");
$prispevek .= implode('', file($fn));
fclose($fp);
}
// zapis dat
$fp = fopen($fn, "w");
if (!$fp) exit;
fputs($fp, $prispevek);
// zavrení souboru
fclose($fp);
endif;
?>
ChristmasPoo:
tohle se říší už v jiném topicu a moderáto to svádí na chybný kód našich knih návštěv. Pravda je ovšem taková, že to dělá desítkám a stovky lidem co mají knihu napsanou dobře. Chyby je jednoznačně na wz.
Já mám třeba knihu návštěv co napsal náš přední odborník na PHP pan Jiří Kosek, je to opracdiu schvělá kniha, asi dva roky mě fungovala naprosto bezvadně a teďka se ta samá chyby maže. První se mazala asi po 20 - 40 příspěvcích, teďka jsem tam neviděl už hodně dlouho víc jak 2 příspěvky.
Žádný Flock a podobný hovadiny nefungujou, je to čístě na straně serveru.
Usaama:
http://cz.php.net/manual/cs/function.fopen.php
Atribut "w" ve funkci fopen ti otevře soubor pro zápis, ale smaže jeho obsah.
Víc viz. odkaz.
Ááá promiň, nečetl jsem to celý, máš tam to implode...hmm. Co to přesunout do databáze? To kámoš zvládne určitě taky. Podle mě je to problém dvou současných požadavků o zápis do souboru-někde se to tu už řešilo. To v db odpadá.