Avatar billede stonedbush Nybegynder
12. november 2005 - 19:05 Der er 16 kommentarer og
1 løsning

Slet emne efter X uger

Hej der.

Hvordan kan man lave et script der kigger i databasen og ser om et emne er mere end X antal uger.
Og hvis den så har været der i mere end det max tilladte, så bliver den slettet.
Det med at få den slettet er ikke så svært :) men det med at den skal tjekke er nok lidt svært, i hvertfald ikke noget jeg kan, tror jeg.
Jeg havde tænkt mig at det skulle være noget med at når man opretter et emne, så bliver der sat en dato,
men ved ikke om det skal være så dag, måned og år er opdelt i hver sit felt, eller om man skal bruge unix timestamp,
men hvordan får man den så til at virke med X antal uger???
Det er der mit problem ligger. Er der nogen der tror de kan hjælpe mig.
Avatar billede jakobdo Ekspert
12. november 2005 - 19:55 #1
Du skal bruge et cronjob/crontab som tjekker databasen f.eks. en gang om dagen.
Det med at finde en dato + eller - interval.
Prøv at kig på mysql funktionen: adddate() -> http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html
Avatar billede stonedbush Nybegynder
12. november 2005 - 22:47 #2
hmm, jeg har lige kigget på det og prøver at bruge dette men den gør ikke som jeg vil have det til:

mysql_query("UPDATE tid SET vis = '1' WHERE dato >= DATE_SUB(CURDATE(),INTERVAL 30 DAY)  ") or die("fejl: ".mysql_error());

jeg har indsat 3 test's hvor de har følgende dato'er:
2005-11-11
2005-11-12
2005-11-13

og alle står med vis som 0, men når jeg kører query'en, tager den også og ændre dem som ligger i fremtiden, som der så også stod inde på den side du linkede til, men jeg kan ikke rigtig kringle, hvordan jeg får den til IKKE at ændre på fremtiden.
Avatar billede jakobdo Ekspert
12. november 2005 - 23:07 #3
Det virker mærkeligt!
Får du dem ud hvis du laver denne sql:
SELECT * FROM tid WHERE dato >= DATE_SUB( CURDATE( ) , INTERVAL 30 DAY )
Avatar billede stonedbush Nybegynder
12. november 2005 - 23:14 #4
den tager også dem som ligger i næste måned, også selv om de ligger uden for den 30 dages interval der er.
Avatar billede stonedbush Nybegynder
12. november 2005 - 23:17 #5
og vis jeg skriver:
SELECT * FROM tid WHERE dato >= DATE_SUB( CURDATE( ) , INTERVAL - 30 DAY )
tager den kun dem fra fremtiden og med + istedet for minus tager den dem alle
Avatar billede jakobdo Ekspert
12. november 2005 - 23:21 #6
Det din query gør, er den tager dags dato, trækker 30 dage fra og så viser den alle datoer i din query som er større eller lige med den!
Ergo vil du få alle felter som er nyere end 11-10-2005
Du skal jo slette dem som er ældre ikke?
Så jeg tror du skal lave:
DELETE FROM tid WHERE dato < DATE_SUB( CURDATE( ) , INTERVAL 30 DAY )
Avatar billede stonedbush Nybegynder
12. november 2005 - 23:25 #7
jeg har lige prøvet det, godt nok ikke med DELETE, men hvor den valgte alt, for at se om den kun tog dem der var gamle, men nej, den tager sørme stadig de "ufødte" endnu
Avatar billede jakobdo Ekspert
12. november 2005 - 23:28 #8
Ok!
Prøv lige at forklar mig hvad det helt præcist er du ønsker?
Gerne med lidt eksempler.
Avatar billede stonedbush Nybegynder
12. november 2005 - 23:29 #9
nu har jeg fundet ud af det tror jeg:

SELECT * FROM tid WHERE dato < DATE_SUB( CURDATE( ) , INTERVAL - 30 DAY )

så tager den og viser alle dem der er mellem nu og 30 dage gamle. hvis man så skriver:

SELECT * FROM tid WHERE dato < DATE_SUB( CURDATE( ) , INTERVAL + 30 DAY )

er der så fra nu og 30 dage frem

JUBII
Avatar billede stonedbush Nybegynder
12. november 2005 - 23:31 #10
hmm ikke helt alligevel. øv

tager og viser i morgen med
Avatar billede stonedbush Nybegynder
12. november 2005 - 23:35 #11
Jeg vil gerne have den til at slette alle de ting i databasen der er mere end 30 dage gammel.
Den skal ikke tage dem fra i morgen eller længere fremme kun det er har været.
Og jeg kan desværre ikke give nogle eksempler.
Avatar billede stonedbush Nybegynder
12. november 2005 - 23:46 #12
HVis vi siger at jeg har indsat noget i min tabel som dette her:

id, dato, note, vis

1, 2005-11-05, test 1, 0
2, 2005-11-06, test 2, 0
3, 2005-11-08, test 3, 0
4, 2005-11-10, test 4, 0
5, 2005-11-11, test 5, 0
6, 2005-11-12, test 6, 0
7, 2005-11-13, test 7, 0
8, 2005-11-14, test 8, 0
9, 2005-11-15, test 9, 0

så skal den slette det så der kun står dette tilbage:


6, 2005-11-12, test 6, 0
7, 2005-11-13, test 7, 0
8, 2005-11-14, test 8, 0
9, 2005-11-15, test 9, 0
Avatar billede stonedbush Nybegynder
12. november 2005 - 23:46 #13
hvis  det giver nogen mening :)
Avatar billede jakobdo Ekspert
12. november 2005 - 23:49 #14
Prøv at test denne:
mysql_query("UPDATE tid SET vis = '1' WHERE dato >= CURDATE()") or die("fejl: ".mysql_error());
Avatar billede stonedbush Nybegynder
13. november 2005 - 00:08 #15
hvis jeg ændrede det til:
$sql = mysql_query("UPDATE tid SET vis = '1' WHERE dato < CURDATE() ORDER BY dato") or die("fejl: ".mysql_error());
så virkede det.
Mange tak for den store hjælp. smid et svar og du får dine point + karma
Avatar billede jakobdo Ekspert
13. november 2005 - 08:10 #16
Et svar!
Avatar billede jakobdo Ekspert
13. november 2005 - 12:17 #17
Takker for point!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester