Hlasovanie ankiet je vo väčšine prípadoch kontrolované cez cookies čo nieje práve najlepšie riešenie. Hlasovanie v ankete, ktoré je popisované v článku bude kontrolované prostredníctvom IP adresy. Momentálne je to asi najefektívnejšia ochrana proti opakovanému hlasovaniu.
Anketa sa bude skladať z troch tabuliek. Prvou časťou bude otázka čo bude označovať aj poradie aktívnej ankety. Ďalej nasleduje tabulka kde sa budú ukladať odpovede k otázke. Tieto dve tabuľky nám zabezpečia aby anketa mohla mať 1 odpoveď alebo 1000 odpovedí. Posledná tabuľka bude pomerne jednoduchá a budú sa do nej ukladať IP adresy hlasujúcich. IP adresa sa bude ukladať do databázy ako primárny kľúč.
CREATE TABLE ip ( ip CHAR(15) NOT NULL, PRIMARY KEY (ip) ); CREATE TABLE otazka ( id MEDIUMINT(8) unsigned NOT NULL auto_increment, otazka VARCHAR(150) NOT NULL, PRIMARY KEY (id) ); CREATE TABLE odpoved ( id MEDIUMINT(8) unsigned NOT NULL auto_increment, odpoved VARCHAR(150) NOT NULL, k_otazke MEDIUMINT(8) NOT NULL, pocet INT(15) NOT NULL, PRIMARY KEY (id) );
Zdrojový kód ankety nebude taký zložitý ako sa môže zdať. Všetko je to vlastne iba o podmienkach a pripojení do databázy. Všetok obsah zdrojových kódov si môžete prezrieť a zistíte, že žiadne nové funkcie ani syntax neobsahuje.
<?php #index.php
header('Content-Type:text/html; charset=iso-8859-2');
$dbc = @mysql_connect('localhost','login','heslo') or die('Pripojenie do databázy zlyhalo!');
$dbs = @mysql_select_db('databaza') or die('Nebola nájdená požadovaná databáza!');
$anketa = 1; // ID aktívnej ankety
/*****************************************************************************/
if(!isset($_GET['anketa'])){
$sql = mysql_query("SELECT id,otazka FROM otazka WHERE id='$anketa' LIMIT 1");
$zaznam = mysql_fetch_object($sql);
$anketa = $zaznam->id;
$otazka = $zaznam->otazka;
if(mysql_num_rows($sql) == NULL){
echo "<p>Požadovaná anketa nie je aktivovaná!</p>n";
} else {
echo "<p>$otazka</p>n<hr />n";
$sql = mysql_query("SELECT id,odpoved,pocet FROM odpoved WHERE k_otazke='$anketa'");
if(mysql_num_rows($sql) == NULL){
echo "<p>K tejto ankete zatiaľ neboli pridané žiadne odpovede!</p>n";
} else {
while($zaznam = mysql_fetch_object($sql)){
$id = $zaznam->id;
$odpoved = $zaznam->odpoved;
$pocet = $zaznam->pocet;
echo "[$pocet] <a href='?anketa=$anketa&odpoved=$id' title='$odpoved'>$odpoved</a><br />n";
echo "<img src='http://www.pabi3.com/layout/images/line.gif' alt='$odpoved' width='".ceil($pocet)."%' height='10' /><br />n";
$celkovo = $celkovo+$pocet;
}
echo "<p>Celkový počet hlasov je <strong>$celkovo</strong></p>n";
}
}
} elseif(isset($_GET['anketa'])){
if($_GET['anketa'] == $anketa){
if($_GET['odpoved'] == is_numeric($_GET['odpoved'])){
$sql = mysql_query("SELECT id FROM otazka WHERE id='$anketa' LIMIT 1");
if(mysql_num_rows($sql) == NULL){
echo "<p>Požadovaná anketa nieje aktívna!</p>n";
} else {
$sql = mysql_query("SELECT id FROM odpoved WHERE k_otazke='$anketa' AND id='{$_GET['odpoved']}'");}
if(mysql_num_rows($sql) == NULL){
echo "<p>Nastala chyba pri odosielaní odpovede!</p>n";
echo "<p><a href='index.php' title='Späť k ankete'>Späť k ankete</a></p>n";
} else {
$sql = mysql_query("INSERT INTO ip(ip) VALUES('{$_SERVER['REMOTE_ADDR']}')");
if(!$sql){
echo "<p>Je možné hlasovať iba 1x!</p>n";
} else {
$sql = mysql_query("SELECT pocet FROM odpoved WHERE k_otazke='$anketa' AND id='{$_GET['odpoved']}' LIMIT 1");
$pocet = mysql_fetch_object($sql);
$pocet = $pocet->pocet+1;
$sql = mysql_query("UPDATE odpoved SET pocet='$pocet' WHERE k_otazke='$anketa' AND id='{$_GET['odpoved']}' LIMIT 1");
if($sql){
echo "<p>Váš hlas bol úspešne pripočítaný!</p>n";
} else {
echo "<p>Nastala chyba pri odosielaní odpovede!</p>n";
}
echo "<p><a href='index.php' title='Späť k ankete'>Späť k ankete</a></p>n";
}
}
}
} else {
echo "<p>Požadovaná odpoveď neexistuje!!</p>n";
}
} else {
echo "<p>Požadovaná anketa nieje aktívna!</p>n";
}
/******************************************************************************/
@mysql_free_result($sql);
@mysql_close();
?>
Zdrojové kódy ankety si môžete stiahnuť na tejto adrese. Ešte upozorním, že premenná $anketa na vrchu stránky má hodnotu aktívnej ID ankety, resp. je zhodná s ID číslom otázky uloženej v tabuľke otazka.