é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.
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
<?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.
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.
@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.
$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`
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:
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())");
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.
functionMakeSQLDate($date){if(is_null($date)){//use 1999-12-31 as a valid date or as an alertreturn date('Y-m-d', strtotime('1999-12-31'));}if(($t = strtotime($date))===false){//use 1999-12-31 as a valid date or as an alertreturn date('Y-m-d', strtotime('1999-12-31'));}else{return date('Y-m-d H:i:s', strtotime($date));}}
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.
Réponses:
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é
G
surH
, bien que cela n'ait pas d'impact, vous souhaiterez probablement utiliser le format 24 heures avec les 0 en tête.la source
D'après les commentaires de la
date()
page de manuel de php :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.
la source
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_UNIXTIME
fonction.la source
J'utilise le code PHP suivant pour créer une variable que j'insère dans une colonne MySQL DATETIME.
Cela contiendra la date et l'heure actuelles du serveur.
la source
la source
Formater l'horodatage dans la colonne MySQL DATETIME:
la source
Formater le datetime MySQL avec PHP
la source
J'utilise cette fonction (PHP 7)
Anciennes versions de PHP (PHP <7)
la source
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.Il n'est pas nécessaire d'utiliser la méthode date () de PHP si vous n'utilisez pas d'horodatage. S'il
dateposted
s'agit d'une colonne datetime, vous pouvez insérer la date actuelle comme ceci:la source
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.
la source
Utiliser la
DateTime
classe en PHP7 +:la source
Un petit addendum à la réponse acceptée: si la base de données
datetime
est stockée en UTC (ce que je fais toujours), vous devez utiliser à lagmdate("Y-m-d H:i:s")
place dedate("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.
la source
C'est une façon plus précise de le faire. Il place les décimales derrière les secondes pour plus de précision.
Remarquez le
.uP
.Plus d'informations: https://stackoverflow.com/a/6153162/8662476
la source