Datoer i PHP og MySQL
Mange gange har jeg hevet mig selv i håret og været virkelig irriteret over at der er flere forskellige tidsformater mellem PHP oh MySQL.
Der er Unix timestamp - og sĂĄ er der sĂĄ lige oveni - at MySQL hĂĄndterer tre forskellige typer dato stempler.
Her i de næste trin vil jeg beskrive problemet - og komme med et forslag til løsningen.
Unix timestamp // Unix tidsstempel
PHP bruger som standard Unix tidsstempel (timestamp) til samtlige tider. Dog har PHP utrolig mange mĂĄder, at dette tidsstempel kan konverteres til forskellige skrevne formater.
En timestamp er faktisk bare et tal - et temmelig stort tal.
For eksempel er denne dato:
25. februar 1992 klokken 23:44:59 i Unix tidsstempel 699061499
Unix tidsstempel er i princippet bare - det antal sekunder - der er gĂĄet siden midnat den 1. januar 1970 Greenwich mean time (GMT).
MySQL's tidsmĂĄling
MySQL derimod har tre forskellige måder at lægge tider i databasen. Disse måder er DATETIME (nok oftest brugt), DATE og TIMESTAMP.
DATETIME gemmer datoen ved at skrive f.eks.
25. februar 1992 klokken 23:44:59 er i DATETIME = 1992-02-25 23:44:59 i formatet YYYY-MM-DD HH:MM:SS
DATE gemmer kort sagt kun datoen - som er eksempelvis:
25. februar 1992 gemt som 1992-02-25 i formatet YYYY-MM-DD
For at fuldende det hele - har MySQL ogsĂĄ en sidste type mĂĄling af tid - kaldet TIMESTAMP.
For at gøre forvirringen total - har MySQL's TIMESTAMP absolut intet at gøre med PHP's UNIX timestamp - et MySQL TIMESTAMP er ganske simpelt em DATETIME kolonne der opdatere sig hver eneste gang indholdet af den specifikke data post ændres.
OvenstĂĄende er simplificeret forklaring af hvad en MySQL tid er - men basalt set er den sand.
Problemet mellem de individuelle mĂĄlemetoder
Problemet mellem de individuelle målemetoder er at der IKKE er en direkte sammenhæng. PHP måler i tal - og MySQL måler i "DATO systemer".
Løsningen // Løsningerne
Løsningen må være at finde en måde at konvertere mellem de to systemer - og reelt set er der tre måder at gøre det på.
Løsning #1 (Lad PHP gøre arbejdet).
Den mest brugte løsningsmetode er at konvertere mellem de to systemer med PHP's strtotime funktion, dette er en intelligent funktion der kan finde ud af hvad en UNIX Timestamp er af en MySQL dato - og vise versa.$mysqldato = date( 'Y-m-d H:i:s', $phpdato );
og
$phpdato = strtotime( $mysqldato );
I ovenstående eksempel - sættes i første linie $mysqldato til at være i formattet YYYY-MM-DD HH:MM:SS forklaret ovenfor. Koden ovenfor er lavet ud fra antagelsen - at der er defineret en $phpdato - som er i Unix timestamp formatet - og som kan "konverteres" til $mysqldato.
* Man kan lave en unix timestamp dato - ved at kalde time(); kommandoen:
$phpdato = time();
Løsning #2 (Lad MySQL gøre arbejdet).
MySQL har ogsĂĄ funktioner til at konvertere fra og til UNIX timestamp.FROM_UNIXTIME vil konvertere fra PHP's tidsstempel -> til DATETIME
og
UNIX_TIMESTAMP vil konvertere fra DATETIME til PHP's tidsstempel.
Selve metoderne køres inde fra MySQLs SQL forespørgsler som nedenfor:
$query = "UPDATE table SET
datetimefelt = FROM_UNIXTIME($phpdato)
WHERE...";
og
$query = "SELECT UNIX_TIMESTAMP(datetimefelt)
FROM table WHERE...";
Løsning #3 (brug PHP's tidsstempel over alt).
De fleste programmører har prøvet at hælde til denne løsning, da det er noget nemmere at have med at gøre.I hvert fald indtil man skal til at søge i databasen efter f.eks. hændelser indenfor en vis tidsramme. Så bliver det pludselig meget mere kompliceret.
Hvis man bruger denne løsning, vil det være nemt at sætte tiderne ind og trække dem ud af databasen til en hver tid. De vil jo bare gemmes i et datafelt integer.
Denne løsning er ganske okay til mindre databaser og systemer. Men jeg vil ikke anbefale den hvis du skal programmere en side som f.eks. PHP Tips.dk eller Facebook.
Opsummering
For at opsummere - så vil de fleste nybegyndere have det bedst med at bruge løsning #1.
Men har du en temmelig krævende side - så ville du måske vælge løsning #1 hvis du har rigtig meget CPU kraft - eller løsning #2 hvis du har rigtig meget RAM.
Kommentarer: