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.

Alternatívne verzie: Text PDF Voice
Autor: PaBi3 · Kategória: Programovanie · Dátum: 19.10.2005 17:55

Komentáre

#1 peto
25.01.2006 17:41
[question][question]http://www.pabi3.com/layout/images/line.gif
chyba OBRAZOK

#2 admin Web E-mail
25.01.2006 20:48
admin Je to obrázok zo starého CMS, kde bol iný layout aj CSS.

#3 peto
26.01.2006 16:07
a mohol by som ta poprosit aby si ho dal na ftp a dal mi potom link [shy] inac tieto stranky su super len tak dalej...[shades]

#4 admin Web E-mail
26.01.2006 19:00
admin Obrázok je jednoduchý. Môžeš si ho vytvoriť aj sám. Má rozmery 1x10 [wink].

#5 peto Web E-mail
26.01.2006 20:30
jj uz to mam [tongue]

#6 janko hrasko
28.01.2006 16:12
mi to nejak nefunguje
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in C:www2anketa.php on line 13

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:www2anketa.php on line 17

Požadovaná anketa nieje aktivovaná!

zmenil som len :('localhost','login','heslo')

#7 janko hrasko
28.01.2006 16:13
aj toto:@mysql_select_db('databaza')

inak nic. v com je problem?

#8 admin Web E-mail
29.01.2006 22:49
admin A už si si aj nejakú anketu do tých tabuliek vložil?

#9 adko.s E-mail
13.03.2006 18:08
Zsravim..so uplny zaciatocnik v PHP a MySQL..stiahol som si odtialto zdrojaky ku ANKETA v PHP a MySQL...ale ked spustim,stale mi vypisuje, ze PRIPOJENIE K DATABAZE ZLYHALO! chcem sa spytat PRECO ??? dakujem za skoru odpoved

#10 admin Web E-mail
14.03.2006 17:12
admin Skontroluj si či máš nastavené správne pripojenie do databázy. Nájdeš to úplne hore vo funkciách mysql_connect a mysql_select_db.

#11 fipo Web E-mail
19.03.2006 18:36
stiahol som si zdrojak.....vlozil priklady na ankety ....a tie mi isli. Ale ked som si vyrobil vlastnu anketu tak mi stale vipisuje ze uz som hlasoval a pritom som hlasovaj iba na tej predchadzajucej.....
ip adresa z ktorej bolo odhlasovane je pouzita pre vsetki ankety..... aj pre tie z ktorich nebolo odhlasovane. Dakujem [shades]

#12 Skvrko
10.05.2006 15:28
Ahoj, ked som si dal na stranku anketu napisalo mi toto:
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /home/free/kx.cz/v/valka/root/www/index.php on line 13

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/free/kx.cz/v/valka/root/www/index.php on line 17

Požadovaná anketa nieje aktivovaná!

Ale zmenil som len tieto udaje:
$dbc = @mysql_connect('mysql.kx.cz','kx_valka','sturmo6v') or die('Pripojenie do databázy zlyhalo!');
$dbs = @mysql_select_db('kx_valka') or die('Nebola nájdená po¾adovaná databáza!');


[question][question]

#13 admin Web E-mail
11.05.2006 07:10
admin Pravdepodobne ste nesprávne nastavili pripojenie do databázy.
http://www.ic.cz/faq.php

#14 Pao E-mail
02.07.2006 16:54
robil som to podla navodu a napisalo mi toto Požadovaná anketa nieje aktivovaná! nevies kde je chyba ??? ak j tak mi napis pls na email dik[question]

#15 Pavel
13.09.2006 18:06
Ahoj, oprava, chybí Vám středník u CREATE TABLE ip
oprava: CREATE TABLE ip (
ip CHAR(15) NOT NULL,
PRIMARY KEY (ip)
);

#16 Pavel
07.11.2006 12:07
Ahoj, anketa je moc pěkná, ale potřeboval bych poradit s tím, že když na stránky vložím 2 ankety, první s ID=1 a druhou s ID=2 tak je vše ok až na to, že mi to sečítá všechny hlasy, takže když u první ankety mám celkem 20 (20 hlasujících) a u druhé jich hlasovalo 10, tak celkem mi to píše 30 hlasujících, neví někdo co stím, PLS [wink]

#17 Blackdevil E-mail
25.04.2007 20:59
no tut velmy dobry, aspon podla mojho nazoru...len mam taky problem ze ked vsetko nastavim a dam to na web tak mi to vkuse pise : Nebola nájdená požadovaná databáza! a nechapem ze z akeho dovodu...vsetko mam dobre vyplnene ...poradte mi niekto pls...

#18 Northon Web
08.09.2007 21:47
[17] Blackdevil, mám úplně stejný problém jako moc díky za ten script , ale kdyby sem autor hodil tutoriál jak vše přesně nastavit a co kam dat nemusel by pořád odpovídat na ty dotěrný otázky...sám to znám pořád někomu něco vysvětlovat... moc zabavný to není no ale co poradíte mi někdo???? chyba : Nebola nájdená požadovaná databáza! opsal sem přesný název databáze ( určitě je správně používám jí totiž pro phpbb systém - má to nějaký vliv ? ) předem dík za odpověd

#19 admin Web E-mail
09.09.2007 14:09
admin [18] Northon, najprv je tú databázu nutné aj vytvoriť. Prečo sa radšej nepozrieť aj do dokumentácie PHP? Funkcie mysql_connect() a mysql_select_db() je nutné použiť, pokiaľ sa chcete pripojiť k MySQL.

Určite máte zle nastavené parametre týchto dvoch funkcií resp. máte zle nastavené pripojenie do databázy. Je to najbežnejší problém, na ktorý sa pýta 90% ľudí.

#20 Blackdevil E-mail
02.11.2007 23:20
no ked som mal ten problem tak to som bol v php zaciatocnik a nevedel som ze treba vytvorit v databaze tabulku...cize problem bol v tom ze ja som si nastavil parametre do databazi spravne len v databaze neboli vytvorene vyzadovane tabulky aby sa dala rozchodit anketa...takze sa ospravedlnujem za komentar...bola to moja chyba

#21 dj-jakub3 Web E-mail
05.11.2008 15:29
Môže mi prosim niekto poradiť ako pridam druhú odpoveď v ankete?

#22 tomas4578 Web E-mail
20.06.2009 17:56
Môžete mi poradiť ako vymazať predchádzajúcu anketu? Ako zmením písmo v ankete ako farbu a typ písma? a prosím aj nejaký príklad ak by sa dalo, aby som vedel kde to umiestniť.

#23 Kakoo Web E-mail
27.07.2010 17:18
Skvelá anketa! Bravó a tlieskam. Fakt sa podarila. Ide to bombovo

#24 danusa E-mail
09.01.2011 16:48
Ahoj,som začiatočníčka s php,respektíve robím to do školy a vložila som si anketu,ktorá mi funguje,ale len keď sa otvorí ako nové okno,pokiaľ použijem tento príkaz:
<a target="bottom" href='anketa.php?page=anketa'>Anketa </a>
,nefunguje to.
Čo je zle?

Osobné údaje
Captcha
Odpíšte text z obrázku. Rozlišujú sa malé a veľké písmená.
Obsah
Možnosti