[MySQL] Selecteren van records niet ouder dan 1 uur

Pagina: 1
Acties:

  • Bor
  • Registratie: Februari 2001
  • Laatst online: 21:17

Bor

Coördinator Frontpage Admins / FP Powermod

01000010 01101111 01110010

Topicstarter
Ik ben bezig met een klein studie projectje voor mezelf in PHP en MySQL. Ik heb een guestbook script gemaakt. Omdat ik niet wil dat iedereen dit guestbook vol kan spammen wil ik er een check in maken of er binnen het laatste uur / half uur al een keer eerder van het betreffende ip adres is gepost.

Ik heb een table guestbook waarin onderandere een timestamp (time) en een ip (ip) in wordt opgeslagen.

Ik heb de MySQL manual doorgespit en de functie TIMEDIFF (expr1,expr2) gevonden die mij geschikt lijkt. De query die ik inelkaar heb gezet werkt helaas niet (mysql error) en ik kan niet vinden hoe ik het dan wel moet doen:

SELECT * FROM guestbook WHERE TIMEDIFF (now(),guestbook.time) < '00:01:00'

Hoe evalueer ik de uitkomst de uitkomst van TIMEDIFF en "een uur"? Ik denk dat hier de fout zit namelijk. De uitkomst van de TIMEDIFF functie is in de vorm '46:58:57.999999'

Over Bor | Vraag & Aanbod feedback | Frontpagemoderatie Forum


Verwijderd

Probeer eens
SELECT * FROMK guestbook WHERE TIMEDIFF (now(),guestbook.time) < 3600;

Geen idee hoe dat de functie timediff werkt, maar een timestamp werkt met secondes NA 1970. en 3600 secondes is 1 uur.

Je kan ook dit proberen
SELECT * FROM guestbook WHERE ipadresvandeuser='iphierzo' AND timestampje<=now()-3600;
die < kan ook > zijn, moet je even mee spelen.

  • PanMan
  • Registratie: November 1999
  • Laatst online: 05-08 11:19

PanMan

Spun!

Volgens mij is het het eenvoudigst gewoon zelf even met timestamps aan de slag te gaan.
Eerst zet je $time :
$time=time()-3600;
en dan gewoon "select * from tabel where IP='$IP' and timestamp>'$time';
Als je hier een result krijgt, is er het afgelopen uur vanaf dat IP gepost.
Houd je er wel rekening mee dat proxyservers vaak 1 IP hebben, voor $veel users?

Where a calculator on the ENIAC is equipped with 18,000 vacuum tubes and weighs 30 tons, computers in the future may have only 1,000 vacuum tubes and weigh only 1.5 tons.
– Popular Mechanics, March 1949


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

Wellicht is het *nog* makkelijker om een TIMESTAMP kolom in je tabel erbij te zetten. Deze zal automatisch een unix timestamp maken op het moment dat de rij wordt ingevoegd of wordt ge-update. Dan hoef je alleen nog maar te checken of het minder dan 3600 seconden geleden is, dat is wat makkelijker.

Rustacean


  • Bor
  • Registratie: Februari 2001
  • Laatst online: 21:17

Bor

Coördinator Frontpage Admins / FP Powermod

01000010 01101111 01110010

Topicstarter
Manuzhai schreef op 24 October 2003 @ 14:49:
Wellicht is het *nog* makkelijker om een TIMESTAMP kolom in je tabel erbij te zetten. Deze zal automatisch een unix timestamp maken op het moment dat de rij wordt ingevoegd of wordt ge-update. Dan hoef je alleen nog maar te checken of het minder dan 3600 seconden geleden is, dat is wat makkelijker.
Dat is precies wat ik heb op dit moment. Echter kon ik nergens vinden hoe ik de vergelijking moest doen. Blijkbaar werkt dit niet:

TIMEDIFF (now(),guestbook.time) < '00:01:00'

Als ik nu de reacties lees zal de 00:01:00 waarschijnlijk 3600 moeten worden, dat gaan we gelijk testen :)

[ Voor 4% gewijzigd door Bor op 24-10-2003 17:05 ]

Over Bor | Vraag & Aanbod feedback | Frontpagemoderatie Forum


  • Bor
  • Registratie: Februari 2001
  • Laatst online: 21:17

Bor

Coördinator Frontpage Admins / FP Powermod

01000010 01101111 01110010

Topicstarter
Ik heb het volgende getest:

