Anketa v PHP a MySQL

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.

Návrh databázy

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)
);

Aplikácia

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&amp;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();
?>

Záver

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.

19.10.2005 17:55

PaBi3

Programovanie