Na raten niet meer kunnen raten
Ik heb pagina waar je kan raten. Het is een thumbs up/thumbs down rate systeem net als youtube. Als je op één van de twee geklikt hebt ga je naar rate.php. Die ziet of je op de thumbs up en thumbs down hebt geklikt. Nu kan je dus heel makkelijk op vorige drukken in je browser om zo weer te raten. Nu wil ik graag een tijdslimiet instellen zodra je op één van de twee geklikt hebt, zodat je daarna een uur lang niet meer kan stemmen.
Het raten gaat trouwens over zinnen. Dus elke zin heeft een unieke ID. Het verwijzen naar rate.php gaat via form action.
Groeten, Tim
Dit kan je op meerdere manieren oplossen.
Je zou bijvoorbeeld in rate.php een cookie aan kunnen maken die een uur geldig is, met daarin de unieke id van de zin. Op de pagina met de duimpjes check je vervolgens of isset($_COOKIE['unieke_id']). Zo ja, dan kan er niet gestemd worden op deze zin.
Ook zou je de ID in combinatie met een IP adres op kunnen slaan in een tabel in een database, met daarbij de huidige tijd "time();". Ook dit doe je in rate.php. Nu kan je aan de voorkant weer afvangen of er een rij bestaat in de database met die id, ip en een tijd die groter is dan een uur geleden. In rate.php kan je tijdens het stemmen gelijk alle rijen die ouder zijn dan een uur kunnen verwijderen.
Gewijzigd op 21/06/2011 16:18:18 door Bas Matthee
Toevoeging op 21/06/2011 16:19:53:
@Bas Op IP controleren is nutteloos. Er kunnen meerdere personen achter 1 IP adres zitten.
De personen die kunnen raten zijn gewoon personen die de website kunnen bezoeken. Ik heb ook een pagina waar ze kunnen inzenden. Daarvoor moeten gebruikers wel registreren en kunnen ze pas een zin insturen zodra ze ingelogd zijn
Cookies zijn een mogelijkheid maar die kun je aanpassen / verwijderen.
Sessions kun je niet aanpassen maar verlopen zodra je de browser sluit.
Via IP controleren is ook nutteloos zoals ik al zei. En het kan ook nog eens omzeilt worden.
Hoe stel ik dat in?
setcookie("rateCookie",$zinID, time()+3600); zoiets?
registreren is de beste manier om het te doen, anders zou ik voor ip gaan
Gewijzigd op 21/06/2011 16:40:22 door - Mark -
Ik ben inderdaad beginnend PHP'er.
@Mark je zegt ja net dat SESSIONS verlopen zodra je de browser sluit. Dus dan kunnen bezoekers weer raten zodra ze weer opnieuw op de website komen?
session gegevens staan op je server, cookies staan op de computer van de gebruiker.
@Tim stel dat je met cookies gaat werken en ik doe een thumbs up. En daarna ga ik naar mijn browserinstellingen en ik verwijder de cookies dan kan ik daarna weer gelijk stemmen.
Same voor sessions, same voor IP. Allen te omzeilen.
ik heb in het verleden een soort e-book gehad die gebruikte ook zo'n soort methode om de boel te beveiligen
? vraagje hoor
Helaas is dit even niet anders.
@Bas
Er moet gecontroleerd worden zodra er op de duimpjes worden geklikt.
Moet het dan niet zijn if (isset($_POST["rate"])) if $_COOKIE[zinID] <waarschuwing>
In mijn voorbeeld controleer ik dit al voordat je de duimpjes toont. Je zou hier dan een grijs thumbje kunnen tonen dat niet aanklikbaar is. Dat scheelt je ook weer het proffen van een melding. Dus if(isset($_COOKiE[$zinID])) { grijs thumbje tonen } else { aanklikbaar gekleurd thumbje tonen }
Wil je het in rate.PHP doen, zul je inderdaad moeten controleren of het formulier gepost is, en vervolgens dezelfde check uitvoeren. Echter vul je dan een sessie-waarde oid met de melding of een boolean.
Excuus voor niet gebruiken van code tags en onjuist hoofdlettergebruik. Zit op m'n telefoon.
het lukt nog niet echt. Ik heb nu de volgende code:
if (isset($_POST["rate"])){
setcookie("rateCookie", "$zinNummer", time()+3600,'/','.what2say.nl');
if ($_COOKIE["rateCookie"])
{
if ($rate == "like")
{
$sqlLike;
mysql_query($sqlLike);
}
if ($rate == "dislike")
{
$sqlDislike;
mysql_query($sqlDislike);
}
else{
echo "Je hebt al eerder gestemt op deze zin";
}
}
}
Ik neem aan dat dit niet het volledige script is, maar kijk eens of je hier iets aan hebt? (Probeer de boel even goed te lezen en te kijken wat nou eigenlijk wat doet en waarom ik voor deze structuur heb gekozen.)
Even een klein puntje. In mijn eerdere voorbeeld (en hier ook) heb ik bij het setten van de cookie een punt voor het domein gezet. Hiermee is het cookie ook geldig voor alle subdomeinen van dat domein. In dit geval dus eigenlijk overbodig.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
// Ik neem aan dat onderstaande variabelen wel bestaan?
// $zinNummer
// $sqlLike
// $sqlDislike
if (!isset($_COOKIE['W2S_'.$zinNummer])) {
setcookie("W2S_".$zinNummer, true, time()+3600,'/','.what2say.nl');
if (isset($_POST["rate"])){
if ($rate == "like") {
$sqlLike;
mysql_query($sqlLike);
}
if ($rate == "dislike") {
$sqlDislike;
mysql_query($sqlDislike);
}
}
} else {
echo "Je hebt al eerder gestemt op deze zin";
}
?>
// Ik neem aan dat onderstaande variabelen wel bestaan?
// $zinNummer
// $sqlLike
// $sqlDislike
if (!isset($_COOKIE['W2S_'.$zinNummer])) {
setcookie("W2S_".$zinNummer, true, time()+3600,'/','.what2say.nl');
if (isset($_POST["rate"])){
if ($rate == "like") {
$sqlLike;
mysql_query($sqlLike);
}
if ($rate == "dislike") {
$sqlDislike;
mysql_query($sqlDislike);
}
}
} else {
echo "Je hebt al eerder gestemt op deze zin";
}
?>
Gewijzigd op 21/06/2011 19:22:13 door Bas Matthee
Die variabelen bestonden ja.
Maar het werkt nu!
Dus hartstikke bedankt.
Kunnen we eindelijk naar huis
;)
<div class="ratebalk">
<form action="rate.php" method="post" >
<div id="like">
<input type="image" name="rate" src="images/likeButtonDuim.png" width="54" height="54" value="like" />
<input type="hidden" name="zinID" value="" />
</div>
<div id="dislike">
<input type="image" name="rate" src="images/dislikeButton.png" width="54" height="54" value="dislike" />
<input type="hidden" name="zinID" value="" />
</div>
</form>
</div>
In rate.php staat het volgende om de code op te halen.
$rate = $_POST["rate"];
$zinNummer = $_POST["zinID"];
echo $rate;
echo $zinNummer;
Die echo stond om te kijken of het werkte. In Chrome en Safari zagen we inderdaad dat er een zinnummer kwam te staan en een like of dislike.
Maar IE en FF geven geen echo $rate weer. Het is een simpel stukje code maar IE en FF pakken het niet op.. Iemand een idee?