Problémy s anketou
12 příspěvků
Archiv diskusního fóra
Fórum je uzavřené a slouží pouze ke čtení. Některé informace mohou být zastaralé.
-
Vždy po nějakém čase se mi smažou data o hlasování v anketě a taky vzkazy v návštěvní knize. Uložena jsou pomocí php v txt souboru. Problém má víc lidí. Prosím poraďte.
-
možná tě to překvapí, ale máš chybu ve skriptu... tím jsem chtěl říct, že bez něj ti asi těžko poradíme
-
Vy jste ale rychlíci.. <?php $souborip="anketa-ip.txt"; //soubor s ip adresami hlasujících $soubor="hlasuj.txt"; //soubor s hlasy $aktualni = $REMOTE_ADDR; //aktuální ip adresa $otazka = "Jak se vám líbí tyto stránky?"; //Otázka $odp = array("Výborný","Dobrý","Ujde","Hrůza"); //Odpovědi //Kontrola existence souborů if (!file_exists($souborip)) { err ($souborip); exit; } if (!file_exists($soubor)) { err ($soubor); exit; } //Konec kontroly //Otevření a načtení hlasů $data = fopen($soubor, "r"); $cti = fread($data, filesize($soubor)+10); fclose($data); list($a, $b, $c, $d) = explode( "Đ", $cti); //Hlasování if (isset($odpoved)) { if (zjistiip($souborip, $aktualni)) { if ($odpoved == "a") {$a++;} elseif ($odpoved == "b") {$b++;} elseif ($odpoved == "c") {$c++;} elseif ($odpoved == "d") {$d++;} $zapsat = "$a" . "Đ" . "$b" . "Đ" . "$c" . "Đ" . "$d" . "Đ"; $kam = fopen($soubor, "w"); fwrite($kam, $zapsat); //zapsání nového hlasu do souboru fclose($kam); $ipsoubor = fopen($souborip, "r"); //zapsání ip adresy odesílatele hlasu $data = fread($ipsoubor, filesize($souborip)+10); fclose($ipsoubor); $write = $data.$aktualni."Đ"; $kam = fopen($souborip, "r+"); fwrite($kam,$write); fclose($kam); } } //Zobrazení výsledků $celkem = $a+$b+$c+$d; $lidi = $celkem; if ($celkem == 0) { $celkem = "1"; $lidi="0"; } $pr = $celkem/100; $a = number_format($a/$pr,1); $b = number_format($b/$pr,1); $c = number_format($c/$pr,1); $d = number_format($d/$pr,1); $pismeno = array ("a","b","c","d"); $procenta = array ("$a","$b","$c","$d"); $kolik = "4"; echo "<table border='0' cellpadding='0' cellspacing='0' width='50px'>\n"; echo "<tr><td colspan='2' class='ank_to'><b>$otazka</b></td></tr>\n"; for ($i=0; $i<$kolik ;$i++ ) { if (zjistiip($souborip, $aktualni)) { echo "<tr><td colspan='2' class='ank_t'><a href=anketa.php?odpoved=$pismeno[$i]>$odp[$i]</a></td></tr>\n"; } else { echo "<tr><td colspan='2' class='ank_t' >$odp[$i]</td></tr>\n"; } echo "<tr><td bgcolor='#CCCCCC' width='85px'><img src='prouzek.bmp' height='8px' width='".(($procenta[$i])/1.2)."px'></td><td class='ank_t' width='10px'> $procenta[$i]%</td></tr>\n"; } echo "<tr><td colspan='2' class='ank_to'>Celkem hlasovalo:<br><b>$lidi</b> lidí</td></tr></table>\n"; //Funkce pro vypsání chyby function err ($soubor) { echo "<font color=red><b>Chyba!</b></font><br>Nelze nalézt soubor <b>$soubor</b>!\n"; } //funkce pro zjištění ip adresy function zjistiip($souborip, $ip) { $ipsoubor = fopen($souborip, "r"); $data = fread($ipsoubor, filesize($souborip)+10); fclose($ipsoubor); $ipadresy = explode("Đ",$data); if (in_array($ip, $ipadresy)) { return false; //Pokud již bylo z dané ip adresy hlasováno } else { return true; // pokud nebylo z dané ip hlasováno } } //konec funkce ?>
-
resilo se zde. hledej "flock".
-
nebo spis jenom pridej flock a bude to f pohode
-
co je to flock?
-
Jirka: funkce v php. vice viz manual php.
-
mno ja bych to radsi resil databazi je to jednodusi a rychlejsi!
-
tak jsem se díval a viděl. kám mám přidat flock()
-
ať žijou lamy
-
tak asi takhle? //Otevření a načtení hlasů $data = FOPEN($soubor, "r"); flock($soubor,LOCK_SH); $cti = fread($data, filesize($soubor)+10); FCLOSE($data); LIST($a, $b, $c, $d) = explode( "Đ", $cti); flock($soubor,LOCK_UN); //Hlasování IF (ISSET($odpoved)) { IF (zjistiip($souborip, $aktualni)) { IF ($odpoved == "a") {$a++;} ELSEIF ($odpoved == "b") {$b++;} ELSEIF ($odpoved == "c") {$c++;} ELSEIF ($odpoved == "d") {$d++;} $zapsat = "$a" . "Đ" . "$b" . "Đ" . "$c" . "Đ" . "$d" . "Đ"; $kam = FOPEN($soubor, "w"); flock($soubor,LOCK_EX); FWRITE($kam, $zapsat); //zapsání nového hlasu do souboru FCLOSE($kam); flock($soubor,LOCK_SH); $ipsoubor = FOPEN($souborip, "r"); //zapsání ip adresy odesílatele hlasu flock($souborip,LOCK_EX); $data = fread($ipsoubor, filesize($souborip)+10); FCLOSE($ipsoubor); flock($souborip,LOCK_SH); $write = $data.$aktualni."Đ"; flock($souborip,LOCK_EX); $kam = FOPEN($souborip, "r+"); flock($souborip,LOCK_SH); FWRITE($kam,$write); FCLOSE($kam); } }
-
asi takto: if(!file_exists(soubor)) // soubor neexistuje { // otevreni pro cteni soubor pri jeho neexistenci nevytvori $fp = fopen(soubor, 'w'); fclose($fp); } $fp = fopen(soubor, 'r+'); for($pokus = 0; $pokus < 10; $pokus++) // 10 pokusů na zápis po 100us { if (flock($fp, LOCK_EX)) // nastaveni zamku { // tady mame zamceno // cteme soubor ftruncate($fp, 0); rewind($fp); // smazeme soubor // zapiseme data flock($fp, LOCK_UN); // uvolneni zamku break; // ukonceni cyklu pokusu o zapis } // konec if (flock($fp, LOCK_EX)) usleep(100); // cekani na dalsi pokus o zapis } // konec cyklu for pro pokusy o zapis fclose($fp); // zavreni souboru co to pouzivam, jeste se mi ten soubor nesmazal