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 v PHP a MySQL
Anketa v PHP a MySQL
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&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.


![Hlasová verzia [Pre internetový prehliadač Opera] Voice](modules/items/voice.png)
Komentáre
chyba OBRAZOK
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')
inak nic. v com je problem?
ip adresa z ktorej bolo odhlasovane je pouzita pre vsetki ankety..... aj pre tie z ktorich nebolo odhlasovane. Dakujem [shades]
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]
http://www.ic.cz/faq.php
oprava: CREATE TABLE ip (
ip CHAR(15) NOT NULL,
PRIMARY KEY (ip)
);
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í.
<a target="bottom" href='anketa.php?page=anketa'>Anketa </a>
,nefunguje to.
Čo je zle?