Jeg tror, at du holder dine dato-tidsværdier i feltet DATETIME
ville være en slags naturlig måde.
Fra min egen erfaring med min nuværende PHP-applikation, kun read
/ write
handlinger vedrørende disse oplysninger kan være problematiske.
En af mulige løsninger (forudsat at du bruger DATETIME
datatype) til korrekt udførelse af hele processen kunne være følgende tilgang:
Læsning af DATETIME-værdier til PHP-brug
- Hent
DATETIME
felter fra din database, der konverterer dem i forespørgslen til strengrepræsentation i form af'2011-10-02T23:25:42Z'
ved at brugeDATE_FORMAT
MySQL-funktion med'%Y-%m-%dT%H:%i:%sZ'
formateringsstreng (dokumenter den DATE_FORMAT ) - Læs den hentede kolonneværdi i dette specifikke format, og konverter den i PHP fra streng til repræsentation af dato og klokkeslæt, der er gyldig for PHP (såsom
DateTime
klasseobjekter ogDateTime::createFromFormat
statisk metode givet'Y-m-d\TH:i:s\Z'
formateringsstreng (T
ogZ
er escaped for at undgå at behandle dem som formateringsdirektiver) (dokumenter til metoden ). - Brug konverterede værdier som reelle dato-tidsværdier med al den logik, der er relevant, f.eks. sammenligning af rigtige dato (ikke tekstsammenligninger) osv.
Skrivning af PHP dato-tid til MySQL-database
- Konverter dvs. PHP
DateTime
klasseobjekt til vores ISO 8601 i UTC-format strengrepræsentation ved hjælp afDateTime
klasseobjektetsformat
metode med det samme som før'Y-m-d\TH:i:s\Z'
formateringsstreng (dokumentation ). - Udfør
INSERT
/UPDATE
operation på databaseinformation ved hjælp af en sådan forberedt streng som en parameter for MySQL-funktionenSTR_TO_DATE
(med'%Y-%m-%dT%H:%i:%sZ'
formateringsstreng), som konverterer den til den rigtige databaseDATETIME
værdi (dokumenter den STR_TO_DATE ).
Eksempelkode i PHP
Nedenfor kan du finde et udkast til eksempel på en sådan fremgangsmåde ved brug af PDO-objekter:
$db = new PDO('mysql:host=localhost;dbname=my_db;charset=utf8', 'username', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
// run the query aquring 1 example row with DATETIME data
// converted with MySQL DATE_FORMAT function to its string representation
// in the chosen format (in our case: ISO 8601 / UTC)
$stmt = $db->query("SELECT DATE_FORMAT(dt_column, '%Y-%m-%dT%H:%i:%sZ') AS formatted_dt_col"
." FROM your_table LIMIT 1");
if($stmt !== FALSE) {
$row = $stmt->fetch(PDO::FETCH_ASSOC);
// convert the acquired string representation from DB
// (i.e. '2011-10-02T23:25:42Z' )
// to PHP DateTime object which has all the logic of date-time manipulation:
$dateTimeObject = DateTime::createFromFormat('Y-m-d\TH:i:s\Z', $row['formatted_dt_col']);
// the following should print i.e. 2011-10-02T23:25:42Z
echo $dateTimeObject->format('Y-m-d\TH:i:s\Z');
// now let's write PHP DateTime class object '$dateTimeObject'
// back to the database
$stmtInsertDT = $db->prepare("INSERT INTO your_table(dt_column) "
. " VALUES ( STR_TO_DATE(:par_formatted_dt_column, '%Y-%m-%dT%H:%i:%sZ') )");
$dtAsTextForInsert = $dateTimeObject->format('Y-m-d\TH:i:s\Z');
// convert '$dateTimeObject' to its ISO 8601 / UTC text represantation
// in order to be able to put in in the query using PDO text parameter
$stmtInsertDT->bindParam(':par_formatted_dt_column', $dtAsTextForInsert, PDO::PARAM_STR);
$stmtInsertDT->execute();
// So the real insert query being perform would be i.e.:
/*
INSERT INTO your_table(dt_column)
VALUES ( STR_TO_DATE('2011-10-02T23:25:42Z', '%Y-%m-%dT%H:%i:%sZ') )
*/
}
}
catch(\PDOException $pexc) {
// serve PDOException
}
catch(\Exception $exc) {
// in case of no-PDOException, serve general exception
}
Denne tilgang hjalp mig meget med at betjene dato-tidsværdier mellem PHP og MySQL-database.
Jeg håber, det kan være nyttigt for dig også.