PHP:
1
2
3
4
5
6
7
8
9
10
11
mysql_connect("$DBHost", "$DBLogin", "$DBPassword") or die ("Could not connect to database:".mysql_error());
@mysql_select_db("$DBDatabase") or die("Couldn't select database: ".mysql_error());

$tijduurgeleden=time()-3600;
                        
$result = mysql_query("SELECT id FROM guestbook WHERE time > $tijduurgeleden") or die ("Query failed: ".mysql_error());                     
                        
while ($row = mysql_fetch_assoc($result))
{
echo "1 gevonden<br>";
}


Ik weet zeker dat er geen posts in het guestbook staan van minder dan 1 uur geleden (de laatste zijn dagen terug). De output die ik krijg is echter:

1 gevonden
1 gevonden
1 gevonden
1 gevonden
....
1 gevonden

Dit lijkt mij niet helemaal correct. Kan ik trouwens ook gewoon checken / tellen hoeveel records zijn gevonden? Is mysql_numrows($result) dan voldoende?

Time is een timestamp veld uit de guestbook table.

[ Voor 22% gewijzigd door Bor op 24-10-2003 17:30 ]

Over Bor | Vraag & Aanbod feedback | Frontpagemoderatie Forum


  • nxt
  • Registratie: November 2001
  • Laatst online: 12-06 10:00

nxt

volgens mij levert een kolom van 't type timestamp niet 't zelfde formaat op als de time() functie van php

probeer dit eens als query
code:
1
SELECT id FROM guestbook WHERE UNIX_TIMESTAMP(time) > $tijduurgeleden


en mysql_num_rows($result) is idd voldoende om 't aantal gevonden records te tellen

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

WHERE timestampfield > DATE_SUB(NOW(), INTERVAL 1 HOURS)

werkt denk ik beter :)
omzetten naar unixtimestamps is onzin en veroorzaakt dat je je indices erop niet meer kan gebruiken.

[ Voor 9% gewijzigd door ACM op 24-10-2003 18:15 ]


  • nxt
  • Registratie: November 2001
  • Laatst online: 12-06 10:00

nxt

ACM schreef op 24 oktober 2003 @ 18:15:
...omzetten naar unixtimestamps is onzin en veroorzaakt dat je je indices erop niet meer kan gebruiken.
daar heb ik niet aan gedacht, dat is wel handig om te weten.
* nxt rent snel weg om een paar oude scripts te gaan wijzigen

[ Voor 3% gewijzigd door nxt op 24-10-2003 18:20 ]


  • Bor
  • Registratie: Februari 2001
  • Laatst online: 21:17

Bor

Coördinator Frontpage Admins / FP Powermod

01000010 01101111 01110010

Topicstarter
nxt schreef op 24 October 2003 @ 18:19:
[...]

daar heb ik niet aan gedacht, dat is wel handig om te weten.
* nxt rent snel weg om een paar oude scripts te gaan wijzigen
Kun je in mysql newbie taal uitleggen wat dat betekend?

Over Bor | Vraag & Aanbod feedback | Frontpagemoderatie Forum


  • darkrain
  • Registratie: Augustus 2001
  • Laatst online: 18:34

darkrain

Moderator Discord / General Chat

Geniet. Punt.

ACM bedoeld volgens mij dat je het beste de date/time functies van mysql kunt gebruiken met het oog op snelheid enzo.

Date/Time functies

[ Voor 28% gewijzigd door darkrain op 24-10-2003 18:30 ]

Tweakers Discord


  • nxt
  • Registratie: November 2001
  • Laatst online: 12-06 10:00

nxt

Bor_de_Wollef schreef op 24 October 2003 @ 18:21:
Kun je in mysql newbie taal uitleggen wat dat betekend?
indices kunnen het zoeken in een tabel sneller maken, maar maken 't updaten langzamer
als je dan bijvoorbeeld een index hebt om die time kolom, is 't zonde als die niet gebruikt kan worden, terwijl je wel snelheid inlevert bij 't updaten.

[ Voor 4% gewijzigd door nxt op 24-10-2003 18:40 ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Dark_Rain schreef op 24 October 2003 @ 18:29:
ACM bedoeld volgens mij dat je het beste de date/time functies van mysql kunt gebruiken met het oog op snelheid enzo.

Dat niet alleen, ook dat je het beste geen bewerkingen op de waarde die je wilt opzoeken moet doen en dat het net zo makkelijk met mysql's eigen functies te doen is als met allerlei onhandige omwegen.
Pagina: 1