Ce este formatul corect pentru a trece la data()
funcția în PHP dacă vreau să introduceți rezultatul într-un MySQL "datetime" tip coloană?
Am'am fost încercarea de `data("Y-M-D, G:i:s") dar asta doar insertii "0000-00-00 00:00:00" de fiecare dată.
Problema e ca tu're folosind 'M' " și " 'D', care sunt reprezentări textuale, MySQL se așteaptă la o reprezentare numerică a format
2010-02-06 19:30:13`
Încercați: data de("Y-m-d H:i:s")
care foloseste numerice echivalente.
edit: a trecut " G " la "H", deși poate să nu aibă impact, probabil că doriți să utilizați formatul de 24 de ore cu lider 0.
Din comentariile de php's data()
pagină de manual:
<?php $mysqltime = date ("Y-m-d H:i:s", $phptime); ?>
Ai avut 'Y' corect - ca's un an plin, dar 'M' este o trei caractere lună, în timp ce 'm' este o două cifre lună. Aceeași problemă cu 'D' în loc de 'd'. 'G' este un 1 sau 2 cifre oră, unde 'Sec' are întotdeauna un lider 0 atunci când este necesar.
Aici's o soluție alternativă: dacă aveți data in PHP ca un timestamp, by-pass de manipulare cu PHP si lasa DB grijă de a-l transforma, cu ajutorul `FROM_UNIXTIME funcția.
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 |
+---------------------+
Eu folosesc această funcție (PHP 7)
function getDateForDatabase(string $date): string {
$timestamp = strtotime($date);
$date_formated = date('Y-m-d H:i:s', $timestamp);
return $date_formated;
}
Versiunile mai vechi de PHP (PHP < 7)
function getDateForDatabase($date) {
$timestamp = strtotime($date);
$date_formated = date('Y-m-d H:i:s', $timestamp);
return $date_formated;
}
Acest lucru a fost de conducere mine nebun în căutarea pentru un răspuns simplu. În cele din urmă am făcut această funcție, care pare a prinde toate de intrare și să dea un bun SQL string că este corectă sau cel puțin valid și verificabil. Daca's 1999-12-31 l's, probabil, greșit, dar a câștigat't arunca o eroare gravă în 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));
}
}
Folosind "DateTime" clasa în 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");
}
Un mic addendum a acceptat răspunsul: Dacă baza de date "datetime" este stocată ca UTC (ceea ce fac mereu), ar trebui să utilizați gmdate("Y-m-d H:i:s") "în loc de" data("Y-m-d H:i:s")
.
Sau, dacă preferați să lăsați MySQL se ocupe de tot, ca niște răspunsuri sugerează, mi-ar introduce MySQL's UTC_TIMESTAMP
, cu același rezultat.
Notă: am înțeles întrebarea referindu-se la ora actuală.
Acesta este un mod mai precis de a face. Locuri zecimale spatele câteva secunde a da mai multă precizie.
php $acum = data('Y-m-d\ - LEA:i:s.sus', time());
Observa .sus
.
Mai multe informatii: https://stackoverflow.com/a/6153162/8662476