Який правильний формат для передачі date()функції в PHP, якщо я хочу вставити результат у datetimeстовпець типу MySQL ?
Я намагався, date("Y-M-D G:i:s")але це просто вставляє "0000-00-00 00:00:00" кожного разу.
Який правильний формат для передачі date()функції в PHP, якщо я хочу вставити результат у datetimeстовпець типу MySQL ?
Я намагався, date("Y-M-D G:i:s")але це просто вставляє "0000-00-00 00:00:00" кожного разу.
Відповіді:
Проблема полягає в тому, що ви використовуєте 'M'і 'D', які є текстуальні уявлення, MySQL очікує числове уявлення формату2010-02-06 19:30:13
Спробуйте: date("Y-m-d H:i:s")який використовує числові еквіваленти.
редагувати: перемкнено Gна H, хоча це може не мати впливу, можливо, ви хочете використовувати 24-годинний формат із провідними 0.
З коментарів php's date() сторінки керівництва :
<?php $mysqltime = date ("Y-m-d H:i:s", $phptime); ?>
У вас було правильне значення "Y" - це повний рік, але "M" - це тризначний місяць, тоді як "m" - двозначний місяць. Те саме питання з "D" замість "d". 'G' - це 1 або 2 цифри години, де 'H' завжди має провідний 0, коли це необхідно.
Ось альтернативне рішення: якщо у вас є дата в PHP як часова мітка, обійдіть її обробкою з PHP і дозвольте БД подбати про її перетворення за допомогою FROM_UNIXTIMEфункції.
mysql> insert into a_table values(FROM_UNIXTIME(1231634282));
Query OK, 1 row affected (0.00 sec)
mysql> select * from a_table;
+---------------------+
| a_date |
+---------------------+
| 2009-01-10 18:38:02 |
+---------------------+
Я використовую наступний код PHP для створення змінної, яку я вставляю в колонку DATETIME MySQL.
$datetime = date_create()->format('Y-m-d H:i:s');
Це дозволить утримувати поточну дату та час на сервері.
$date_old = '23-5-2016 23:15:23';
//Date for database
$date_for_database = date ("Y-m-d H:i:s", strtotime($date_old));
//Format should be like 'Y-m-d H:i:s'`enter code here`
Відформатуйте часову марку в стовпець MySQL DATETIME:
strftime('%Y-%m-%d %H:%M:%S',$timestamp);
Я використовую цю функцію (PHP 7)
function getDateForDatabase(string $date): string {
$timestamp = strtotime($date);
$date_formated = date('Y-m-d H:i:s', $timestamp);
return $date_formated;
}
Старіші версії PHP (PHP <7)
function getDateForDatabase($date) {
$timestamp = strtotime($date);
$date_formated = date('Y-m-d H:i:s', $timestamp);
return $date_formated;
}
function getDateForDatabase(string $date) : string {до function getDateForDatabase($date) {Чому декларації типу видають помилку, я не знаю достатньо PHP.
Якщо ви не використовуєте часову позначку, не потрібно використовувати метод date () від PHP. Якщо datepostedстовпець дати, ви можете вставити поточну дату так:
$db->query("INSERT INTO table (dateposted) VALUES (now())");
Це зводило мене з розуму, шукаючи просту відповідь. Нарешті я зробив цю функцію, яка, схоже, вловлює весь вхід і дає хороший рядок SQL, який є правильним або, принаймні, дійсним і перевіряється. Якщо це 1999-12-31, це, мабуть, неправильно, але не призведе до помилки в MySQL.
function MakeSQLDate($date) {
if (is_null($date)) {
//use 1999-12-31 as a valid date or as an alert
return date('Y-m-d', strtotime('1999-12-31'));
}
if (($t = strtotime($date)) === false) {
//use 1999-12-31 as a valid date or as an alert
return date('Y-m-d', strtotime('1999-12-31'));
} else {
return date('Y-m-d H:i:s', strtotime($date));
}
}
Використання DateTimeкласу в PHP7 +:
function getMysqlDatetimeFromDate(int $day, int $month, int $year): string {
$dt = new DateTime();
$dt->setTimezone(new DateTimeZone('UTC'));
$dt->setDate($year, $month, $day);
$dt->setTime(0, 0, 0, 0); // set tine to midnight
return $dt->format("Y-m-d H:i:s");
}
Невеликий додаток до прийнятої відповіді: Якщо база даних datetimeзберігається як UTC (що я завжди роблю), ви повинні використовувати gmdate("Y-m-d H:i:s")замість цього date("Y-m-d H:i:s").
Або, якщо ви вважаєте за краще дозволити MySQL впоратись із усім, як підказують деякі відповіді, я б вставив MySQL UTC_TIMESTAMP з таким же результатом.
Примітка. Я зрозумів питання, що стосується поточного часу.
Це більш точний спосіб зробити це. Він розміщує десяткові знаки за секунди, що забезпечує більшу точність.
$now = date('Y-m-d\TH:i:s.uP', time());
Зауважте .uP.
Докладніше: https://stackoverflow.com/a/6153162/8662476