Avatar billede duqe Nybegynder
05. august 2008 - 11:08 Der er 15 kommentarer og
1 løsning

X dage tilbage

Jeg har en VIP-funktion på en hjemmeside, som jeg er ved at omskrive.

Den nye mysql-struktur er:

brugernavn (varchar) | dato for VIP start (varchar) | dage tilbage af VIP-periode (varchar)

En typisk indtastning kunne være: supermand, 05/08/2008, 365
(Et års VIP - 365 dage)

Nu mangler jeg bare et script der automatisk kan trække -1 fra alle "dage tilbage af vip-periode" én gang dagligt, så tabellen på den måde kan holde sig opdateret.

Jeg har forsøgt at lege med nogle timestamps o.s.v., men det lykkedes mig ikke at komme frem til noget brugbart. Er der nogle der har et par tips?

På forhånd tak
Avatar billede leif Seniormester
05. august 2008 - 11:10 #1
Hvorfor ikke lave et felt: VIP-Expire og opdatere det felt med en dato ved køb/tildeling af VIP
Avatar billede soerenlyn Nybegynder
05. august 2008 - 11:17 #2
Ja leifs løsning er helt klart at foretrække end din :)
Avatar billede w13 Novice
05. august 2008 - 11:18 #3
Præcis. Med Leifs løsning, skal der ikke opdateres noget dagligt, og hvis du får mange brugere, er det jo klart at foretrække.
Avatar billede pidgeot Nybegynder
05. august 2008 - 11:19 #4
(Jeg går ud fra MySQL 4.1 eller nyere.)

Alene det at du har valgt varchar til noget der er et tal er et godt signal om at du er ved at lave noget hø (valget til dit datofelt er heller ikke for god, men varchar til tal er helt skidt)).

Du bør lave din struktur om:

bruger | startdato (date) | slutdato (date)

Hvis du har en numerisk ID-kolonne i din brugertabel bør du bruge den i stedet for brugernavn for at spare på pladsforbruget. Din primærnøgle i tabellen bør være bruger, startdato (startdato kan udelades hvis du sletter eller opdaterer rækken når man fornyer VIP'en)

For at finde ud af hvor mange dage der er tilbage kan du bruge DATEDIFF(slutdato,startdato). Det gør også at du kan bruge WHERE CURDATE() BETWEEN startdato AND slutdato for at se om der er VIP aktiv for den pågældende bruger (selvfølgelig med tilføjelse af en betingelse på brugernavnet).
Avatar billede pidgeot Nybegynder
05. august 2008 - 11:22 #5
...og der skulle jeg så lige have opdateret, men nu fik du i stedet en lidt mere uddybende forklaring på hvorfor det er en skidt struktur.
Avatar billede duqe Nybegynder
05. august 2008 - 11:39 #6
Hvordan udregner jeg slutdato? (startdato + 365 dage)

VIP er et år, og jeg kender dato'en for oprettelse: date("d/m/Y");
Avatar billede pidgeot Nybegynder
05. august 2008 - 11:43 #7
Du skal som sagt bruge date som dine kolonnetyper. På den måde behøver du heller ikke beregne noget i din PHP-kode, men kan skrive det direkte ind som en fast del af din SQL: brug CURDATE() for i dag, og DATE_ADD(CURDATE(), INTERVAL 365 DAY) for at få 365 dage senere. (evt. INTERVAL 1 YEAR hvis det skal være et helt år når der er skudår).
Avatar billede duqe Nybegynder
05. august 2008 - 12:00 #8
Tak for svar - De er ændret til date i mysql strukturen og udløbsdatoen indsættes automatisk. Tak for hjælpen ;)

mmm.. Hvem skal have point?
Avatar billede duqe Nybegynder
05. august 2008 - 12:06 #9
Pidgeot >

DATEDIFF(slutdato,startdato)

Skal den også skrive ind i sql linjen?
Der er ikke en php-funktion der kan gøre det? (echo datediff('$startdato','$slutdato'); ?
Avatar billede jakobdo Ekspert
05. august 2008 - 12:35 #10
Datediff() er en mysql funktion.
Der er dog lavet lign. funktioner af diverse bruger til brug i php. (dog ikke dem alle som er lige gode)
Avatar billede pidgeot Nybegynder
05. august 2008 - 12:55 #11
DATEDIFF skal ganske rigtigt skrives ind som en SELECT-kolonne hvor du vil finde ud af hvor mange dage der er tilbage (og du skal nok bruge AS for at kunne pege på den med et lidt mere sigende navn). Du kan også hive de to felter ud i PHP og arbejde med det der, men som jakob siger kræver det noget mere arbejde.

Pointene bør gå til leif - han var hurtigst.
Avatar billede duqe Nybegynder
05. august 2008 - 12:59 #12
Okay så er jeg med. Tak for jeres hjælp :)

Leif - smider du et svar?
Avatar billede leif Seniormester
05. august 2008 - 14:45 #13
Jo, det vil jeg da godt, men pidgeot kom med de sidste guldkorn omkring hvordan man kunne gøre det.
Avatar billede pidgeot Nybegynder
05. august 2008 - 14:45 #14
Som sagt skal jeg ikke have point denne gang - jeg har alligevel rigeligt :)
Avatar billede duqe Nybegynder
05. august 2008 - 19:35 #15
Kan jeg få dette til at virke:

mysql_query("UPDATE vip SET slutdato = date_add($slutdato, interval 1 year) WHERE id='$id' LIMIT 1");
Avatar billede jakobdo Ekspert
05. august 2008 - 20:16 #16
Det burde du godt kunne få til at virke ja.
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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