Stemmen 1x per IP per maand
Ik heb een probleem in een bestaand stukje PHP wat er voor zorgt dat een bezoeker 1x per IP per maand kan stemmen op een bedrijf. Nu kan ik stemmen, daarna niet meer. Stemmen worden opgeslagen in een database met unixtime van de stem en het IP, en uiteraard welk bedrijf ID het omgaat. Heeft altijd gewerkt, maar nu ineens niet
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<tr>
<td style="text-align: center"><b>Gemiddelde<br>cijfer</b></td>
';
$queIP = mysql_query("SELECT date FROM stemmen WHERE ip = '".$_SERVER['REMOTE_ADDR']."' AND sid = '".addslashes($_GET['id'])."' ORDER BY date DESC");
$rowIP = mysql_fetch_array($queIP);
if($rowSauna['reactions'] == 1 AND (mysql_num_rows($queIP) == 0 OR (date('Y', $rowIP['date']) <= date('Y') AND date('n', $rowIP['date']) < date('n'))))
{
echo '
<td style="cursor: pointer" onclick="newWindow(\'./includes/handle.inc.php?f=Stemmen&id='.addslashes($_GET['id']).'\', 240, 660, \'yes\')">
<b>Klik hier om te stemmen</b>
</td>
';
}
else { echo '<td> </td>'; }
echo '
</tr>
<td style="text-align: center"><b>Gemiddelde<br>cijfer</b></td>
';
$queIP = mysql_query("SELECT date FROM stemmen WHERE ip = '".$_SERVER['REMOTE_ADDR']."' AND sid = '".addslashes($_GET['id'])."' ORDER BY date DESC");
$rowIP = mysql_fetch_array($queIP);
if($rowSauna['reactions'] == 1 AND (mysql_num_rows($queIP) == 0 OR (date('Y', $rowIP['date']) <= date('Y') AND date('n', $rowIP['date']) < date('n'))))
{
echo '
<td style="cursor: pointer" onclick="newWindow(\'./includes/handle.inc.php?f=Stemmen&id='.addslashes($_GET['id']).'\', 240, 660, \'yes\')">
<b>Klik hier om te stemmen</b>
</td>
';
}
else { echo '<td> </td>'; }
echo '
</tr>
Gewijzigd op 27/01/2011 15:22:04 door Justin S
code tussen [.code][./code] tags aub zonder de .
Wat werkt er niet?
Als ik een stem heb uitgebracht kan ik na een maand niet meer stemmen. Dus als ik de unixtime van de stem in de database terug zet naar twee of drie maanden geleden (heb ook drie jaar geprobeerd), kan ik nog steeds niet stemmen.
- Die addslashes, wat die daar te zoeken hebben; geen idee.
- Dat selecteren van jaar-maand, kan veel simpeler, in de sql. Nu doet php dat.
Nu, toch even vertellen wat dat script doet.
Indien er geen combinatie wordt gevonden ip-maand-bedrijf, wordt een knopje gezet waarmee je kan stemmen.
Ik heb echter het vermoeden dat er niet effectief wordt gecontroleerd bij het inserten.
10 seconden naar de broncode kijken en je hebt een manier gevonden om eindeloos te blijven stemmen. Ik kan me uiteraard vergissen; dat stuk code heb je niet gepost.
Kan je dat ook eens doen; de omgeving van de INSERT tonen?
Edit:
Bekijk dit eens
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$now = date_create("now");
$begin_month = date_create($now->format('Y-m') . '-1');
$next_month = clone $begin_month;
$next_month->modify('+1 month');
$sql = "
SELECT date
FROM stemmen
WHERE
ip = '". $_SERVER['REMOTE_ADDR'] ."'
AND
sid = '". (int) $_GET['id'] ."'
AND
date >= ". strtotime($begin_month->format('Y-m-d H:i:s')) ."
AND
date < ". strtotime($next_month->format('Y-m-d H:i:s')) ."
ORDER BY date DESC
";
echo 'sql: '. $sql .'<br/>';
echo 'begin maand: '. $begin_month->format('Y-m-d H:i:s') .'<br/>';
echo 'begin volgende maand: '. $next_month->format('Y-m-d H:i:s') .'<br/>';
?>
$now = date_create("now");
$begin_month = date_create($now->format('Y-m') . '-1');
$next_month = clone $begin_month;
$next_month->modify('+1 month');
$sql = "
SELECT date
FROM stemmen
WHERE
ip = '". $_SERVER['REMOTE_ADDR'] ."'
AND
sid = '". (int) $_GET['id'] ."'
AND
date >= ". strtotime($begin_month->format('Y-m-d H:i:s')) ."
AND
date < ". strtotime($next_month->format('Y-m-d H:i:s')) ."
ORDER BY date DESC
";
echo 'sql: '. $sql .'<br/>';
echo 'begin maand: '. $begin_month->format('Y-m-d H:i:s') .'<br/>';
echo 'begin volgende maand: '. $next_month->format('Y-m-d H:i:s') .'<br/>';
?>
Het kan uiteraard ook anders; er zijn nogal veel manieren om datum/tijd te regelen.
Waar het om gaat: op deze manier haal je enkel de records (uit de database) die je echt nodig hebt, in plaats van nog verder te filteren in php.
Gewijzigd op 27/01/2011 16:24:53 door Kris Peeters
Dank voor je uitgebreide mail, ik moet eerlijk bekennen dat ik te weinig weet van PHP, maar aanneem dat je gelijk hebt. Ik denk ook dat het stukje te ingewikkeld is, voor de website waar hij van is is hij geschikt, en wordt er eigenlijk niet gefraudeerd.
Wat bedoel je met de omgeving van de insert?
Kan ik de code niet vervangen voor iets wat gemakkelijker is?
Nogmaals dank!
Een tegenvraag: 1x per IP? En als er nou meerdere mensen achter dat IP zitten?
Ziggo deelt dynamisch ip adressen uit, ik kan via mijn router telkens een ander ipadres opvragen bij ziggo, dat betekend dat ik elke minuut kan stemmen?
Opolo en Lano. Daar zit het probleem niet in. Die discussie wordt overal gevoerd. Mijn systeem werkt voor het doel prima, alleen zit er ergens een foutje in, wat ik er graag uit zou willen hebben.
mysql date time functions.
Let wel op, in de database oor je ook de datum / tijd informatie op te slaan in een veld van het juiste type.
Ook is het dus zoals Opolo en Lano niet handig om dit script daadwerkelijk door te voeren naar live omgeving.
Mm ok, in de databse wordt de datum en tijd al in de vorm van unixtime opgeslagen. Dus als ik het goed begrijp zou je dus een kolom moeten toevoegen aan de DB waarin automatisch unixtime +1maand (of 30 dagen das ook prima) in komt te staan? Die waarde gebruik je om de link om te stemmen te openen?
Raadpleeg de link van Karl, gebruik de juiste tijdnotatie en check (in MySQL) wanneer iemand wil stemmen of dat al een maand geleden is. Zoja stemmen en record updaten, zonee foutmelding. Lees je goed in op MySQL date en time functies en het rekenen met tijd en het is simpel op te lossen. Het gereken in php met date/time is niet de manier.
Ok bedankt voor de tips, ik ga me hier zeker in verdiepen!