Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  6 455
Jeg har laget et lite vote-script som funker strålende.. Eneste tingen, er at alle kunne "spamme" vote'n pga ikkeno "sikkerhet"..
Jeg driver nå og jobber med et script som registrerer ip'n til den som vote'r, lagrer ip'n i en database, slik at hver gang noen skal vote, sjekker siden gjennom databasen om ip-adressen til vedkommende er registrert, og hvis det er mindre enn 1 dag (nøyaktig 24 timer) siden det ble sist vote'a fra den ip'n, kan man ikke vote, men hvis der er lengre enn 24 timer sist man vote'a, får man lov til å vote igjen, og datoen og tidspunktet blir oppdatert når man vote'r på nytt så man er nødt til å vente enda 24 timer..
Alt dette har funket helt fint, utenom at det er en hake:

Hvis databasen er tom, altså ingen ip'r registrert, vil siden legge til ip'n i databasen, og vedkommende får beskjed om at han/hun kan kun stemme 1 gang per 24 timer hvis han/hun prøver å stemme igjen like etter. Dette funker helt fint..
MEN, når den skal registrere flere ip'r, går den rett til å si at man kan kun stemme 1 gang per 24 timer osv osv.. Jeg skjønner ikke hva som kan være problemet, og koden er som følger (PS: $date og $time er extracta kolonner fra mysql-databasen):

Kode

$ip_addr = $_SERVER['REMOTE_ADDR'];

$query = "SELECT * FROM vote_ip";
$result = mysql_query($query);

if (!mysql_query("SELECT * FROM vote_ip WHERE ip = '$ip_addr'") || mysql_num_rows($result) == 0)
{
	mysql_query("INSERT INTO vote_ip (ip,date,time) VALUES ('$ip_addr',CURRENT_DATE,NOW())");
    echo "Takk for din stemme!<br>";
} else {
    while ($ip_check = mysql_fetch_assoc($result))
	{
		extract($ip_check);
        if (mysql_query("SELECT * FROM vote_ip WHERE ip = '$ip_addr' AND CURRENT_DATE < DATE_ADD('$date', INTERVAL 1 DAY) AND time = '$time'")) {
            echo "Det har allerede blitt stemt fra denne IP-adressen: ". $ip_addr ."<br>";
            echo "Du kan kun stemme én gang per 24 timer!<br>";
        } else {
            mysql_query("UPDATE vote_ip SET date=CURRENT_DATE, time=NOW() WHERE ip='$ip_addr'");
            echo "Takk for din stemme!<br>";
        }
    }
}
På forhånd takk for svar!
Sist endret av HaZnO; 7. november 2004 kl. 00:04.
Feilen ligger her:

if (!mysql_query("SELECT * FROM vote_ip WHERE ip = '$ip_addr'") || mysql_num_rows($result) == 0)


det du setter som betingelser for at voten skal "gå igjennom" er enten at det ikke finnes noen entries i tabellen, eller at den andre querien "feiler", altså at noe går galt med å spørre sql serveren. Dette er ikke det samme som at den ikke finner noen matchende entries. Det samme gjelder forsåvidt resten av koden din også. Du må eksplisit sjekke resultatet av queriene. Du kan mysql_query returnerer true når den klarer å spørre serveren og flase hvis noe går galt. Hva den returnerer er _ikke_ avhengig av sql serverens svar.
Hm.. Tenkte meg at feilen lå der, ja.. Tror jeg bytter ut med:

if (!mysql_query("SELECT * FROM vote_ip WHERE MATCH (ip) AGAIN ('$ip_addr')") || mysql_num_rows($result) == 0)
Sist endret av HaZnO; 7. november 2004 kl. 00:40.
tror ikke du forstår problemet. Feilen ligger ikke i sql'en din, men i bruken av funksjonen mysql_query i en if setning. Les på http://no2.php.net/mysql_query.


Hvis du gir mer et par minutt skal jeg foreslå noe annet.
Urk, sorry, litt sløv her nå, men tror jeg ser det nå..
Gimme a sec
Derja, funka som faen nå
Takk for at du vekte meg opp, salve, hehe
ehm, ikke helt edru her, og natta begynner å komme, men sånn rent fra toppen av hodet:

Kode

$ip_addr = $_SERVER['REMOTE_ADDR'];

$result = mysql_query("SELECT * FROM vote_ip WHERE ip = '$ip_addr' AND CURRENT_DATE < DATE_ADD(date, INTERVAL 1 DAY)");

if ( mysql_num_rows($result) > 0 ) // Denne ip'en har stem innen de siste 24 timene.
{

		echo "Det har allerede blitt stemt fra denne IP-adressen: ". $ip_addr ."<br>";
		echo "Du kan kun stemme én gang per 24 timer!<br>";

} 

else 
{ // IP'en finnes ikke i tabellen, eller det har gått mer enn 24 timer siden den stemte.

	// Rens opp i db.
  mysql_query("DELETE FROM vote_ip WHERE CURRENT_DATE > DATE_ADD(date, INTERVAL 1 DAY)");

	// Legg inn ny entry
	mysql_query("INSERT INTO vote_ip (ip,date,time) VALUES ('$ip_addr',CURRENT_DATE,NOW())");
 	echo "Takk for din stemme!<br>";
	
}

Problemet her tror jeg er med bruk av date vs. time. Jeg husker ikke hvordan dat og time funksjonene i mySQL fungerer, denne koden bruker rett og slett ikke time. Det vil kunne ha noen "rare" effekter. Uansett er det mye rart med den koden du postet som vil by på rare problemer. Tviler på at min kode "kjører" sånn i på første forsøk, men det er bare en idee til noe du kan prøve.

Angrer sikker på dette i morgen