Stemmen 1x per IP per maand

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Patrick van Osch

Patrick van Osch

27/01/2011 15:09:35
Quote Anchor link
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

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>&nbsp;</td>'; }
                                
echo '
</tr>
Gewijzigd op 27/01/2011 15:22:04 door Justin S
 
PHP hulp

PHP hulp

04/12/2024 09:29:15
 
Gerhard l

gerhard l

27/01/2011 15:17:19
Quote Anchor link
code tussen [.code][./code] tags aub zonder de .
 
Ozzie PHP

Ozzie PHP

27/01/2011 15:36:40
Quote Anchor link
Wat werkt er niet?
 
Patrick van Osch

Patrick van Osch

27/01/2011 15:50:35
Quote Anchor link
Excuses voor de foutieve plaatsing.

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.
 
Kris Peeters

Kris Peeters

27/01/2011 15:58:05
Quote Anchor link
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?


Edit:
Bekijk dit eens
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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/>';
?>


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
 
Patrick van Osch

Patrick van Osch

27/01/2011 17:36:33
Quote Anchor link
Hallo Kris,

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!
 
Veur Heur

Veur Heur

27/01/2011 17:37:52
Quote Anchor link
Een tegenvraag: 1x per IP? En als er nou meerdere mensen achter dat IP zitten?
 
Lano Heeren

Lano Heeren

27/01/2011 17:55:20
Quote Anchor link
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?
 
Patrick van Osch

Patrick van Osch

27/01/2011 19:46:13
Quote Anchor link
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.
 

27/01/2011 21:36:27
Quote Anchor link
Laat de database rekenen.
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.
 
Patrick van Osch

Patrick van Osch

28/01/2011 14:39:15
Quote Anchor link
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?
 
John D

John D

28/01/2011 14:50:58
Quote Anchor link
Waarom een kolom toevoegen en waarom unixtime gebruiken?
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.
 
Patrick van Osch

Patrick van Osch

30/01/2011 10:25:05
Quote Anchor link
Ok bedankt voor de tips, ik ga me hier zeker in verdiepen!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.