[PHP] Ip adres vergelijken in database

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een website waar mensen kunnen stemmen op iets. Als ze dat gedaan hebben slaat ie een cookie op om te vertellen dat ie al gestemd heeft, maar dit is makkelijk te omzeilen.

Wat ik daarom wil proberen is het ip adres van de stemmer op te slaan als last_ip in de database zodat de bezoeker niet tig keer achter elkaar kan blijven stemmen:

PHP:
1
2
3
4
5
6
7
8
9
$current_ip = GetHostByName($REMOTE_ADDR); 

$last_ip = $database[11];  // Hier haalt ie $last_ip uit de database
        

if (current_ip != $last_ip) {
-- Hier slaat ie $current_ip op in de database over $last_ip
-- overige acties
}


$last_ip is een varchar(50) in de database

Voor het gemak heb ik veel code weggelaten.
Als ik dit test zijn $current_ip en $last_ip wel op het oog gelijk, maar voert ie de overige acties wel uit, dus ziet ie ze niet als dezelfde ip.

Moet ik $current_ip op een andere manier opslaan of i.p.v varchar(50) iets anders gebruiken? Of is er een veel betere oplossing hiervoor?

Acties:
  • 0 Henk 'm!

Verwijderd

Kun je niet in de select gewoon "WHERE ip = $curip AND stemid = $curstemid" ofzo iets doen, dat er gewoon wordt gegeken of diegene al gestemd heeft? Dat lijkt mij persoonlijk veel handiger.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op 05 april 2003 @ 13:46:
Kun je niet in de select gewoon "WHERE ip = $curip AND stemid = $curstemid" ofzo iets doen, dat er gewoon wordt gegeken of diegene al gestemd heeft? Dat lijkt mij persoonlijk veel handiger.
Ja ik zal het wat duidelijker maken door de situatie wat beter uit te leggen.
Het gaat om een ringtone site met meerdere ringtones, als bezoeker kan je op meerdere ringtone stemmen of je hem goed of slecht vind.

Bovenstaande werkt dus niet omdat je ip adress bij meerdere ringtones kan staan en je wel de mogelijkheid moet hebben om op een andere ringtone te kunnen stemmen.

Acties:
  • 0 Henk 'm!

  • slm
  • Registratie: Januari 2003
  • Laatst online: 12-11-2023

slm

je moet er voor zorgen dat de ringtone-id ook in de tabel wordt opgeslagen zodat je een query kan doen over: "where ip='$ip' and ringtoneid='$ringtoneid' ".

Ik begrijp trouwens niet wat het nut is van die gethostbyname op een REMOTE_ADDR die normaal gezien alleen een IP teruggeeft.

Misschien zou je ook met forwarded-for moeten werken om proxy-users zoveel mogelijk de kans te geven óók te stemmen.

To study and not think is a waste. To think and not study is dangerous.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
slm schreef op 05 april 2003 @ 13:59:
je moet er voor zorgen dat de ringtone-id ook in de tabel wordt opgeslagen zodat je een query kan doen over: "where ip='$ip' and ringtoneid='$ringtoneid' ".
Ik sla het ip adres nu op in de ringtone database, maar jij hebt het waarschijnlijk over een geheel nieuwe tabel waar de ipadressen in opgeslagen worden. Is ook een mogelijke oplossing.

Maar aangezien het aantal ringtones steeds groter wordt en je op meerdere ringtones kan stemmen is dit niet handig toch? Of bestaat er de mogelijkheid een databaseveld meerdere waarden mee te geven en deze makkelijik uit elkaar te halen?

Ik wil het echter toch op bovenstaande manier proberen, moet mogelijk zijn toch?
slm schreef op 05 april 2003 @ 13:59:
Ik begrijp trouwens niet wat het nut is van die gethostbyname op een REMOTE_ADDR die normaal gezien alleen een IP teruggeeft.

Misschien zou je ook met forwarded-for moeten werken om proxy-users zoveel mogelijk de kans te geven óók te stemmen.
Die gethostbyname heb ik maar gekopieerd van een ander voorbeeld, maar die kan dus weg, en hoe dat met die proxy-users zit weet ik nog niet, daar concentreer ik me later wel op ;)

Acties:
  • 0 Henk 'm!

  • slm
  • Registratie: Januari 2003
  • Laatst online: 12-11-2023

slm

