[MySQL] Bansysteempje

Pagina: 1
Acties:

  • Tommetje
  • Registratie: Februari 2004
  • Laatst online: 19-11-2024
Momenteel ben ik bezig aan een klein bansysteem voor mijn site, nu heb ik een tabel met de velden `verloopt` int(11) > de unix timestamp van de datum waarop de ban verloopt en een veld `unbanned` tinyint(1) > Het veld waarin wordt bijgehouden of het ip handmatig door een admin is geunbanned ('t veld krijgt de waarde 1 ;)). Ik heb nog meerdere velden, maar die doen niet echt ter zake.
Als de ban voor onbeperkte duur is zet ik het veld `verloopt` op 0.

Nu wil ik alle ips ophalen die gebanned zijn EN later wil ik alle ips ophalen die niet gebanned zijn. Nu wil ik hiervoor dus 2 queries opstellen.

Voor de gebanned:
code:
1
2
3
4
$sql = 'SELECT `id`, `ip`
   FROM `bans
   WHERE `verloopt` > ' . time () . ' OR `unbanned` = 0
   ORDER BY `banned_op` DESC';

En voor de geunbanned:
code:
1
2
3
4
$sql = 'SELECT `id`, `ip
   FROM `bans
   WHERE `unbanned` = 1 OR ( `verloopt` < ' . time () . ' AND `verloopt` != 0 ) 
   ORDER BY `banned_op` DESC';

Maar nu krijg ik bij allebei de query's 1 resultaat terug, terwijl dat resultaat alleen bij de geunbanned moet komen, want het veld verloopt is minder dan de tijd nu en unbanned staat op 0.

Wat moet ik aanpassen aan mijn queries om de goede resultaten te krijgen? :)

[ Voor 5% gewijzigd door Tommetje op 17-11-2004 18:59 ]

Hoi!


  • Morax
  • Registratie: Mei 2002
  • Laatst online: 08:45
code:
1
2
3
4
$sql = 'SELECT `id`, `ip`
   FROM `bans
   WHERE `verloopt` > ' . time () . ' OR `unbanned` = 0
   ORDER BY `banned_op` DESC';


Moet die OR in je where-claus geen AND zijn? Nu haalt hij namelijk ook alle bans op die verlopen zijn, maar niet handmatig unbanned :)

Of snap ik het nou niet :?

What do you mean I have no life? I am a gamer, I got millions!


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 21:24

NMe

Quia Ego Sic Dico.

Je queries lijken gewoon te kloppen. Ligt het niet aan je code? Wat krijg je in bijvoorbeeld phpMyAdmin terug aan resultaten? Hoe dan ook zien je queries er redelijk ok uit.

Verder een beetje offtopic, maar wel het noemen waard: waarom heb je een id-veld? IP's zijn al uniek lijkt me zo. ;) Of wil je soms de banhistory van elk IP bijhouden? Ook zou het theorethisch voor moeten kunnen komen dat een ban precies op dit moment verloopt, en daar hou je geen rekening mee. In één van de twee queries moet je dus groter/kleiner dan of gelijk aan opnemen. :P
Morax schreef op woensdag 17 november 2004 @ 19:28:
Moet die OR in je where-claus geen AND zijn? Nu haalt hij namelijk ook alle bans op die verlopen zijn, maar niet handmatig unbanned :)

Of snap ik het nou niet :?
Hoe kan iets nou groter zijn aan time() (die alleen op 1-1-1970 0:00AM de waarde 0 returnt) en tegelijkertijd gelijk zijn aan nul? ;)
Heeft iemand een leesbril te koop? 8)7

Edit2: Morax: no offence taken. :* :+

[ Voor 35% gewijzigd door NMe op 17-11-2004 19:50 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Morax
  • Registratie: Mei 2002
  • Laatst online: 08:45
Zie jij de query wel :?

Hij haalt volgens de where-claus alle bans op die
OF al verlopen zijn: WHERE `verloopt` > ' . time () . '
OF die niet handmatig unbanned zijn: OR `unbanned` = 0

Maar wat als een ban nou verlopen is, en niet handmatig unbanned, dan krijg je toch een resultaat omdat er een OR staat ;)

[edit]:
LOL @ Edit :D
Sorry trouwens voor mijn beetje ruwe opmerking van "Zie jij de query wel :? " :)

[ Voor 23% gewijzigd door Morax op 17-11-2004 19:36 ]

What do you mean I have no life? I am a gamer, I got millions!


  • Tommetje
  • Registratie: Februari 2004
  • Laatst online: 19-11-2024
@Morax: Klopt, die OR moest idd. een AND zijn. :)
NMe84 schreef op woensdag 17 november 2004 @ 19:29:
Verder een beetje offtopic, maar wel het noemen waard: waarom heb je een id-veld? IP's zijn al uniek lijkt me zo. ;) Of wil je soms de banhistory van elk IP bijhouden?
Dat was wel de achterliggende gedachte, ja ;)
Ook zou het theorethisch voor moeten kunnen komen dat een ban precies op dit moment verloopt, en daar hou je geen rekening mee. In één van de twee queries moet je dus groter/kleiner dan of gelijk aan opnemen. :P
Hmm, zit wat in. Alhoewel ik denk dat het niet vaak (of nooit) zal voorkomen, zal ik daar toch eens naar kijken. :)

Allebei bedankt! :)

Maar, ik heb nu ook dus een query om te kijken of het gebruikserip geblokkeerd is, dat is deze:
code:
1
2
3
4
5
$sql = 'SELECT `ip`, `reden`
   FROM `bans`
   WHERE `ip` = "' . addslashes ( ip () ) . '"
      AND ( unbanned = 0 OR ' . time () . ' < `verloopt` )
   LIMIT 1';

