hlasovátko

hlasování na drsného sajtu

včera večer, než jsem usnul, mě napadlo, že bych si mohl na svém serveru vyrobit hlasovátko. nápad byl na světě a protože se mi nepodařilo během jeho realizace s notebookem na břiše usnout (ne že by se mi to už někdy nestalo :-))), je hlasovátko na světě.

protože mám jednotlivé článečky v databázi a každý má své id, pojal jsem to tak, že jsem vyrobil v databázi novou tabulku. struktura tabulky je následující:

CREATE TABLE `vote` (
  `id` int(10) unsigned NOT NULL default '0',
  `dotaz` varchar(255) NOT NULL default '',
  `stav01` int(10) unsigned NOT NULL default '0',
  `stav02` int(10) unsigned NOT NULL default '0',
  `stav03` int(10) unsigned NOT NULL default '0',
  `stav04` int(10) unsigned NOT NULL default '0',
  `stav05` int(10) unsigned NOT NULL default '0',
  `stav06` int(10) unsigned NOT NULL default '0',
  `stav07` int(10) unsigned NOT NULL default '0',
  `stav08` int(10) unsigned NOT NULL default '0',
  `stav09` int(10) unsigned NOT NULL default '0',
  `stav10` int(10) unsigned NOT NULL default '0',
  `text01` varchar(255) NOT NULL default '',
  `text02` varchar(255) NOT NULL default '',
  `text03` varchar(255) NOT NULL default '',
  `text04` varchar(255) NOT NULL default '',
  `text05` varchar(255) NOT NULL default '',
  `text06` varchar(255) NOT NULL default '',
  `text07` varchar(255) NOT NULL default '',
  `text08` varchar(255) NOT NULL default '',
  `text09` varchar(255) NOT NULL default '',
  `text10` varchar(255) NOT NULL default '',
  UNIQUE KEY `id` (`id`)
) TYPE=MyISAM;

potom jsem ještě vyrobil script, který je volán při zobrazení článku. tento script využívá parametr id, který je odeslán prostřednictvím url.

<?PHP    
  
// z tabulky vote v databazi se nacte radek odpovidajici zobrazenemu clanku
  
$dotaz="SELECT * FROM vote WHERE id='".$_GET[id]."'";
  
$vysledek=MySQL_Query($dotaz);
  
$pocet=MySQL_Num_Rows($vysledek);
  
// pokud radek s odpovidajicim id v tabulce je, pokracujeme
  