Verwijderd schreef op 05 April 2003 @ 14:15:
Ik sla het ip adres nu op in de ringtone database, maar jij hebt het waarschijnlijk over een geheel nieuwe tabel waar de ipadressen in opgeslagen worden. Is ook een mogelijke oplossing.
Ik heb het idd over een aparte stem-tabel waarin je bijhoud wie er heeft gestemd op welke vraag of in jouw geval op welke ringtone.
Maar aangezien het aantal ringtones steeds groter wordt en je op meerdere ringtones kan stemmen is dit niet handig toch? Of bestaat er de mogelijkheid een databaseveld meerdere waarden mee te geven en deze makkelijik uit elkaar te halen?
Waarom is dat niet handig?

To study and not think is a waste. To think and not study is dangerous.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
omdat je meerdere keren kan stemmen. Stel je stemt voor 5 ringtones, dan moet je 5 ringtone id's opslaan.
dan is dit toch niet toe te passen?:

where ip='$ip' and ringtoneid='$ringtoneid'

Tenzij je voor elke stem een nieuwe rij aanmaakt, bedoel je dat?



ip

ringtoneid

123.123.123.123

1

123.123.123.123

2

123.123.123.123

3

Acties:
  • 0 Henk 'm!

  • slm
  • Registratie: Januari 2003
  • Laatst online: 12-11-2023

slm

Dat bedoel ik ja, voor elke stem een nieuwe rij. Je kan ook wel slechts 1 rij gebruiken met dan een samengesteld veld (bv gescheiden door ; tekens) maar dat is niet erg handig en ook niet bevorderlijk voor je queries. Volgens mij gaat het een stuk sneller om rijen op te tellen met de clause "select count(*) from stemmen where ip='$ip' and rtid='$rtid' " dan een 'vuile' query met "where ip=$ip and substring(rtones,plaats,1)=1" ook al is je database qua records dan bijzonder groot.

To study and not think is a waste. To think and not study is dangerous.


Acties:
  • 0 Henk 'm!

  • Roa
  • Registratie: December 2002
  • Laatst online: 03-07-2024

Roa

je database wordt misschien wel wat groter, maar het is snel en makkelijk bij te houden op deze manier. Zo kunnen er ook makkelijk nieuwe polls aangemaakt worden, ik gebruik dit bij verschillende dingen op mijn site.

Overigens, het ip script dat ik gebruik, ik geloof dat ik het nog ergens van GoT heb ;)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if($HTTP_X_FORWARDED_FOR) 
  { 
   $ip = $HTTP_X_FORWARDED_FOR; 
  } 
  elseif($HTTP_VIA) 
  { 
   $ip = $HTTP_VIA; 
  } 
  elseif($REMOTE_ADDR) 
  { 
   $ip = $REMOTE_ADDR; 
  } 
  else 
  { 
   $ip = "unknown"; 
  }


Heeft bij mij nog nooit gefaald, oftwel, ik heb nog nooit unknown gehad.

[ Voor 50% gewijzigd door Roa op 05-04-2003 18:05 ]

Research is what I'm doing when I don't know what I'm doing.


Acties:
  • 0 Henk 'm!

  • slm
  • Registratie: Januari 2003
  • Laatst online: 12-11-2023

slm

volgens mij kan je ze beter aan elkaar plakken. Dus remote_addr.http_x_forwarded_for anders krijg je soms van die 192.168.0.x adressen in je tabel.

To study and not think is a waste. To think and not study is dangerous.


Acties:
  • 0 Henk 'm!

Verwijderd

if (current_ip != $last_ip) {
Als je hier 2 variabelen vergelijkt moet je voor de eerste nog wel ff een $ zetten. Dan krijg je dus dit:
code:
1
if ($current_ip != $last_ip) {

Of het moet hier een tikvoudje :) zijn?!?

Je kunt ook dit doen:
code:
1
if ($REMOTE_ADDR != $last_ip) {


Als je voor de if statement de beide vars print dan krijg je het correcte resultaat? Dan moet het gewoon werken. Ervan uitgaande dat je query goed is. En dat zal wel als $last_ip het gewenste ip bevat.

De optie van de aparte tabel lijkt me wel een goede oplossing, maar lost op dit moment jou probleem volgens mij niet op :P

Groet,
Hans

Acties:
  • 0 Henk 'm!

Verwijderd

Even voor alle duidelijkheid: de enige juiste manier door dit te doen is door een extra tabel te gebruiken. Alle andere manieren zijn per definitie fout (lees: niet genormaliseerd).

Ik stel me zoiets voor:
Afbeeldingslocatie: http://www.tweakers.net/ext/f/3797/full.jpg

want:
1) een ringtone hoeft niet perse op gestemd te zijn
2) een user komt alleen voor als hij gestemd heeft
3) een user kan op meerdere ringtones stemmen
4) er kunnen meerdere users op een ringtone stemmen

en dat leidt tot de volgende tabellen:

Afbeeldingslocatie: http://www.tweakers.net/ext/f/3798/full.jpg

Uiteraard moet je dit zelf aanvullen met de overige velden. Ik kan je echt adviseren om hier even de tijd voor te nemen, een goed (genormaliseerd) datamodel lijkt nu nog niet zo belangrijk, maar geloof me: later bedank je me :)

Wil je zelf dit soort dingen maken (inclusief het fysiek aanmaken van je database etc) dan moet je even zoeken naar Sybase Powerdesigner. Daar is een evaluatieversie van te downloaden welke volledig functioneel is. Dat ding poept ook gelijk de queries voor je uit, hoef je dus niet zelf te gaan schrijven..

//edit
let op: in een goed datamodel, vind je nergens het getal terug van het aantal stemmen uitgebracht op een ringtone. Die kun je nl. verkrijgen middels een count query. Uit performance overwegingen kun je overwegen dit toch als veld op te nemen, maar zuiver 'volgens het boekje' hoort dit niet.

//edit2
waarom een VA50 voor een IP? Tenzij je IPV6 adressen wilt opslaan is 15 genoeg:

123.123.123.123 = 15 tekens

[ Voor 22% gewijzigd door Verwijderd op 05-04-2003 18:36 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op 05 April 2003 @ 18:17:
[...]

Als je hier 2 variabelen vergelijkt moet je voor de eerste nog wel ff een $ zetten. Dan krijg je dus dit:
code:
1
if ($current_ip != $last_ip) {

Of het moet hier een tikvoudje :) zijn?!?
Hmmm helemaal over het hoofd gezien 8)7
Zo gaat het inderdaad niet werken, heb het aangepast en het werkt nu, thnx! _/-\o_

Acties:
  • 0 Henk 'm!

  • gomaster
  • Registratie: Februari 2002
  • Laatst online: 17-09 17:39
Ik wil even iets heel anders hierover zeggen. nl als mensen voten terwijl ze een dynamisch ip hebben kunnen ze dus na de verbinding te verbreken met internet weer opnieuw voten. Nu, dat geef je zelf al aan, kan je natuurlijk altijd wel omzijlen, ook als je koekjes gebruikt. Maar wat ik irri hier aan vind is dat je als je nog niet hebt gestemd, en je hebt ook een dynamisch ip, je misschien niet kan stemmen omdat een anders al dat ip hiervoor heeft gehad en daarmee heeft gestemd. Ik heb dat vroeger wel eens gehad, toen ik nog inbelde, bij een of andere wedstrijd, vandaar dat ik het op mijn site nooit zal doen :).

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

hezik:
//edit2
waarom een VA50 voor een IP? Tenzij je IPV6 adressen wilt opslaan is 15 genoeg:

123.123.123.123 = 15 tekens
Het is misschien zelfs beter om voor een integer te gaan. Dan zou je alleen de overhead door conversie van IP-string naar integer af moeten wegen tegen de overhead die je zou hebben als je op een varchar zou selecteren. Ik weet niet in hoeverre dat uitmaakt, maar er is vast wel ergens een mafkees die daar een benchmarkje voor wil maken ;)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
gomaster schreef op 05 April 2003 @ 19:37:
Ik wil even iets heel anders hierover zeggen. nl als mensen voten terwijl ze een dynamisch ip hebben kunnen ze dus na de verbinding te verbreken met internet weer opnieuw voten. Nu, dat geef je zelf al aan, kan je natuurlijk altijd wel omzijlen, ook als je koekjes gebruikt. Maar wat ik irri hier aan vind is dat je als je nog niet hebt gestemd, en je hebt ook een dynamisch ip, je misschien niet kan stemmen omdat een anders al dat ip hiervoor heeft gehad en daarmee heeft gestemd. Ik heb dat vroeger wel eens gehad, toen ik nog inbelde, bij een of andere wedstrijd, vandaar dat ik het op mijn site nooit zal doen :).
Ja dat is waar, maar in dit geval slaat ie alleen het ip van de laatste stemmer op om te voorkomen dat je achter elkaar op de stem knop kan blijven klikken.
En kans is heel erg klein dat iemand die wilt stemmen precies die ip adres hebt van de laatste stemmer. Maar is wel iets om rekening mee te houden in geval van belangrijke poll, maar hier heeft het niet zo'n prioriteit.

En met een dynamische ip steeds opnieuw inloggen om op een ringtone te stemmen, van mij mogen ze als ze zoveel moeite daarvoor willen doen :p

Heb nog een extra veiligheid ingebouwd. Als er gestemd wordt krijg ik een mailtje met daarin het ip adres, dus kan dat eventueel handmatig aanpassen, maar liever niet >:)
Pagina: 1