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èítaè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