Format PHP date () lors de l'insertion dans datetime dans MySQL


324

Quel est le format correct à passer à la date()fonction en PHP si je veux insérer le résultat dans une datetimecolonne de type MySQL ?

J'ai essayé date("Y-M-D G:i:s")mais cela insère juste "0000-00-00 00:00:00" à chaque fois.


3
étant donné que vous ne fournissez pas de paramètre à ce jour, voulez-vous réellement enregistrer l'heure actuelle?
Mark Elliot

Réponses:


680

Le problème est que vous utilisez 'M'et 'D', qui sont des représentations textuelles, MySQL attend une représentation numérique du format2010-02-06 19:30:13

Essayez: date("Y-m-d H:i:s")qui utilise les équivalents numériques.

edit: basculé Gsur H, bien que cela n'ait pas d'impact, vous souhaiterez probablement utiliser le format 24 heures avec les 0 en tête.


28
il doit s'agir de l'un des formats de datetime les plus courants dont tout le monde aurait besoin. devrait être une fonction php globale intégrée ou faire partie de la fonction de date elle-même (par exemple, 'c', 'r')
billynoah

33
Pourquoi ce n'est pas le cas, je ne sais pas. Je dois faire référence au débordement de pile à chaque fois. Célibataire. fonctionnement. temps.
Mazatec

11
Il est plus rapide de venir ici que de rechercher dans mon code une utilisation comme celle-ci.
MRodrigues

64
Je pensais juste que d'un mnémotechnique pour se souvenir mignon format: « Y notre m y d a mangé pas son ». fonctionne à tellement de niveaux :)
IzzEps

2
Il devrait y avoir un raccourci php pour cela comme pour ISO 8601 et RFC 2822
billynoah

105

D'après les commentaires de la date()page de manuel de php :

<?php $mysqltime = date ("Y-m-d H:i:s", $phptime); ?>

Vous aviez le «Y» correct - c'est une année complète, mais «M» est un mois à trois caractères, tandis que «m» est un mois à deux chiffres. Même problème avec «D» au lieu de «d». 'G' est une heure à 1 ou 2 chiffres, où 'H' a toujours un 0 en tête si nécessaire.


1
Merci @Pekka - Je me souviens quand vous et moi avions à peu près le même représentant - vous avez été assez actif.
Tim Lytle

1
oui, je travaille beaucoup en ce moment, et donc c'est mon passe-temps préféré entre les deux :) qui changera à nouveau.
Pekka

41

Voici une solution alternative: si vous avez la date en PHP comme horodatage, contournez-la en la manipulant avec PHP et laissez la base de données se charger de la transformer en utilisant la FROM_UNIXTIMEfonction.

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 |
+---------------------+

Ceci est une solution élégante.Merci :)
kta

2
@trejder, Qui vous a dit que le faire dans mysql est plus rapide que le faire dans php? Il est préférable de le faire en PHP car la base de données est généralement le goulot d'étranglement et vous souhaitez entrer et sortir dès que possible .
Pacerier

1
@Pacerier the DB est le goulot d'étranglement si vous avez une base de données mal construite, ou si vous exécutez trop de petites requêtes au lieu d'une requête unique efficace plus robuste, ou dans de nombreux cas si vous comptez sur un ORM pour gérer la base de données. Solid SQL avec une base de données relationnelle bien indexée n'est pas lent.
mopsyd

2
@mopsyd, La base de données est le goulot d'étranglement car sa mise à l'échelle horizontale nécessite de la complexité. Comparez cela aux serveurs Web qui peuvent être dupliqués à travers le monde sans aucune modification de code.
Pacerier

1
Si la requête échoue, est enregistrée quelque part et que vous devez la déboguer, l'horodatage est beaucoup plus difficile à lire que la chaîne de date formatée décrite par @ tim-lytle.
humbads

27

J'utilise le code PHP suivant pour créer une variable que j'insère dans une colonne MySQL DATETIME.

$datetime = date_create()->format('Y-m-d H:i:s');

Cela contiendra la date et l'heure actuelles du serveur.


12
$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`

2
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant pourquoi et / ou comment il répond à la question améliorerait considérablement sa valeur à long terme. Veuillez modifier votre réponse pour ajouter des explications et résoudre vos problèmes de formatage.
Toby Speight

9

Formater l'horodatage dans la colonne MySQL DATETIME:

strftime('%Y-%m-%d %H:%M:%S',$timestamp);

8

Formater le datetime MySQL avec PHP

$date = "'".date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $_POST['date'])))."'";

8

J'utilise cette fonction (PHP 7)

function getDateForDatabase(string $date): string {
    $timestamp = strtotime($date);
    $date_formated = date('Y-m-d H:i:s', $timestamp);
    return $date_formated;
}

Anciennes versions de PHP (PHP <7)

function getDateForDatabase($date) {
    $timestamp = strtotime($date);
    $date_formated = date('Y-m-d H:i:s', $timestamp);
    return $date_formated;
}

J'ai voté pour votre réponse car elle a fonctionné après avoir modifié la première ligne; function getDateForDatabase(string $date) : string {à function getDateForDatabase($date) {Pourquoi les déclarations de type jettent une erreur que je ne connais pas assez PHP pour le dire.
Chris Pink

"L'argument 1 passé à getDateForDatabase () doit être une instance de chaîne, chaîne donnée," - mon entrée était une chaîne,
Chris Pink

7

Il n'est pas nécessaire d'utiliser la méthode date () de PHP si vous n'utilisez pas d'horodatage. S'il dateposteds'agit d'une colonne datetime, vous pouvez insérer la date actuelle comme ceci:

$db->query("INSERT INTO table (dateposted) VALUES (now())");

2
Merci de partager cette approche. C'est la méthode la plus simple que j'ai vue jusqu'à présent.
Shondeslitch

2

Cela m'a rendu fou à la recherche d'une réponse simple. Enfin, j'ai fait cette fonction qui semble intercepter toutes les entrées et donner une bonne chaîne SQL correcte ou au moins valide et vérifiable. Si c'est 1999-12-31, c'est probablement faux, mais ne générera pas une mauvaise erreur dans 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));
    }
}

1

Utiliser la DateTimeclasse en 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");
}

1

Un petit addendum à la réponse acceptée: si la base de données datetimeest stockée en UTC (ce que je fais toujours), vous devez utiliser à la gmdate("Y-m-d H:i:s")place de date("Y-m-d H:i:s").

Ou, si vous préférez laisser MySQL gérer tout, comme certaines réponses le suggèrent, j'insérerais MySQL UTC_TIMESTAMP, avec le même résultat.

Remarque: j'ai compris la question concernant l'heure actuelle.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.