Autor Zpráva
Edhel
Profil
Ahojte, potřeboval bych trochu poradit s anketou, co jsem dal dohromady. (Základy PHP snad zvládám, u pokročilejších věcí stále trochu tápu.) Pokud toto patří spíše do sekce Databáze, omlouvám se za špatné vložení. Také se dopředu omlouvám za možná trochu zmatený popis, naprogramoval jsem ji někdy v listopadu a od té doby jsem na to samozřejmě neměl čas sáhnout:)
Tedy, anketa funguje dobře, mám z ní udělanou funkci, abych u více anket nemusel kopírovat celý její kód a jenom mohl měnit číslo ankety. Jako ochranu proti vícenásobnému hlasování si ukládá do tabulky v databázi IP a číslo ankety, ve které ten člověk hlasoval (coockies používat moc nechci); pokud chce člověk hlasovat vícekrát, vyskočí mu hláška "trhni si" (pracovní verze, omluvte nevymáchanou hubu ankety, ještě ji naučím nějaké slušnější odmítnutí opakovaného hlasu). Pokud je ale na stránce více anket a člověk chce opakovaně hlasovat do některé z nich, "trhni si" vyskočí u všech anket, kde už hlasoval a ne jen u té jedné. (Mám upravenou verzi ankety pro zadání více hlasů zaráz, a hlášky "trhni si" vyskakují u ostatních anket, i když člověk hlasuje do této.)
Můžete někdo, prosím, poradit, jak to zařídit, aby hláška vyskočila jen u té jedné ankety, kde chce člověk hlasovat vícekrát?
(Zatím testuju na localhostu a v databázi přepisuju IP adresy. Také jsem si vědom, že to asi není žádný programátorský zázrak a případným vypilováním pro hladší fungování se nebráním.)

Tu je kód ankety:
<?php
function anketa($cislo){
include ('spojeni.php'); //připojení na mysql v externím souboru
$adresa=$_SERVER['REMOTE_ADDR'];
$vysledek=mysqli_query($spojeni, "SELECT otazka FROM otazky WHERE KodAnkety=$cislo LIMIT 1");
$titulek=mysqli_fetch_row($vysledek);
$kontrola=(mysqli_fetch_row(mysqli_query($spojeni,"SELECT COUNT(*) FROM adresy WHERE kodankety='$cislo' AND ip='$adresa'")));

$maximum=mysqli_fetch_row(mysqli_query($spojeni,"SELECT MAX(pocethlasu) FROM odpovedi WHERE kodankety=$cislo"));
$vsichni=mysqli_fetch_array(mysqli_query($spojeni,"SELECT SUM(PocetHlasu) FROM odpovedi WHERE kodankety=$cislo"));

$poslana = $_POST[hlas];
if ($poslana)
{if ($kontrola[0] == 0)
{mysqli_query($spojeni,"UPDATE odpovedi SET pocethlasu=pocethlasu+1 WHERE id=$poslana");
 mysqli_query($spojeni,"INSERT INTO adresy VALUES (0, '$cislo', '$adresa')");}
 else echo 'trhni si';
}

echo '<form method="post" action="" class="anketa">';
echo '<ul class="anketa-seznam">';
echo '<li class="titul">'.$titulek[0].'</li>';
$odpovedi=mysqli_query($spojeni,"SELECT id, pocethlasu, odpoved FROM odpovedi WHERE kodankety=$cislo ORDER BY id ASC");
while ($odpoved=mysqli_fetch_array($odpovedi)):
echo '<li>';
 echo '<button type="submit" name="hlas" value="'.$odpoved['id'].'">'.$odpoved['odpoved'];
 echo '<span class="pocet">'.$odpoved['pocethlasu'].'</span><br>'.'</button>';
if ($maximum[0]==0){$sirka=0;} //pojistka proti dělení nulou
             else $sirka=(round($odpoved['pocethlasu']*100/$maximum[0])-4);
if ($odpoved['id']/2 == floor($odpoved['id']/2)) {$styl= 'suda';}
else $styl= 'licha';
 echo '<span class="bar" style="width: '.$sirka.'%;">&nbsp;</span></li>';
endwhile;
echo '<li class="celkem">Zatím hlasovalo lidí: <b>'.$vsichni['0'].'</b></li>';
echo '</ul></form>';
mysqli_close($spojeni);
}

anketa("1");
echo '<br>';
anketa("2");
?>
Jozin
Profil
Zdravím,

problém je způsobený odesílacím tlačítkem, jmenuje se stejně a při znovunačtení je to interpretováno, že všechny formuláře byly odeslány.

Co se týče kódu PHP, $spojeni by měla být předána prametrem, takto každé volání funkce znovu načítá soubor spojeni.php ba co hůř se nejspíš i znovu připojuje k databázi.

Co se týče kódu HTML, myslím, že je <input type="submit" ... ne <button type="submit" ..., ale to už je asi ta poslední věc, kterou je potřeba upravit.
okolojsoucí
Profil
Jozin:
Co se týče kódu HTML, myslím, že je <input type="submit" ... ne <button type="submit" ..., ale to už je asi ta poslední věc, kterou je potřeba upravit.

To je úplně jedno, akorát button podporuje html. Button
Edhel
Profil
Jozin:
S tím odesílacím tlačítkem mě to vůbec nenapadlo. Přidal jsem ke jménu tačítka číslo ankety a funguje to výborně, díky moc:)
O opakovaném připojení vím, že je to zlo... Nebo jsem aspoň věděl, když jsem to dával dohromady, a odsunul jsem řešení na později. Děkuji za připomenutí. Přihlášení do databáze bylo vyhozeno z opakované funkce ven a spojení voláno přes globální proměnnou (doufám, že nemelu nesmysly) a funguje to:)
Jak praví okolostojící, button nevadí. Input jsem tam původně měl, ale potřeboval jsem větší možnosti úprav a nastylovaní.
Ještě jednou díky za rychlou odpověď.

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: