Мисля, че запазването на вашите стойности за дата и час в поле от тип DATETIME
би било по естествен начин.
От моя собствен опит с текущото ми PHP приложение, само read
/ write
операциите, свързани с тази информация, може да са проблематични.
Едно от възможните решения (ако приемем, че използвате DATETIME
тип данни) за правилното изпълнение на целия процес може да бъде следният подход:
Четене на стойности за DATETIME за използване на PHP
- Получете
DATETIME
полета от вашата база данни, като ги преобразува в заявката към низово представяне под формата на'2011-10-02T23:25:42Z'
като използватеDATE_FORMAT
MySQL функция с'%Y-%m-%dT%H:%i:%sZ'
форматиращ низ (документи на DATE_FORMAT ) - Прочетете извлечената стойност на колона в този конкретен формат и я преобразувайте в PHP от низ в реално представяне на дата и време, валидно за PHP (като
DateTime
клас обекти иDateTime::createFromFormat
статичен метод, даден'Y-m-d\TH:i:s\Z'
форматиращ низ (T
иZ
са екранирани, за да се избегне третирането им като директиви за форматиране) (документи за метода ). - Използвайте преобразуваните стойности като стойности за реална дата и време с цялата приложима логика, като сравнения на реални дати (не текстови сравнения) и т.н.
Записване на PHP дата-час в MySQL база данни
- Конвертиране, т.е. PHP
DateTime
обект на клас към нашия ISO 8601 в низово представяне във формат UTC с помощта наDateTime
format
на обекта на класа метод със същия като преди'Y-m-d\TH:i:s\Z'
форматиращ низ (документация ). - Извършете
INSERT
/UPDATE
операция с информация за база данни, използвайки такъв подготвен низ като параметър за функцията MySQLSTR_TO_DATE
(с'%Y-%m-%dT%H:%i:%sZ'
форматиращ низ), който го преобразува в реална база данниDATETIME
стойност (документи на STR_TO_DATE ).
Примерен код в PHP
По-долу, моля, намерете чернова пример за такъв подход с използване на 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
}
Този подход ми помогна много при работа със стойности за дата и час между PHP и MySQL база данни.
Надявам се, че може да се окаже полезно и за вас.