Door
Patrick van Osch
op 27-01-2011 15:09
gewijzigd op 27-01-2011 15:22
3.401 views
Hallo,
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
<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>
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.
Daar is van alles mis mee of toch ten minste ... uhh ... vreemd.
- 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?
$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.
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?
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.
?
Onbekende gebruiker
27-01-2011 21:36
Laat de database rekenen.
[google]mysql date time functions[/google].
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?