11. díl - Anketa - Vylepšujeme anketu

PHP Databáze pro začátečníky Anketa - Vylepšujeme anketu

(pokračování tohohle článku)

Pojistka proti vícenásobnému hlasování

Anketa by nám teď měla fungovat, ale má jednu nevýhodu: kdokoli do ní může naklikat libovolný počet jakýchkoli hlasů. To se nám ale nelíbí, chtěli bychom, aby každý mohl hlasovat jenom jednou. Jak to udělat?

Máme v podstatě dvě možnosti: buď si zapamatovat IP adresu hlasujícího počítače, nebo v něm nechat sušenku (cookie). Cookies mají výhodu v jednoznačnosti (nastaví se opravdu jenom na ten jeden počítač, ze kterého se hlasovalo, a nezablokuje anketu jiným), ale nevýhodu v tom, že si je uživatel může kdykoli smazat a hlasovat znovu. IP adresy sice nemusí být jednoznačné (víc počítačů může mít stejnou) ani trvalé (na stejném počítači se může měnit), ale zase jsou jednodušší na obsluhu a tak nějak blbuvzdornější. Proto si první ochranu založíme právě na IP adresách.

Postup bude celkem jednoduchý: vytvoříme si další tabulku, do které budeme ukládat IP adresy počítačů, ze kterých se hlasovalo, spolu s kódem ankety, aby nám odhlasování v jedné nezablokovalo všechny ostatní:

CREATE TABLE ipadresy
(
ip VARCHAR(15),
kod TINYINT
)

Položka ip je vlastní IP adresa. Od serveru ji dostaneme dostaneme v podobě textového řetězce obsahujícího čtyři čísla v rozsahu 0..255, oddělená tečkami (např. '123.255.20.1'). Varchar(15) jsem si zvolil proto, že na víc než 15 znaků to vyjít nemůže; teoreticky by stejně dobře posloužil třeba Tinytext.

Položka kod odpovídá kódu ankety. Záměrně jsem ji nepojmenoval KodAnkety, protože tuhle tabulku můžeme zároveň využít třeba pro počítadla přístupů (viz minule), stačí jim přidělit nějaké kódy, které se nebudou tlouct s existujícími anketami. Ale to už nechám na vás.

Aktuální IP adresu návštěvníka najdeme v superglobálním poli $_SERVER, konkrétně pod názvem $_SERVER['REMO­TE_ADDR'] (pozor, všechna písmena jsou velká!). To je všechno, co potřebujeme, můžeme se pustit do práce. Po odhlasování uložíme adresu do tabulky následujícím způsobem:

mysql_query("INSERT INTO ipadresy VALUES ('".$_SERVER['REMOTE_ADDR']."',$cislo)",$spojeni);

Povšimněte si apostrofů připravených okolo místa, do kterého vkládáme adresu - bez nich by to nešlo, je to text. Vzhledem ke složitosti zápisu téhle proměnné jsem ji radši připojil pomocí teček, automatickému rozbalování zas až tak moc nevěřím :-].

$cislo na konci je kód ankety. Ovšem pozor - kde jsme ho vlastně vzali? V tuhle chvíli máme po ruce jenom id odeslané odpovědi, proměnnou $_GET['hlasujpro']. Nezbývá, než si ho ještě před pokusem o uložení ajpiny v příslušné tabulce najít:

$vysledek=mysql_query("SELECT kodankety FROM odpovedi WHERE id=".$_GET['hlasujpro'],$spojeni);
if ($radek=mysql_fetch_row($vysledek)) $cislo=$radek[0];
  else die('Tuhle odpověď nemáme v databázi!');

Prvním příkazem jsme získali buď tabulku 1×1 obsahující hledaný kód, nebo nic, pokud odpověď s daným id nebyla v databázi nalezena (to se může stát snad jenom při ručním hraní s adresním řádkem). Samozřejmě předpokládám, že proměnnou $_GET['hlasujpro'] už touhle dobou máme důkladně zkontrolovanou a víme, že je to platné číslo. Jestli ne, ať vás ani nenapadne strkat ji do SQL!

Druhý příkaz se pokusí z načtené jednobuňkové minitabulky vytáhnout hledaný kód. Kdyby se mu to nepovedlo, zahlásí chybu a ukončí skript (to samozřejmě není jediná možnost, jak se s chybou vyrovnat).

Shrneme to: podle čísla odpovědi jsme si našli kód ankety a spolu s IP adresou jsme ho uložili do databáze. Tím máme hotovou poslední fázi zpracování hlasu. Ještě se ale musíme vrátit na začátek, do okamžiku, kdy jsme dostali číslo odpovědi, zkontrolovali ho a teď se rozmýšlíme, jestli tenhle hlas započítáme nebo jestli už má daná adresa odhlasováno. Bude to chtít kontrolu, jestli už máme tuhle adresu uloženou a hlas zahodíme, nebo jestli ji ještě nemáme, takže ji uložíme a hlas započítáme:

$vysledek=mysql_query("SELECT * FROM ipadresy WHERE ip='".$_SERVER['REMOTE_ADDR']."' AND kod=".$cislo,$spojeni);
if (mysql_num_rows($vysledek)==0) ...tenhle tu ještě nebyl, jeho hlas uložíme...
  else ...už ho tu máme uloženého, další hlasy od něj ignorujeme...

První příkaz zkusí z tabulky IP adres vytáhnout kombinaci zpracovávané ankety a aktuální adresy návštěvníka. Pokud tam taková kombinace není (tj. ještě nebylo hlasováno), vrátí prázdnou tabulku s nulovým počtem řádků. Pokud tam je, vrátí nám jednořádkovou tabulku. Dovnitř do ní vůbec nemusíme koukat (stejně víme, co tam je - přesně to, co jsme zadali do té podmínky). Pozor, nestačí ověřit $vysledek na true nebo false - true dostaneme vždycky, i když se nevrátí žádná data! False by se objevilo jenom při chybě.

Pozn.: teoreticky samozřejmě můžeme místo té hvězdičky napsat jméno některého sloupce, ale výsledný efekt by byl stejný: buď dostaneme něco nebo nic.

Poslední drobnost, ke které se uložené adresy dají použít, je to, že anketu, ve které už se nedá hlasovat, vykreslíme rovnou bez klikatelných odkazů, aby to návštěvníky nemátlo - takovéhle věci je lepší se dozvědět na první pohled a ne až po zdlouhavém kliknutí. To bude záležitost toho kousku, kde vypisujeme jednotlivé odpovědi: prostě v takovém případě vynecháme <a>...</a>.

Stop, mám v tom guláš! Jak to všecho patří dohromady?

Pravda, zatím jsme probírali jednotlivé detaily a celek se ztrácí kdesi v nedohlednu. Tak tedy: všechno máme v jednom skriptu, který dělá tohle:

  1. Přijetí hlasu ($_GET['hlasuj­pro']). Pokud přišel, zkontrolujeme jeho platnost (is_numeric), najdeme k němu kód ankety a obě čísla si uložíme do nějakých vhodných proměnných. Pokud nepřišel nebo není platný, přeskočíme jeho zpracování.
  2. Kontrola, jestli tenhle návštěvník ve zvolené anketě může hlasovat.
  3. Zpracování hlasu (pokud přišel, je platný a může se hlasovat):
    1. Zvyš počet hlasů u zvolené odpovědi.
    2. Návštěvníkovu IP adresu ulož do tabulky adres.
  4. Cyklus pro každou anketu, kterou na téhle stránce máme:
    1. Zkontroluj, jestli tenhle návštěvník v téhle anketě může hlasovat.
    2. Pokud může, vypiš anketu s odpověďmi ve formě aktivních odkazů. Pokud ne, vypiš odpovědi jako neaktivní text.

Jak vidíte, kontrolovat přítomnost adresy v tabulce musíme nejméně dvakrát: jednou na začátku skriptu při zpracovávání hlasu a potom jednou pro každou vykreslovanou anketu.

Kosmetické detaily

Počty hlasů v anketách se obvykle znázorňují graficky pomocí různých sloupečků nebo barevných žížalek. To by v tom byl čert, abychom to nedokázali taky!

Teoreticky by se vodorovný pruh asi dal vyrobit i pomocí vhodně ostylovaných HTML elementů hr nebo div, ale nejmodernější CSS není moje silná stránka a navíc by to nebylo zrovna nejpružnější, takže použijeme klasické obrázky - element img. Využijeme toho, že se obrázku dají nastavit libovolné rozměry a nemusí se dodržovat ani poměr stran. To znamená, že můžeme mít fyzicky uložený jenom krátký úsek (jestli nepotřebujeme barevné přechody mezi levým a pravým koncem, může to být třeba jenom jednopixelová nudle) a roztáhneme si ho podle potřeby. Pokud máme konce proužku nějak tvarově odlišené (kulaté, stínované, plastické apod.), roztažení by jim uškodilo, takže je musíme uložit zvlášť. Měli bychom tedy celkem tři malé obrázky: pevný levý konec, roztažitelný střed a pevný pravý konec. Dejme tomu, že je máme na serveru uložené pod jmény levykonec.gif, stred.gif a pravykonec.gif a že jsou všechny 10 pixelů vysoké.

První otázka je, jak dlouhé proužky udělat. Nabízí se triviální možnost 1 hlas = 1 pixel, ale to by mělo dvě nevýhody: zaprvé by při malých počtech hlasů byly proužky moc krátké a rozdíly v délkách by nebyly pouhým okem viditelné, zadruhé by se naopak při hodně vysokých počtech anketa neomezeně roztahovala. Potřebujeme tedy nějaký přepočet, který maximální délku omezí a zároveň zajistí, aby každý hlas byl vidět. Nejjednodušší je prohlásit, že odpověď s největším počtem hlasů bude odpovídat maximální šířce proužku, a všechny ostatní šířky trojčlenkou smrsknout nebo roztáhnout v příslušném poměru (tak to dělají například diskusní fóra PHPBB):

max. počet hlasů    nějaký jiný počet hlasů
------------------ = -----------------------
max. šířka proužku    hledaná šířka proužku

neboli po úpravě:

hledaná šířka proužku = nějaký jiný počet hlasů * max. šířka proužku / max. počet hlasů

Jediná výjimečná situace, na kterou si musíme dát pozor, je počáteční stav ankety, kdy jsou všechny počty a tedy i maximum nulové. Asi nemusím připomínat, že dělení nulou by nedopadlo dobře ;-).

Teď ještě jak to naprogramovat (v proměnné $cislo máme kód ankety):

$vysledek=mysql_query("SELECT MAX(pocethlasu) FROM odpovedi WHERE kodankety=$cislo",$spojeni);
if (!($radek=mysql_fetch_row($vysledek)) or (($maximum=$radek[0])==null]))
  die('Tuhle anketu nemáme na skladě.');

Tady se nám objevuje nová funkce: MAX(sloupec) nám dá největší hodnotu z daného sloupce, výsledek dostaneme ve formě jednobuňkové návratové tabulky. Pokud by dané podmínce (where) neodpovídaly žádné řádky a maximum tedy nebylo z čeho počítat, v návratové tabulce bude hodnota null (pozor, návratová tabulka by existovala a obsahovala by hodnotu, akorát že by ta hodnota byla null - nestačí otestovat fetch na true/false). Obdobně funguje MIN(), která dává minimum.

Další věc, která možná potřebuje trochu vysvětlit (aspoň pro ne-céčkaře), je ten divoký logický výraz v závorce ifu. Takže: nejdřív se do proměnné $radek načte obsah návratové tabulky. Kdyby byla prázdná, celý ten přiřazovací výraz by dal hodnotu false a po negaci true. Druhá část podmínky by se vůbec neuplatnila (na výsledku oru by stejně nic nezměnila), takže by se rovnou provedlo die(). Jestli prázdná nebyla, pokračuje se druhou podmínkou. V ní se naplní proměnná $maximum, výsledná hodnota tohoto přiřazovacího výrazu (která je rovná tomu, co bylo přiřazeno) se hned porovná s nullem a jestli souhlasí, vyjde logické true a voláme die.

