Enregistrer une date dans MySQL

Signaler
Messages postés
11
Date d'inscription
samedi 13 septembre 2008
Statut
Membre
Dernière intervention
4 juillet 2012
-
Messages postés
11
Date d'inscription
samedi 13 septembre 2008
Statut
Membre
Dernière intervention
4 juillet 2012
-
Bonjour,

Je n'arrive pas à enregistrer une variable date dans un champs type 'date' de ma BDD.
J'ai éssayé diverses solutions, mais au mieux j'arrive à afficher la variable sur ma page web (au bon format apparement : aaaa-mm-jj) avec un echo.
Mais ma BDD n'enregistre rien, même pas les autres valeurs ??? Alors que si je supprime la variable date de ma commande SQL, les autres champs réagissent correctement.
Voici mon script, ou est l'erreur ?

<?php
if (isset($_POST['immat']) AND isset($_POST['marque']))
{
$immat = $_POST['immat'];

$annee = $_POST['annee'];
$mois = $_POST['mois'];
$jour = $_POST['jour'];
$date = new DateTime();
$date->setDate($annee, $mois, $jour);
$dateimm = date_format($date, 'Y m d');

$marque = $_POST['marque'];

mysql_pconnect("localhost", "root", "") ;
mysql_select_db("vehicule") ;


mysql_query (" INSERT INTO identification (id, immat, date-imm, marque) VALUES('', '$immat', '$dateimm', '$marque') ") ;


}
exit;
?>

14 réponses

Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
16
SELECT *,DATE_FORMAT(date-imm,"%d/%m/%Y à %H:%i:%s") AS datetime_fr

et

echo 'Date en fr '.$rows['datetime_fr'].'
;
Messages postés
7
Date d'inscription
samedi 5 avril 2008
Statut
Membre
Dernière intervention
1 novembre 2010
1
Salut,
essai d'envoyer ta date sous forme de texte comme suit : "aaaa-mm-jj" par exemple "2010-11-01" pour le 1er novembre 2010.
En résumé ta variable $dateimm' doit recevoir une chaine de caractères.
Bonne journée
Messages postés
11
Date d'inscription
samedi 13 septembre 2008
Statut
Membre
Dernière intervention
4 juillet 2012

Non, çà ne ne fonctionne pas ! ou alors il faut mettre le champ en text, mais je veut pouvoir récupérer les dates pour effectuer des fonctions sur les dates (DATEDIFF, ADDTIME ...)
Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
16
mysql_query (" INSERT INTO identification (id, immat, date-imm, marque) VALUES('', '$immat', 'now()', '$marque') ") ;

- now() fonction mysql qui le fait pour toi
- le champs dans la table doit etre de type date ou datetime
- tu peux recuperer la date en fr direct avec le format smil

$sql='select *,DATE_FORMAT(date,"%d/%m/%Y à %H:%i:%s") AS datetime_fr from '.$table.' where numero='.$id.' limit 1';

echo 'Date en fr '.$rows['datetime_fr'].'
;
Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
16
*,DATE_FORMAT(date,"%d/%m/%Y à %H:%i:%s")

en rouge le nom de ton champs de la table
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27
Salut,

