Enregistrer une date dans MySQL

gerardsud Messages postés 11 Date d'inscription samedi 13 septembre 2008 Statut Membre Dernière intervention 4 juillet 2012 - 1 nov. 2010 à 14:06
gerardsud Messages postés 11 Date d'inscription samedi 13 septembre 2008 Statut Membre Dernière intervention 4 juillet 2012 - 5 nov. 2010 à 05:32
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

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

et

echo 'Date en fr '.$rows['datetime_fr'].'
;
1
cs_sentouhi Messages postés 7 Date d'inscription samedi 5 avril 2008 Statut Membre Dernière intervention 1 novembre 2010 1
1 nov. 2010 à 16:04
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
0
gerardsud Messages postés 11 Date d'inscription samedi 13 septembre 2008 Statut Membre Dernière intervention 4 juillet 2012
1 nov. 2010 à 20:50
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 ...)
0
cod57 Messages postés 1654 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 20
2 nov. 2010 à 14:42
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'].'
;
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cod57 Messages postés 1654 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 20
2 nov. 2010 à 14:46
*,DATE_FORMAT(date,"%d/%m/%Y à %H:%i:%s")

en rouge le nom de ton champs de la table
0
kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
2 nov. 2010 à 23:00
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 -
0
gerardsud Messages postés 11 Date d'inscription samedi 13 septembre 2008 Statut Membre Dernière intervention 4 juillet 2012
3 nov. 2010 à 06:58
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.

0
kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
3 nov. 2010 à 07:29
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 -
0
cod57 Messages postés 1654 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 20
3 nov. 2010 à 14:08
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
0
gerardsud Messages postés 11 Date d'inscription samedi 13 septembre 2008 Statut Membre Dernière intervention 4 juillet 2012
4 nov. 2010 à 05:30
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.
0
kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
4 nov. 2010 à 08:05
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 -
0
cod57 Messages postés 1654 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 20
4 nov. 2010 à 11:25
@SALUT Kohntark -

Pourquoi n'aimes tu pas now(), généralement les serveurs sont à l'heure ?
0
kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
4 nov. 2010 à 21:46
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 -
0
gerardsud Messages postés 11 Date d'inscription samedi 13 septembre 2008 Statut Membre Dernière intervention 4 juillet 2012
5 nov. 2010 à 05:32
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.
0