Autor | Zpráva | ||
---|---|---|---|
Ota Profil * |
Zdravím, mám jednoduchou anketu v php, ktera je omezená v hlasovaní IP adresou. Po přičtení hlasu se ip zapíše do databáze a další hlasy uz nebudou započítány.
Chtěl bych to upravit tak aby to bylo omezené na ip adresu ale třeba na hodinu. Takže do tabulky, ktera obsahuje IP, HLAS jsem dopsal ještě CAS po přičtení hlasu to vypadá takhle v mysql: ip 192.168.1.1 hlas: 1 cas: 1298708827 No a má otázka je.. Jak udělám ověření, že uz může zase uživatel hlasovat po určité době? Dík moc za odpovědi. Tady je script ANKETA.PHP <?php include "config.php"; $ip = $_SERVER['REMOTE_ADDR']; $hlas = $_GET['hlas']; $cas = time(); $cas = $cas + 600; $vlozit = "SELECT ip FROM anketa WHERE ip = '$ip'"; $vysledky = mysql_query ($vlozit) or die (mysql_error()); $vraci = mysql_num_rows($vysledky); if ($vraci == 0) { $vlozit = "INSERT INTO anketa (ip, hlas, cas)" . "VALUES ('$ip', '$hlas', '$cas')"; mysql_query ($vlozit) or die (mysql_error()); } header("Location: index.php"); ?> INDEX.PHP <?php include "config.php"; $vlozit = "SELECT * FROM anketa"; $vysledky = mysql_query ($vlozit) or die (mysql_error()); $celkem = mysql_num_rows($vysledky); $vlozit = "SELECT * FROM anketa WHERE hlas = 1"; $vysledky = mysql_query ($vlozit) or die (mysql_error()); $hlas1 = mysql_num_rows($vysledky); $vysledek1 = $hlas1/$celkem*100; $vlozit = "SELECT * FROM anketa WHERE hlas = 2"; $vysledky = mysql_query ($vlozit) or die (mysql_error()); $hlas2 = mysql_num_rows($vysledky); $vysledek2 = $hlas2/$celkem*100; $ip = $_SERVER['REMOTE_ADDR']; $vlozit = "SELECT ip FROM anketa WHERE ip = '$ip'"; $vysledky = mysql_query ($vlozit) or die (mysql_error()); $vraci = mysql_num_rows($vysledky); ?> <div class="anketa"> <small>Kolik vám je let??</small><br /> <small> <?php if ($vraci == 0 ) echo "<a href='anketa.php?hlas=1'>"; ?>1 Odpověď<?php if ($vypis == 0 ) echo "</a>"; ?> </small> <div class="anketaobal"><div class="polozka" style="width:<?php echo $vysledek1; ?>%;"> </div></div> <small> <?php if ($vraci == 0 ) echo "<a href='anketa.php?hlas=2'>"; ?>2 Odpověď<?php if ($vypis == 0 ) echo "</a>"; ?> </small> <div class="anketaobal"><div class="polozka" style="width:<?php echo $vysledek2; ?>%;"> </div></div> </div> |
||
pcmanik Profil |
#2 · Zasláno: 26. 2. 2011, 13:05:21 · Upravil/a: pcmanik
Selectnes si cas pre danu ip, a ten odpocitas od aktualneho casu, vyde ti urcity rozdiel, ten porovnas zo svojou hodnotou, povedzme 1 den, a podmienku si uz potom zostrojis, a to: Ak to uz preslo moze hlasovat, ak nie tak nemoze.
Namiesto num_rows pouzivaj COUNT(*) a urcite nepotrebujes vyberat vsetky stlpce z tabulky. SELECT * FROM anketa WHERE hlas = 2 a $vlozit = "SELECT * FROM anketa WHERE hlas = 1 mozes spojit dokopy ako $vlozit = "SELECT * FROM anketa WHERE hlas = 1 AND hlas = 2 Daj si do google php real ip adress alebo nieco podobne, REMOTE_ADDR nieje moc spolahlive. |
||
Ota Profil * |
#3 · Zasláno: 26. 2. 2011, 14:05:14
Ten prvni soubor jsem upravil dle tveho postupu a funguje. S tim druhym souborem mam trosku problem.
Priklad: Poprve zahlasuju... 600 sekund nemuzu hlasovat.... super funguje.... po 600s se mi to znova zaktivni zahlasuju a ted nastava problem.. Bere mi to prvni CASovou hodnotu u ip, takze uz muzu hlasovat kolikrat chci. Omezeni je fuc. Jak vypsat jen ten nejvyssi zaznam s casem u dane ip a ne ten ktery uz davno vyprsel? $ip = $_SERVER['REMOTE_ADDR']; $hlas = $_GET['hlas']; $cas = time(); $cas = $cas + 600; $vlozit = "SELECT ip FROM anketa WHERE ip = '$ip'"; $vlozit = "SELECT cas FROM anketa WHERE ip = '$ip'"; $vysledky = mysql_query ($vlozit) or die (mysql_error()); $vraci = mysql_num_rows($vysledky); while ($zaznam = MySQL_Fetch_Array($vysledky)){ $cas=$zaznam["cas"]; } $rozdil = $cas - time(); // nemuze hlasovat if ($rozdil > 0){ $odkazy = 1; } // muze hlasovat if ($rozdil < 0){ $odkazy = 0; } if ($odkazy == 0) { $vlozit = "INSERT INTO anketa (ip, hlas, cas)" . "VALUES ('$ip', '$hlas', '$cas')"; mysql_query ($vlozit) or die (mysql_error()); } header("Location: index.php"); |
||
Ota Profil * |
#4 · Zasláno: 26. 2. 2011, 14:11:53
Jeste priklad pro upresneni z MYSQL
ID IP HLAS CAS 1 x.x.x.x 1 1298724700 1 x.x.x.x 1 1298725300 Prvni hlasovani funguje, a pri znovu zaktivneni odkazu to zahlasuje, zapise hodnoty, ale bere to jen ten prvni casovej zaznam kterej uz je davno odectenej, to znamena ze muzu hlasovat do nekonecna.. Jak tohle osetrit? Jde nejak vypsat jen ten nejvyzsi zaznam z databaze podle ip? |
||
pcmanik Profil |
#5 · Zasláno: 26. 2. 2011, 14:16:36 · Upravil/a: pcmanik
SELECT MAX(cas) FROM anketa WHERE ip = x.x.x.x Tym ziskas posledny cas, s tym by si sa uz mal pohnut $cas - time(); A pozor, navzajom si prepisujes premennu cas, s casom z db. |
||
pcmanik Profil |
#6 · Zasláno: 26. 2. 2011, 14:21:30 · Upravil/a: pcmanik
Skusil by som to nejak takto
$ip = $_SERVER['REMOTE_ADDR']; $hlas = $_GET['hlas']; $cas = time(); $vysledok = mysql_query ("SELECT MAX(cas) AS cas FROM anketa WHERE ip = '$ip'") or die (mysql_error()); $zaznam = MySQL_Fetch_Array($vysledok); $cas_db = $zaznam["cas"]; // ak neziskame ziadny cas, este nehlasoval ani raz if($cas_db == "") $odkazy = 0; else $rozdil = time() - $cas_db; // nemuze hlasovat if ($rozdil > 0) $odkazy = 1; // muze hlasovat if ($rozdil < 0) $odkazy = 0; if ($odkazy == 0) { mysql_query ("INSERT INTO anketa (ip, hlas, cas) VALUES ('$ip', '$hlas', '$cas')") or die (mysql_error()); } header("Location: index.php"); |
||
Ota Profil * |
#7 · Zasláno: 26. 2. 2011, 14:25:07
Zkousel jsem ale ted mi to do db nezapisuje cas
|
||
pcmanik Profil |
#8 · Zasláno: 26. 2. 2011, 14:30:08
Jaj prepac, omylom som zmazal jednu premennu, skus teraz, aktualizoval som to.
|
||
Ota Profil * |
#9 · Zasláno: 26. 2. 2011, 14:36:07
do db to vlozi ip, hlas, cas ale nemelo by tam byt jeste $cas = time() + 10; misto $cas = time();
|
||
pcmanik Profil |
#10 · Zasláno: 26. 2. 2011, 14:37:48
Ota:
preco + 10? Mas na to nejaky dovod? |
||
Ota Profil * |
#11 · Zasláno: 26. 2. 2011, 14:41:59
No zamyslel jsem to tak, ze uzivatel bude mit moznost treba po minute, hodine znova hlasovat.
Proto jsem myslel, ze to udelame zpusobem "aktualni_cas + minuta" tu potom porovname s aktualnim casem a podle toho zobrazime vysledek jestli muze nebo nemuzu hlasovat |
||
pcmanik Profil |
#12 · Zasláno: 26. 2. 2011, 14:43:18
Ota:
To uz je na tebe, vies ako na to, ja teraz musim ist prec a pridem az vecer. |
||
Alphard_ Profil * |
#13 · Zasláno: 26. 2. 2011, 15:19:02
Pat a Mat vyrábí anketu :-)
V původním kódu by stačilo doplnit where podmínku. $vlozit = "SELECT ip FROM anketa WHERE ip = '$ip' and cas > $time"; |
||
Ota Profil * |
#14 · Zasláno: 26. 2. 2011, 15:24:55
S php zacinam:) Ctu, hledam, zkousim, ale obcas se bez pomoci neobejdu... Nakonec jsem to vyresil takto...
<?php include "config.php"; $ip = $_SERVER['REMOTE_ADDR']; $hlas = $_GET['hlas']; $cas = time() + 30; $vysledok = mysql_query ("SELECT MAX(cas) AS cas FROM anketa WHERE ip = '$ip'") or die (mysql_error()); $zaznam = MySQL_Fetch_Array($vysledok); $cas_db = $zaznam["cas"]; if($cas_db == "") $odkazy = 0; else $rozdil = $cas_db - time(); if ($rozdil > 0) $zapis = 1; if ($rozdil < 0) $zapis = 0; if ($zapis == 0) { mysql_query ("INSERT INTO anketa (ip, hlas, cas) VALUES ('$ip', '$hlas', '$cas')") or die (mysql_error()); } header("Location: index.php"); ?> |
||
Ota Profil * |
#15 · Zasláno: 26. 2. 2011, 15:33:07
Jeste posledni otazka:) Jak INDEX.PHP efektivne zkratit?:) Ted to funguje jak ma, ale kdyz sem v tom zase zacnu vrtat, tak udelam vic skody nez uzitku:)) Diky:)
<?php include "config.php"; $vlozit = "SELECT * FROM anketa"; $vysledky = mysql_query ($vlozit) or die (mysql_error()); $celkem = mysql_num_rows($vysledky); $vlozit = "SELECT * FROM anketa WHERE hlas = 1"; $vysledky = mysql_query ($vlozit) or die (mysql_error()); $hlas1 = mysql_num_rows($vysledky); $vysledek1 = $hlas1/$celkem*100; $vlozit = "SELECT * FROM anketa WHERE hlas = 2"; $vysledky = mysql_query ($vlozit) or die (mysql_error()); $hlas2 = mysql_num_rows($vysledky); $vysledek2 = $hlas2/$celkem*100; $vlozit = "SELECT * FROM anketa WHERE hlas = 3"; $vysledky = mysql_query ($vlozit) or die (mysql_error()); $hlas3 = mysql_num_rows($vysledky); $vysledek3 = $hlas3/$celkem*100; $ip = $_SERVER['REMOTE_ADDR']; $vysledok = mysql_query ("SELECT MAX(cas) AS cas FROM anketa WHERE ip = '$ip'") or die (mysql_error()); $zaznam = MySQL_Fetch_Array($vysledok); $cas_db = $zaznam["cas"]; $rozdil = $cas_db - time(); if ($rozdil > 0) $odkazy = 1; if ($rozdil < 0) $odkazy = 0; $vysledek1_zaokrouhleni = round($vysledek1, 2); $vysledek2_zaokrouhleni = round($vysledek2, 2); $vysledek3_zaokrouhleni = round($vysledek3, 2); $celkem_hlasu = $hlas2 + $hlas1 + $hlas3; ?> <style type="text/css" media="screen"> .anketaobal { width: 200px; text-align: left; } .anketaobal .polozka { height: 7px; background-color: #97ADC7; text-align: left; margin-bottom: 5px; } .anketa small { text-align: left; font-size: 80%; } .anketa { background-color: #E1EEF6; width: 200px; margin-left: 50px; padding: 10px; } </style> <div class="anketa"> <small>Otazka?</small><br /> <small> <?php if ($odkazy == 0 ) echo "<a href='anketa.php?hlas=1'>"; ?>Odpoved 1<?php if ($vypis == 0 ) echo " ($vysledek1_zaokrouhleni%)</a>"; ?> </small> <div class="anketaobal"><div class="polozka" style="width:<?php echo $vysledek1; ?>%;"> </div></div> <small> <?php if ($odkazy == 0 ) echo "<a href='anketa.php?hlas=2'>"; ?>Odpoved 2<?php if ($vypis == 0 ) echo " ($vysledek2_zaokrouhleni%)</a>"; ?> </small> <div class="anketaobal"><div class="polozka" style="width:<?php echo $vysledek2; ?>%;"> </div></div> <small> <?php if ($odkazy == 0 ) echo "<a href='anketa.php?hlas=3'>"; ?>Odpoved 3<?php echo "($vysledek3_zaokrouhleni%)"; if ($odkazy == 0 ) echo "</a>"; ?> </small> <div class="anketaobal"><div class="polozka" style="width:<?php echo $vysledek3; ?>%;"> </div></div> Počet hlasů celkem: <?php echo "$celkem_hlasu"; ?> </div> |
||
pcmanik Profil |
#16 · Zasláno: 26. 2. 2011, 21:26:09
Namiesto num_rows pouzivaj COUNT(*).
Namiesto ukladania sql dotazov do vlastnych premennych ich davaj rovno do mysql_query. CSS daj do externeho suboru. |
||
Časová prodleva: 14 let
|
0