Klopt deze query wel? Want niet dat ik dadelijk mensen krijg die er niet opkomen, terwijl ze niet geband zijn :p.

[ Voor 4% gewijzigd door Tommetje op 17-11-2004 19:46 ]

Hoi!


  • Morax
  • Registratie: Mei 2002
  • Laatst online: 08:45
Wederom zelfde probleem. Wat als de ban nou verlopen is en hij is niet handmatig unbanned, dan komt er nog steeds een resultaat uitzetten vanwege die OR weer ;)
Dus dat moet ook hier weer een AND zijn :)

What do you mean I have no life? I am a gamer, I got millions!


  • Tommetje
  • Registratie: Februari 2004
  • Laatst online: 19-11-2024
Maar dan moet hij toch én handmatig unbanned zijn én verlopen zijn? Of zie ik dat verkeerd? ;)

Hoi!


  • Morax
  • Registratie: Mei 2002
  • Laatst online: 08:45
Tommetje schreef op woensdag 17 november 2004 @ 19:55:
Maar dan moet hij toch én handmatig unbanned zijn én verlopen zijn? Of zie ik dat verkeerd? ;)
Even voor de zekerheid, probeer je met deze query te controleren of iemand wel of niet geband is?

What do you mean I have no life? I am a gamer, I got millions!


  • Tommetje
  • Registratie: Februari 2004
  • Laatst online: 19-11-2024
Morax schreef op woensdag 17 november 2004 @ 19:57:
[...]


Even voor de zekerheid, probeer je met deze query te controleren of iemand wel of niet geband is?
Deze is om te controleren of iemand wel geband is. :)

Hoi!


  • Morax
  • Registratie: Mei 2002
  • Laatst online: 08:45
Tommetje schreef op woensdag 17 november 2004 @ 20:01:
[...]

Deze is om te controleren of iemand wel geband is. :)
De voorwaarden dat iemand dan geband is zijn:
De tijd is niet verlopen EN iemand is niet unbanned
jij hebt dit in je query:
code:
1
unbanned = 0 OR ' . time () . ' < `verloopt`

Jij haalt iemand op als hij
OF niet unbanned is
OF als de tijd niet verlopen is

Maar als de tijd WEL verlopen is, en iemand is NIET handmatig unbanned, dan staat unbanned nog op '0' en zal de AND true worden (vanwege de OR ;)) waardoor hij een resultaat heeft terwijl diegene niet geband is :)

Snap je hem?

[ Voor 5% gewijzigd door Morax op 17-11-2004 20:13 ]

What do you mean I have no life? I am a gamer, I got millions!


  • Tommetje
  • Registratie: Februari 2004
  • Laatst online: 19-11-2024
Ja, volgens mij wel... ;)

code:
1
2
3
4
5
$sql = 'SELECT `ip`, `reden`
   FROM `bans`
   WHERE `ip` = "' . addslashes ( ip () ) . '"
      AND ( unbanned = 1 OR ' . time () . ' < `verloopt` )
   LIMIT 1';

Ik heb nu die unbanned = 0 in = 1 veranderd... Volgens mij klopt hij wel nu wel, of niet? :)

Bedankt btw ;)

Hoi!


  • Morax
  • Registratie: Mei 2002
  • Laatst online: 08:45
Tommetje schreef op woensdag 17 november 2004 @ 20:16:
Ja, volgens mij wel... ;)

code:
1
2
3
4
5
$sql = 'SELECT `ip`, `reden`
   FROM `bans`
   WHERE `ip` = "' . addslashes ( ip () ) . '"
      AND ( unbanned = 1 OR ' . time () . ' < `verloopt` )
   LIMIT 1';

Ik heb nu die unbanned = 0 in = 1 veranderd... Volgens mij klopt hij wel nu wel, of niet? :)

Bedankt btw ;)
Nee, hij klopt not niet. Tis precies dezelfde situatie als daarnet, gewoon de OR naar een AND veranderen.
Nu haal je het IP op als:
de tijd niet verlopen is
als het IP WEL handmatig unbanned is

Dus als je nu een IP handmatig unbanned, krijg je hem toch als resultaat door die OR :)

edit:
De voorwaarden zijn :
De tijd is niet verlopen EN hij is NIET handmatig unbanned, dus:
WHERE unbanned = 0 AND ' . time () . ' < `verloopt`
:)

[ Voor 14% gewijzigd door Morax op 17-11-2004 20:24 ]

What do you mean I have no life? I am a gamer, I got millions!


  • Tommetje
  • Registratie: Februari 2004
  • Laatst online: 19-11-2024
Verrek! Het begint me te dagen :P. Ik was geloof ik wat in de war met niet geband ;). Als ik die OR dus in AND verander klopt het wel. Bedankt voor je hulp Morax! :)

Hoi!


  • Morax
  • Registratie: Mei 2002
  • Laatst online: 08:45
Tommetje schreef op woensdag 17 november 2004 @ 20:25:
Verrek! Het begint me te dagen :P. Ik was geloof ik wat in de war met niet geband ;). Als ik die OR dus in AND verander klopt het wel. Bedankt voor je hulp Morax! :)
No problemo, glad to help :Y)

What do you mean I have no life? I am a gamer, I got millions!


Verwijderd

Goed ik raak de kluts kwijt met al die reacties maar
je wilt het volgende
Iemand is gebanned als de bantijd nog niet verlopen is OF de bantijd = 0 EN een administrator de user nog niet geunbanned heeft (unbanned=0)

dus

code:
1
2
3
4
$sql = 'SELECT `id`, `ip`
   FROM `bans
   WHERE (`verloopt` > ' . time () . ' OR `verloopt` = 0) AND unbanned=0
   ORDER BY `banned_op` DESC';


Zo moeilijk is dat toch niet?
Pagina: 1