Qual è il formato corretto da passare alla date()
funzione in PHP se voglio inserire il risultato in una datetime
colonna di tipo MySQL ?
Ci ho provato, date("Y-M-D G:i:s")
ma ogni volta inserisco semplicemente "registrazione 00:00:00".
Qual è il formato corretto da passare alla date()
funzione in PHP se voglio inserire il risultato in una datetime
colonna di tipo MySQL ?
Ci ho provato, date("Y-M-D G:i:s")
ma ogni volta inserisco semplicemente "registrazione 00:00:00".
Risposte:
Il problema è che stai usando 'M'
e 'D'
, che sono rappresentazioni testuali, MySQL si aspetta una rappresentazione numerica del formato2010-02-06 19:30:13
Prova: date("Y-m-d H:i:s")
che utilizza gli equivalenti numerici.
modifica: passato G
a H
, anche se potrebbe non avere impatto, probabilmente si desidera utilizzare il formato 24 ore con 0 iniziali.
Dai commenti della date()
pagina del manuale di php :
<?php $mysqltime = date ("Y-m-d H:i:s", $phptime); ?>
Hai avuto la "Y" corretta - è un anno intero, ma "M" è un mese di tre caratteri, mentre "m" è un mese di due cifre. Stesso problema con 'D' invece di 'd'. 'G' è un'ora a 1 o 2 cifre, dove 'H' ha sempre uno 0 iniziale quando necessario.
Ecco una soluzione alternativa: se hai la data in PHP come data e ora, evita di gestirla con PHP e lascia che il DB si occupi di trasformarla utilizzando la FROM_UNIXTIME
funzione.
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 |
+---------------------+
Uso il seguente codice PHP per creare una variabile che inserisco in una colonna DATETIME di MySQL.
$datetime = date_create()->format('Y-m-d H:i:s');
Ciò conterrà la data e l'ora correnti del server.
$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`
Formatta il timestamp nella colonna DATETIME di MySQL:
strftime('%Y-%m-%d %H:%M:%S',$timestamp);
Uso questa funzione (PHP 7)
function getDateForDatabase(string $date): string {
$timestamp = strtotime($date);
$date_formated = date('Y-m-d H:i:s', $timestamp);
return $date_formated;
}
Versioni precedenti di 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 {
a function getDateForDatabase($date) {
Perché le dichiarazioni di tipo generano un errore non conosco abbastanza PHP da dirlo.
Non è necessario utilizzare il metodo date () di PHP se non si utilizza un timestamp. Se dateposted
è una colonna datetime, puoi inserire la data corrente in questo modo:
$db->query("INSERT INTO table (dateposted) VALUES (now())");
Questo mi sta facendo impazzire in cerca di una risposta semplice. Alla fine ho realizzato questa funzione che sembra catturare tutti gli input e dare una buona stringa SQL che sia corretta o almeno valida e controllabile. Se è il 1999-12-31 è probabilmente sbagliato ma non genererà un errore errato in 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));
}
}
Utilizzando la DateTime
classe in 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 piccolo addendum alla risposta accettata: se il database datetime
è archiviato come UTC (cosa faccio sempre), è necessario utilizzare gmdate("Y-m-d H:i:s")
invece di date("Y-m-d H:i:s")
.
Oppure, se preferisci lasciare che MySQL gestisca tutto, come suggeriscono alcune risposte, inserirò MySQL UTC_TIMESTAMP
, con lo stesso risultato.
Nota: ho capito la domanda relativa all'ora corrente.
Questo è un modo più accurato per farlo. Posiziona i decimali dietro i secondi per una maggiore precisione.
$now = date('Y-m-d\TH:i:s.uP', time());
Notare il .uP
.
Ulteriori informazioni: https://stackoverflow.com/a/6153162/8662476