if($pocet){
    
$radek=MySQL_Fetch_Array($vysledek);
    
/* 
      to zda bylo z browseru hlasovano, zjistuju podle cookie, ktera se 
      sklada z retezce vote nasledovaneho id cislem clanku. v tomto pripade 
      tedy "vote279". pri odeslani hlasu tedy nastavim cookie vote279 na 
      hodnotu "voted"
    */
    
$cookie="vote".$_GET[id];
    
// uzivatel odeslal svuj hlas, ale z jeho browseru je to poprve
    
if($_POST[vote] AND $_COOKIE[$cookie]!="voted"){
      
// odeslu prohlizeci cookie
      
setcookie ($cookie"voted");
      
// a do databaze ulozim hals
      
$dotaz="UPDATE vote SET ";
      if(
$_POST[vote]==1){
        
$radek[stav01]++;
        
$dotaz.="stav01='".$radek[stav01]."'";
      }elseif(
$_POST[vote]==2){
        
$radek[stav02]++;
        
$dotaz.="stav02='".$radek[stav02]."'";
      }elseif(
$_POST[vote]==3){
        
$radek[stav03]++;
        
$dotaz.="stav03='".$radek[stav03]."'";
      }elseif(
$_POST[vote]==4){
        
$radek[stav04]++;
        
$dotaz.="stav04='".$radek[stav04]."'";
      }elseif(
$_POST[vote]==5){
        
$radek[stav05]++;
        
$dotaz.="stav05='".$radek[stav05]."'";
      }elseif(
$_POST[vote]==6){
        
$radek[stav06]++;
        
$dotaz.="stav06='".$radek[stav06]."'";
      }elseif(
$_POST[vote]==7){
        
$radek[stav07]++;
        
$dotaz.="stav07='".$radek[stav07]."'";
      }elseif(
$_POST[vote]==8){
        
$radek[stav08]++;
        
$dotaz.="stav08='".$radek[stav08]."'";
      }elseif(
$_POST[vote]==9){
        
$radek[stav09]++;
        
$dotaz.="stav09='".$radek[stav09]."'";
      }elseif(
$_POST[vote]==10){
        
$radek[stav10]++;
        
$dotaz.="stav10='".$radek[stav10]."'";
      }
      
$dotaz.=" WHERE id='".$_GET[id]."'";
      
$vysledek=MySQL_Query($dotaz);
    }
    
// uzivatel klikl na tlacitko [zobrazit vysledky] nebo se v minulosti z jeho prohlizece uz hlasovalo
    
if($_GET[vote]=="show" OR $_COOKIE[$cookie]=="voted"){
      
$PAGE[content].="<A NAME=\"vote\"></A><h3>výsledky hlasování</h3>\n";
      
$PAGE[content].="<TABLE BORDER=0>\n";
      
$PAGE[content].="<TR><TH COLSPAN=2>".$radek[dotaz]."</TH></TR>\n";
      
// z prohlizece jiz bylo hlasovano, vypisu tuto info uzivateli
      
if($_COOKIE[$cookie]=="voted"){
        
$PAGE[content].=
          
"<TR><TD COLSPAN=2>".
          
"(z tvého po&#232;íta&#232;e už bylo hlasováno)".
          
"<br /> </TD></TR>\n";
      }else{
        
$PAGE[content].="<TR><TD COLSPAN=2> </TD></TR>\n";
      }
      if(
$radek[text01]!=""){$PAGE[content].="<TR><TD>".$radek[text01].
        
"</TD><TD>".$radek[stav01]."</TD></TR>\n";}
      if(
$radek[text02]!=""){$PAGE[content].="<TR><TD>".$radek[text02].
        
"</TD><TD>".$radek[stav02]."</TD></TR>\n";}
      if(
$radek[text03]!=""){$PAGE[content].="<TR><TD>".$radek[text03].
        
"</TD><TD>".$radek[stav03]."</TD></TR>\n";}
      if(
$radek[text04]!=""){$PAGE[content].="<TR><TD>".$radek[text04].
        
"</TD><TD>".$radek[stav04]."</TD></TR>\n";}
      if(
$radek[text05]!=""){$PAGE[content].="<TR><TD>".$radek[text05].
        
"</TD><TD>".$radek[stav05]."</TD></TR>\n";}
      if(
$radek[text06]!=""){$PAGE[content].="<TR><TD>".$radek[text06].
        
"</TD><TD>".$radek[stav06]."</TD></TR>\n";}
      if(
$radek[text07]!=""){$PAGE[content].="<TR><TD>".$radek[text07].
        
"</TD><TD>".$radek[stav07]."</TD></TR>\n";}
      if(
$radek[text08]!=""){$PAGE[content].="<TR><TD>".$radek[text08].
        
"</TD><TD>".$radek[stav08]."</TD></TR>\n";}
      if(
$radek[text09]!=""){$PAGE[content].="<TR><TD>".$radek[text09].
        
"</TD><TD>".$radek[stav09]."</TD></TR>\n";}
      if(
$radek[text10]!=""){$PAGE[content].="<TR><TD>".$radek[text10].
        
"</TD><TD>".$radek[stav10]."</TD></TR>\n";}
      
$PAGE[content].="</TABLE>\n";
    }else{
      
// z prohlizece nebylo hlasovano a uzivatel neklikl na tlacitko [zobrazit vysledky]
      
$PAGE[content].="<h3>hlasování</h3>\n";
      
$PAGE[content].="<TABLE BORDER=0>\n";
      
$PAGE[content].="<TR><TH COLSPAN=3>".$radek[dotaz].
        
"<FORM ACTION=\".?id=".$_GET[id]."&vote=show#vote\" ".
          
"METHOD=\"POST\"></TH></TR>\n";
      
$PAGE[content].="<TD>\n";
      if(
$radek[text01]!=""){
        
$PAGE[content].="<input type=\"radio\" name=\"vote\" value=\"1\"> ".
        
$radek[text01]."<br />\n";
      }
      if(
$radek[text02]!=""){
        
$PAGE[content].=
          
"<input type=\"radio\" name=\"vote\" value=\"2\"> ".
          
$radek[text02]."<br />\n";
      }
      if(
$radek[text03]!=""){
        
$PAGE[content].=
          
"<input type=\"radio\" name=\"vote\" value=\"3\"> ".
          
$radek[text03]."<br />\n";
      }
      if(
$radek[text04]!=""){
        
$PAGE[content].=
          
"<input type=\"radio\" name=\"vote\" value=\"4\"> ".
          
$radek[text04]."<br />\n";
      }
      if(
$radek[text05]!=""){
        
$PAGE[content].=
          
"<input type=\"radio\" name=\"vote\" value=\"5\"> ".
          
$radek[text05]."<br />\n";
      }
      if(
$radek[text06]!=""){
        
$PAGE[content].=
          
"<input type=\"radio\" name=\"vote\" value=\"6\"> ".
          
$radek[text06]."<br />\n";
      }
      if(
$radek[text07]!=""){
        
$PAGE[content].=
          
"<input type=\"radio\" name=\"vote\" value=\"7\"> ".
          
$radek[text07]."<br />\n";
      }
      if(
$radek[text08]!=""){
        
$PAGE[content].=
          
"<input type=\"radio\" name=\"vote\" value=\"8\"> ".
          
$radek[text08]."<br />\n";
      }
      if(
$radek[text09]!=""){
        
$PAGE[content].=
          
"<input type=\"radio\" name=\"vote\" value=\"9\"> ".
          
$radek[text09]."<br />\n";
      }
      if(
$radek[text10]!=""){
        
$PAGE[content].=
          
"<input type=\"radio\" name=\"vote\" value=\"10\"> ".
          
$radek[text10]."<br />\n";
      }
      
$PAGE[content].="</TD><TD> </TD>\n";
      
$PAGE[content].="<TD VALIGN=BOTTOM>
        <INPUT TYPE=\"submit\" NAME=\"OK\" VALUE=\"hlasovat\"><br />\n"
;
      
$PAGE[content].="<br /><INPUT TYPE=\"button\" NAME=\"display\" ".
        
"VALUE=\"zobrazit výsledky\" OnClick=\"location='.?id=".$_GET[id].
        
"&vote=show#vote'\">\n";
      
$PAGE[content].="</FORM></TD>\n";
      
$PAGE[content].="</TR>\n";
      
$PAGE[content].="</TABLE>\n";
    }
  }
  
// pokud byl v databazi odpovidajici zaznam pro id clanku, je do promenne $PAGE[content], ktera obsahuje clanek pridano na konec clanku hlasovani. v pripade, ze odpovidajici zaznam v databazi neni, negeneruje  tento script zadny vystup a promenna $PAGE[content] zustava beze zmeny.
?>

vzhledem k tomu, že k ověření toho, zda už bylo z určitého počítače hlasováno, používám cookie, je vcelku snadné hlasování zmanipulovat. myslím si, že o nic nejde a tudíž to nikomu nebude stát za to a kdyby třeba jo, tak holt bude hlasování zmanipulované :-) šlo by to udělat třeba i podle ip adresy, ale tam by zase byl problém s uživateli, kteří nemaji svou veřejnou ip, takže jsem nakonec zvolil cookie.

pokud si chceš mé hlasovátko vyzkoušet, můžeš tady: hlasování: co tě sem přivedlo