Ce qu'il faudrait en priorité faire :
- traiter les données provenant du formulaire ($_POST)
Sans ça tu ouvres des failles de sécurité importante, mais également des bugs légitimes => cf mysql_real_escape_string()
- gérer les erreurs et les afficher (pour le debug seulement) :
if(false === mysql_query(...)) exit('erreur SQL :
'.mysql_error());

@Cod57:

- now() fonction mysql qui le fait pour toi

OK, mais en l'occurrence les données proviennent d'un formulaire, rien ne dit qu'il s'agisse du timestamp actuel.

@Gerardsud :
Non, çà ne ne fonctionne pas !

Peut on voir comment tu as implémenté la recommandation de Sentouhi (car il a raison) ?
Une date est à passer en string à MySQL, sous le format qui va bien. C'est ensuite le type de champ qui définie le contenu.

@Sentouhi
En résumé ta variable $dateimm' doit recevoir une chaine de caractères.

Elle l'est déjà, c'est le format qui semble ne pas aller.

Cordialement,

Kohntark -
Messages postés
11
Date d'inscription
samedi 13 septembre 2008
Statut
Membre
Dernière intervention
4 juillet 2012

Bonjour à tous,

J'avance pas.
Faut dire que je suis pas un expert.

Pour préciser mon problème, les dates sont saisies par l'utilisateur dans des champs select du formulaire que je traite ainsi :

$annee = $_POST['annee'];
$mois = $_POST['mois'];
$jour = $_POST['jour'];
$date = new DateTime();
$date->setDate($annee, $mois, $jour);
$dateimm = date_format($date, 'Y m d'); // là j'ai éssayé de mettre des tirets, des points ou autre slash sans résultat.

Et sans vouloir m'avancer je pencherai pour l'avis de Kohntark :

En résumé ta variable $dateimm' doit recevoir une chaine de caractères.


Elle l'est déjà, c'est le format qui semble ne pas aller.

Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27
J'avance pas.
Faut dire que je suis pas un expert.

Peux tu m'expliquer pourquoi tu n'avances pas ?

Tu redonnes le même code alors que l'on t'a dit :
- d'utiliser le format "aaaa-mm-jj", et pas "aaaa mm jj"
- d'utiliser mysql_real_escape_string() pour les données provenant du formulaire ($_POST)
- de gérer les erreurs et les afficher
- ...

En 1 mot : tu as tous les éléments pour que ça fonctionne.
A toi donc de modifier ton script en conséquence et de nous informer du résultat.

Cordialement,

Kohntark -
Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
16
Kohntark a raison sécurise ton script avec mysql_real_escape_string() au moins ...

Je crois comprendre !

select jour de 0 à 31 name=jour --> $jour = $_POST['jour']
select mois de 1 à 12 name=mois --> $mois = $_POST['mois']
select annee de x à y name=annee --> $annee = $_POST['annee']

puis tu concanéte // YYYY-MM-DD FORMAT ENGLISH

MYSQL ne comprend pas le format français jj-mm-aaaa

$dateimm = $annee.'-'.$mois.'-'.$jour;

à la place de

$date->setDate($annee, $mois, $jour);
$dateimm = date_format($date, 'Y m d');

//mysql comprendra

//tu inséres INSERT ...

PUIS VERIFIER DANS TA TABLE
Messages postés
11
Date d'inscription
samedi 13 septembre 2008
Statut
Membre
Dernière intervention
4 juillet 2012

Je vous avez bien dit que je ne suis pas un expert !

L'erreur n'est du tout là ou on cherche, c'est tout bêtement le nom de mon champ : date-imm. Il suffit de supprimer le tirer : dateimm, et ça fonctionne.
Merci à vous quand même.
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27
C'est bien ce qui avait été dit en début de semaine :

- gérer les erreurs et les afficher (pour le debug seulement) :
if(false === mysql_query(...)) exit('erreur SQL :
'.mysql_error());


... tu ne l'avais pas fait, sinon tu aurais tout de suite vu cette erreur, et les autres

- d'utiliser le format "aaaa-mm-jj", et pas "aaaa mm jj"

Ca m'étonnerais fort que tu n'ai pas respecté ça (mysql refuse le second format)


les dates sont saisies par l'utilisateur dans des champs select du formulaire que je traite ainsi

C'est une très mauvaise idée de procéder ainsi !
Qu'est ce qui empêche une personne de saisir 31/02/2010 ? (etc ...)
Tu vas te retrouver avec des dates totalement fausses
Par exemple à la place de 2010-02-31 tu auras 2010-03-03.

Quant à faire ça :
$dateimm = $annee.'-'.$mois.'-'.$jour; 

C'est encore pire, enfin si l'on peut dire.

L'idéal est d'utilisé un calendrier Javascript qui va tout de suite proposer à l'utilisateur des dates valides (il y en a plein sur le net)
Cela ne te dispensera pas pour autant d'effectuer un rapide contrôle côté serveur, comme pour toutes les données provenant de l'utilisateur.

Cordialement,

Kohntark -
Messages postés
1654
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
16
@SALUT Kohntark -

Pourquoi n'aimes tu pas now(), généralement les serveurs sont à l'heure ?
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
27
Salut Cod57,

Pourquoi n'aimes tu pas now(), généralement les serveurs sont à l'heure ?

Bien sur qu'ils sont à l'heure, encore faut il définir le fuseau horaire and co.
Le problème n'est pas là :
OK, mais en l'occurrence les données proviennent d'un formulaire, rien ne dit qu'il s'agisse du timestamp actuel.

Pour préciser un peu :
Il s'agit d'une date qui est choisie, via des select, par l'utilisateur.
Aucune chance que gerardsud demande à ses utilisateurs de saisir la date courante (== now())
Donc non, now() ne convient pas dans ce cas.

Cordialement,


Kohntark -
Messages postés
11
Date d'inscription
samedi 13 septembre 2008
Statut
Membre
Dernière intervention
4 juillet 2012

Je suis quasi débutant en PHP et j'apprend sur le tas.
Mon projet est destinée a une utilisation trés restreinte, donc je me contente de faire un truc aussi simple que possible. J'ai parfaitement conscience que mon script est loin d'être parfait, surtout niveau sécuritée.
L'essentiel dans un premier temps étant que ça fonctionne.
Merci pour votre aide, c'est grace à des forums comme celui ci que des personnes comme moi peuvent progresser.