Je pense que garder vos valeurs date-heure dans le champ de type DATETIME
serait un peu naturel.
D'après ma propre expérience avec mon application PHP actuelle, seulement read
/ write
les opérations concernant ces informations peuvent être problématiques.
Une des solutions possibles (en supposant que vous utilisez DATETIME
type de données) pour exécuter correctement l'ensemble du processus pourrait être l'approche suivante :
Lecture des valeurs DATETIME pour une utilisation PHP
- Acquérir
DATETIME
les champs de votre base de données en les convertissant dans la requête à la représentation de chaîne sous la forme de'2011-10-02T23:25:42Z'
en utilisantDATE_FORMAT
Fonction MySQL avec'%Y-%m-%dT%H:%i:%sZ'
chaîne de formatage (documents sur DATE_FORMAT ) - Lire la valeur de la colonne récupérée dans ce format spécifique et la convertir en PHP d'une chaîne à une représentation date-heure réelle valide pour PHP (telle que
DateTime
objets de classe etDateTime::createFromFormat
méthode statique donnée'Y-m-d\TH:i:s\Z'
chaîne de formatage (T
etZ
sont échappés pour éviter de les traiter comme des directives de formatage) (docs pour la méthode ). - Utilisez des valeurs converties comme des valeurs date-heure réelles avec toute la logique applicable, comme des comparaisons de dates réelles (et non des comparaisons de texte), etc.
Écrire la date et l'heure PHP dans la base de données MySQL
- Convertir c'est-à-dire PHP
DateTime
objet de classe à notre ISO 8601 dans la représentation de chaîne au format UTC en utilisantDateTime
format
de l'objet de classe méthode avec la même qu'avant'Y-m-d\TH:i:s\Z'
chaîne de formatage (documentation ). - Effectuer
INSERT
/UPDATE
opération sur les informations de la base de données en utilisant une telle chaîne préparée comme paramètre pour la fonction MySQLSTR_TO_DATE
(avec'%Y-%m-%dT%H:%i:%sZ'
chaîne de formatage) qui la convertit en base de données réelleDATETIME
valeur (documents le STR_TO_DATE ).
Exemple de code en PHP
Vous trouverez ci-dessous un exemple préliminaire d'une telle approche utilisant des objets PDO :
$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
}
Cette approche m'a beaucoup aidé à exploiter les valeurs date-heure entre PHP et la base de données MySQL.
J'espère que cela vous sera également utile.