Na hlavičku ankety se naše kosmetické úpravy nevztahují, tak se mrkneme rovnou na odpovědi. Dejme tomu, že proužek zobrazíme ve stejné buňce přímo nad otázkou. Zároveň také rovnou provedeme dříve zmíněné vynechání odkazů, pokud už se hlasovalo (to je ta proměnná $muze_hlasovat; předpokládám, že už ji máme připravenou z dřívějška):

$vysledek=mysql_query("SELECT id, pocethlasu, odpoved FROM odpovedi WHERE kodankety=$cislo ORDER BY id ASC",$spojeni);
while ($radek=mysql_fetch_array($vysledek))
 {
 echo '<tr><td>';
 //proužek:
 echo '<img src="levykonec.gif">';
 if ($maximum==0) $sirka=0; //pojistka proti dělení nulou
             else $sirka=round($radek['pocethlasu']*200/$maximum);
 echo '<img src="stred.gif" height="10" width="'.$sirka.'">';
 echo '<img src="pravykonec.gif"><br>';
 //otázka a počet hlasů:
 if ($muze_hlasovat) echo '<a href="anketa.php?hlasujpro='.$radek['id'].'">';
 echo $radek['odpoved'];
 if ($muze_hlasovat) echo '</a>';
 echo '</td><td>';
 echo $radek['pocethlasu'];
 echo '</td></tr>';
 };

Zakončení tabulky a podobné formality už nechám na vás.

200 je požadovaná maximální šířka proužku v pixelech. Hodnotu jsem si zvolil, může to být samozřejmě i cokoli jiného. 10 je požadovaná výška proužku; zadat se musí, jinak by většina prohlížečů roztáhla obrázek i svisle, aby se zachoval poměr stran. Výška proužku by pochopitelně měla být stejná jako výška levého a pravého konce, na které má navazovat.

Použili jsme novou funkci: round(číslo), která dané číslo zaokrouhlí na celé. To je nutné, protože šířka obrázku musí být zadána v celých pixelech.


Poslední věc, která stojí za zmínku, je možnost zabalit obsluhu anket do funkcí (viz dříve). Pokud si napíšeme jednu funkci pro zpracování hlasu a druhou pro zobrazení jedné ankety (její kód by dostala v parametru), výrazně si zpřehledníme zápis v hlavní části skriptu. Navíc pokud se nám podaří po vyhodnocení hlasu skočit zpátky na původní stránku (napadá mě předat jméno cílové stránky jako další parametr zobrazovací funkce, ale možná existuje i něco pohodlnějšího), můžeme si anketní funkce schovat do samostatného souboru a ten pak podle potřeby includovat a využívat na všech ostatních stránkách.

Tím jsme s provozní částí anket víceméně hotovi. Zbývá sestavit si nějaký skript, který by nám usnadnil jejich tvorbu a úpravy. Pokračujte prosím tudy.


 

  Aktivity (1)

Článek pro vás napsal Mircosoft
Avatar
Autor je amatérský pascalista, assemblerista a bastlíř. Profesionálně psal nebo píše v HLASM, Rexxu, Cobolu, ST, LAD, FBD, PHP, SQL, JS, Basicu a pár dalších jazycích, které kupodivu stále existují a používají se :-).

Jak se ti líbí článek?
Celkem (2 hlasů) :
55555


 


Miniatura
Předchozí článek
Anketa - Tvoříme anketu
Miniatura
Všechny články v sekci
Databáze v PHP pro začátečníky
Miniatura
Následující článek
Anketa - Administrační rozhraní

 

 

Komentáře

Avatar
Vojta Pšenák
Redaktor
Avatar
Vojta Pšenák:

Ahoj, nějak mi nejde ta kontrola IP. Nejde mi uspořádat kód , nemohl by jsi ho sem dát?

 
Odpovědět 11.5.2012 20:37
Avatar
Mircosoft
Redaktor
Avatar
Odpovídá na Vojta Pšenák
Mircosoft:

Hotové ankety dostaneš na Blueboardu. Tohle je výukový seriál a uspořádání kódu jsi dostal za domácí úkol 8-) .

Ale že jsi to ty: http://mircosoft.mzf.cz/…load/php.zip (neručím za přehlednost, psal jsem to pro vlastní potřebu)

 
Odpovědět  +1 14.5.2012 10:30
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Mircosoft
David Čápka:

Klidně bych sem ty zdrojáky dal ke stažení, chytří se z nich přiučí a těm, kteří jim nerozumí, to stejně nepomůže :)

Jinak jsi mě pobavil tím "že jsi to ty" :D

Odpovědět 14.5.2012 10:42
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
oggymotslp
Člen
Avatar
oggymotslp:

Moc složité :D

Odpovědět 10.6.2014 16:24
Proč to dělat jednoduše, když to jde i složitě :D
Avatar
loading84
Člen
Avatar
loading84:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="Content-type" content="text/html; charset=UTF-8">

  <title>Anketa</title>
  </head>
  <body>
   <?php
         mb_internal_encoding('UTF-8');
        $spojeni=mysql_connect('localhost','root',' ');
        if(!$spojeni) die('Nepodarilo se pripojit k databazi');


        mysql_set_charset('utf8');
        mysql_select_db('anketa',$spojeni);

$cislo=1; //císlo ankety
$vysledek=mysql_query("SELECT otazka FROM otazky WHERE kodankety=$cislo",$spojeni);
$radek=mysql_fetch_row($vysledek);
echo '<table><tr><td colspan="2">'.$radek[0].'</td></tr>';




$vysledek=mysql_query("SELECT id, pocethlasu, odpoved FROM odpovedi WHERE kodankety=$cislo ORDER BY id ASC",$spojeni);
while ($radek=mysql_fetch_array($vysledek))
 {
 echo '<tr><td>';
 echo '<a href="anketa.php?hlasujpro='.$radek['id'].'">'.$radek['odpoved'].'</a>';
 echo '</td><td>';
 echo $radek['pocethlasu'];
 echo '</td></tr>';
 };
echo '</table>';

  if ($_GET['hlasujpro'] =='done')

      {
      $text='Vas hlas byl odeslan!';
      echo '<br />';
      echo $text;
      }


  $promena = $_GET['hlasujpro'];


  if(($promena!='')&&($promena!='done')&&(!is_numeric($promena)))
  {
  echo ('<br /> Co to na me zkoušíš, podvodníku?');
  }


$pomoc=$_GET['hlasujpro'];

$vysledekkk=mysql_query("SELECT * from odpovedi where id=$pomoc AND kodankety=$cislo", $spojeni);







$vysledek=mysql_query("SELECT * FROM ipadresy WHERE ip='".$_SERVER['REMOTE_ADDR']."' AND kod=".$cislo,$spojeni);
if ((mysql_num_rows($vysledek)==0) && (is_numeric($_GET['hlasujpro']))&&(mysql_num_rows($vysledekkk)!=0))
{


  mysql_query("UPDATE odpovedi SET pocethlasu=pocethlasu+1 WHERE id=".$_GET['hlasujpro'],$spojeni);
  mysql_query("INSERT INTO ipadresy VALUES ('".$_SERVER['REMOTE_ADDR']."',$cislo)",$spojeni);
  header('Location: anketa.php?hlasujpro=done');
  exit;
}

if((is_numeric($promena))&&(mysql_num_rows($vysledekkk)!=0))

echo '<br>'.'Hlas nebyl ulozen, stejna ip adresa.';



    ?>

    </body>
</html>

Moje anketa s tím, že vychazím z toho že promena cislo rovna se jedne. Ale jinak je tam vše ošetřeno.
Snad to někomu bude k užitku když jsem si s tím dal tu práci.

A na obrazkove ztvarneni jsem se vykaslal.....

Editováno 7.10.2015 20:25
 
Odpovědět 7.10.2015 20:25
Avatar
David Moškoř:

