Ik denk dat het houden van uw datum-tijd-waarden in het veld van het type DATETIME
zou een natuurlijke manier zijn.
Uit mijn eigen ervaring met mijn huidige PHP-toepassing, alleen read
/ write
bewerkingen met betrekking tot deze informatie kunnen problematisch zijn.
Een van de mogelijke oplossingen (ervan uitgaande dat u DATETIME
gebruikt) gegevenstype) voor het correct uitvoeren van het hele proces kan de volgende benadering zijn:
DATETIME-waarden lezen voor PHP-gebruik
- Verkrijg
DATETIME
velden uit uw database converteren ze in de query om representatie te stringen in de vorm van'2011-10-02T23:25:42Z'
doorDATE_FORMAT
. te gebruiken MySQL-functie met'%Y-%m-%dT%H:%i:%sZ'
opmaaktekenreeks (documenten op DATE_FORMAT ) - Lees de opgehaalde kolomwaarde in dit specifieke formaat en converteer deze in PHP van string naar echte datum-tijd-representatie die geldig is voor PHP (zoals
DateTime
class-objecten enDateTime::createFromFormat
statische methode gegeven'Y-m-d\TH:i:s\Z'
opmaakreeks (T
enZ
worden escaped om te voorkomen dat ze als opmaakrichtlijnen worden behandeld) (docs voor de methode ). - Gebruik geconverteerde waarden als echte datum-tijd-waarden met alle logica die van toepassing is, zoals echte datumvergelijkingen (geen tekstvergelijkingen), enz.
PHP date-time schrijven naar MySQL-database
- Converteren d.w.z. PHP
DateTime
class-object naar onze ISO 8601 in UTC-formaat tekenreeksrepresentatie met behulp vanDateTime
format
van klasseobject methode met dezelfde als voorheen'Y-m-d\TH:i:s\Z'
opmaaktekenreeks (documentatie ). - Voer
INSERT
uit /UPDATE
bewerking op database-informatie met behulp van een dergelijke voorbereide string als een parameter voor de MySQL-functieSTR_TO_DATE
(met'%Y-%m-%dT%H:%i:%sZ'
formatting string) die het converteert naar een echte databaseDATETIME
waarde (documenten op STR_TO_DATE ).
Voorbeeldcode in PHP
Hieronder vindt u een conceptvoorbeeld van een dergelijke benadering met gebruik van PDO-objecten:
$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
}
Deze aanpak heeft me veel geholpen bij het werken met datum-tijd-waarden tussen PHP en MySQL-database.
Ik hoop dat het ook voor jou nuttig kan zijn.