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; ?>%;">&nbsp;</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; ?>%;">&nbsp</div></div>
</div>
pcmanik
Profil
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 *
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 *
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
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();
mas naopak, teda vzdy dostanes zapornu hodnotu.

A pozor, navzajom si prepisujes premennu cas, s casom z db.
pcmanik
Profil
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 *
Zkousel jsem ale ted mi to do db nezapisuje cas
pcmanik
Profil
Jaj prepac, omylom som zmazal jednu premennu, skus teraz, aktualizoval som to.
Ota
Profil *
do db to vlozi ip, hlas, cas ale nemelo by tam byt jeste $cas = time() + 10; misto $cas = time();
pcmanik
Profil
Ota:
preco + 10? Mas na to nejaky dovod?
Ota
Profil *
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
Ota:
To uz je na tebe, vies ako na to, ja teraz musim ist prec a pridem az vecer.
Alphard_
Profil *
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 *
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 *
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; ?>%;">&nbsp;</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; ?>%;">&nbsp</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; ?>%;">&nbsp</div></div>

Počet hlasů celkem: <?php echo "$celkem_hlasu"; ?>

</div>
pcmanik
Profil
Namiesto num_rows pouzivaj COUNT(*).
Namiesto ukladania sql dotazov do vlastnych premennych ich davaj rovno do mysql_query.
CSS daj do externeho suboru.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0