Mohli byste mi prosim pomoct zkontrolovat tento zdroják (je to v html). Mám anketu, ale když zmáčknu odeslat hodí mě to na úvod:(.

<style type="text/css">
        .widget_content_anketa .buttons {
            float: right;
        }
        .w_heading {
          color: #9eb23f;
          font-size: 15px;
          text-align: left;
          font-weight: bold;
          padding: 0px 0px 5px 0px;
          margin: 0px 0px 5px 0px;
        }
        .w_name {
            line-height: 15px;
            margin: 2px;
        }
        .w_perc {
            float: right;
            background-color:#9eb23f;
            height: 15px;
            margin: 2px;
        }
        .w_numb {
            float: right;
            height: 15px;
            line-height: 15px;
            margin: 2px;
        }
        .w_clear {
            clear: both;
        }
        .w_moznost {
            line-height: 25px;
            clear: both;
            display: block;
        }
        .w_moznost label {
            line-height: 20px;
        }
        p#pocet_hlasu {
            margin: 5px 0;
            padding-top: 4px;
            border-top: 1px solid #c8dd65;
        }
        .widget_content_anketa form {
            margin:0px;
            padding:0px;
        }
        .w_avysledky {
            font-size:11px;
            display:block;
            clear:both;
            text-align:right;
        }
      </style><div class="widget_area"><div class="widget_content"><table align="center" cellspacing="0" cellpadding="0" border="0"><tr><td align="left">
            <div class="widget_content_anketa" style="width: 190px; "><h3 class="w_heading">Do jaké země byste se chtěli podívat?</h3><form id="hlasovani_ankety_form_19304" onsubmit="if($('input[@name=hlas]:checked').attr('id')) { DirectAjax('direct_ajax.php','hlasovani_ankety_form_19304','hlasovani_ankety_form_19304','idetifier=5','parametrycript=2%B9%804%C2%B9%BD%A5u%C7%14%09b%87%BF%85j%2C%40%DE%06%86u%8E%0F%9F%26%AA1x%0C%C0%CA%B09%81L%29%5Eu%9A%F3+%9A%F3%0D%A0%BE4%F8%1C%DB%01gz%EB%3E%F3%83%8F%A1%00%EC%89%23%3A%F5%3Cqpez%BC%EC%E5%8D%5D%8Db%B85%7C%03%08%E8%BA%041%FCs%FE%1B%E54%F1%A5%14%AD%EE%8E73%B4H%E0%D0%284%A4%EA%83L%18%FEA%EE%C3X%7C%DE%F3%FF%0C%DER%80%B2%2B%2F%2Ft%1E%25%BF%94%DC%93%8Dr%CF%C5%C8%01C%DA%C23%C3%CD%B1%92%D6%5D%90%16%02%3F%7D%98TZ%1A%BC%87%C6%D6%D4%B1Q%89%BA%280%80W4%80pM3%A7%E5%22%0F%2A%91L%C7%AD%B9%CD%1F%1A%C5_%B0%86%80%8B%C1%A9J%D5aE%80%BECI%B4%CD%B8%E9qy%DBf%B8%E3g%9Bf%C2%E2G%D1%24%01%9E%C6%EC%7FQ%BC%CC%A1%DC%5E%F6%9Bb%8B%A8%7B%D8%ABN7m%A1%A0%D3%A8t%9Bw%17%D8%A8r%C3','js_preloader=preloader_stranky.gif'); return false; } else { alert('Nejdříve vyberte jednu z možností...'); return false; }"><span class="w_moznost"><input type="radio" name="hlas" value="0" id="var_193040" /><label for="var_193040">Island</label></span><span class="w_moznost"><input type="radio" name="hlas" value="1" id="var_193041" /><label for="var_193041">Francie</label></span><span class="w_moznost"><input type="radio" name="hlas" value="2" id="var_193042" /><label for="var_193042">Španělsko</label></span><span class="w_moznost"><input type="radio" name="hlas" value="3" id="var_193043" /><label for="var_193043">Jihoafrická republika</label></span><span class="w_moznost"><input type="radio" name="hlas" value="4" id="var_193044" /><label for="var_193044">Keňa</label></span><span class="w_moznost"><input type="radio" name="hlas" value="5" id="var_193045" /><label for="var_193045">Egypt</label></span><span class="w_moznost"><input type="radio" name="hlas" value="6" id="var_193046" /><label for="var_193046">Fidži</label></span><span class="w_moznost"><input type="radio" name="hlas" value="7" id="var_193047" /><label for="var_193047">Nový Zeland</label></span><span class="w_moznost"><input type="radio" name="hlas" value="8" id="var_193048" /><label for="var_193048">Austrálie</label></span><span class="w_moznost"><input type="radio" name="hlas" value="9" id="var_193049" /><label for="var_193049">Argentina</label></span><span class="w_moznost"><input type="radio" name="hlas" value="10" id="var_1930410" /><label for="var_1930410">Chile</label></span><span class="w_moznost"><input type="radio" name="hlas" value="11" id="var_1930411" /><label for="var_1930411">Brazílie</label></span><span class="w_moznost"><input type="radio" name="hlas" value="12" id="var_1930412" /><label for="var_1930412">Mexiko</label></span><span class="w_moznost"><input type="radio" name="hlas" value="13" id="var_1930413" /><label for="var_1930413">USA</label></span><span class="w_moznost"><input type="radio" name="hlas" value="14" id="var_1930414" /><label for="var_1930414">Kanada</label></span><input class="buttons" type="submit" style="margin-top:10px" name="button" value="Odeslat hlas" /><a href="#" onclick="DirectAjax('direct_ajax.php','hlasovani_ankety_form_19304','','idetifier=5','parametrycript=2%B9%804%C2%B9%BD%AB%A2%DAC%A5%10M2%7E%169%EA%89%D3%805%BB-%CF%AE%88%F1%21%A2%2A-A%FB%F5%25%27%B1%5DR%E3%40w%EE%B1%DA%F8%A4%2Fh%BB%A1%A0jQ%AA%15%26%04%D6%400%5B%DA%F4%EC%9F%3A%A2%9CQ%8E%96%0D%BEH%82%09%BF%D2%28%E7%14%8D%848K%27%1E%A7mJ%F8pB%EEG%7D%0D8%A6%1B%81%D1W%07%B3%9D%91%99%EC%B5%18%80v%B0%93%8A%95%18c%03%7B3%7D%3A%CF%CBX%8F%D9%7C%9Fl%0D%8A%C0%3D%E1%2AK%07%97%F0ut%E5%18%E4%E5%DE%F6%98%A5%5E%F6%FD%2F_%10%FB%A7%AD%E2%F52%23%F7%D2%60%BD%3DC%27%AC%1B%94%FE%0FEf%D0%91','js_preloader=preloader_stranky.gif');;return false;" class="w_avysledky">zobrazit výsledky</a><div class="w_clear"></div></form></div>
        </td></tr></table></div>
</div></div>
Odpovědět 18. ledna 17:53
Všechno jde, když se chce!
Avatar
Mircosoft
Redaktor
Avatar
Mircosoft:

Co je ten úvod, na který tě to hodí? Tahle stránka, hlavní stránka, něco jiného...?

Do očí mě praštily dvě věci: nemáš nastavený parametr action ve formuláři a onsubmit ti v obou větvích ifu vrací false. Ale možná to máš nějak ošetřené přes ten ajax, kterému vůbec nerozumím.

 
Odpovědět 18. ledna 20:03
Avatar
Dominik Gavrecký:

Nebolo by dobré aktualizovať tento článok ?

Odpovědět  +1 18. ledna 20:12
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Dominik Gavrecký
David Čápka:

Je to materiál mimo základní seriály, takže na to nijak nespěcháme. Klidně ho můžeš aktualizovat, rád ti přičtu body nebo pošlu peníze :) Nám to ještě chvíli potrvá, řešíme teď hlavně Nette a další PHP frameworky.

Odpovědět  +1 18. ledna 20:49
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.