Problème date sql php

Résolu/Fermé
eric204044 Messages postés 33 Date d'inscription mercredi 30 juin 2010 Statut Membre Dernière intervention 15 septembre 2010 - 1 août 2010 à 14:37
eric204044 Messages postés 33 Date d'inscription mercredi 30 juin 2010 Statut Membre Dernière intervention 15 septembre 2010 - 1 août 2010 à 23:15
Bonjour à tous,
Voilà j'ai un petit problème, en fait je récupère une date sous la forme jj//mm/aaaa grace à un champ de type text
<input type="text" name="daterecup">
Cependant, je souhaite stocker cette date dans une base de données,j'ai donc utilisé un type varchar(10)mais je viens de m'apercevoir qu'en faisant un tri dessus, le tri est incorrect, je le pensais correct car il triait bien sur le jour mais il ne trie pas sur les mois, ni sur les années (ce qui est assez logique vue que ce n'est pas une date).
Je voudrais savoir si il y avait un moyen de modifier la structure de ma table, de mettre le champ au format date, tout en modifiant la date du champ pour qu'elle soit bien une date.
J'espère que ce que je raconte est compréhensible.N'hésitez pas à me demander si ce n'est pas le cas.

Merci d'avance, j'ai lu beaucoup de questions dessus,mais ça ne correspond pas à ce que je souhaite obtenir.
A voir également:

4 réponses

HostOfSeraphim Messages postés 6750 Date d'inscription jeudi 2 février 2006 Statut Contributeur Dernière intervention 31 juillet 2016 1 608
Modifié par HostOfSeraphim le 1/08/2010 à 18:40
Il est tout à fait possible de modifier le type d'un champ sur une table. Seulement... l'intégralité de vos dates enregistrées dans la table vont sauter si elles ne sont pas au bon format, exemple :

MariaDB [test]> select * from t3; 
+------+------------+ 
| c1   | c2         | 
+------+------------+ 
|    1 | 01/02/2010 | 
|    2 | 05/04/2010 | 
|    3 | 03/05/2010 | 
|    4 | 20/05/2010 | 
|    5 | 12/07/2010 | 
+------+------------+ 
5 rows in set (0.00 sec) 

MariaDB [test]> alter table t3 modify c2 date; 
Query OK, 5 rows affected, 5 warnings (0.17 sec) 
Records: 5  Duplicates: 0  Warnings: 5 

MariaDB [test]> select * from t3; 
+------+------------+ 
| c1   | c2         | 
+------+------------+ 
|    1 | 0000-00-00 | 
|    2 | 0000-00-00 | 
|    3 | 0000-00-00 | 
|    4 | 0000-00-00 | 
|    5 | 0000-00-00 | 
+------+------------+ 
5 rows in set (0.00 sec)


Par contre, une fois dans le bon format, le changement de type se fait sans dégât :

MariaDB [test]> select * from t3; 
+------+------------+ 
| c1   | c2         | 
+------+------------+ 
|    1 | 2010-02-01 | 
|    2 | 2010-04-05 | 
|    3 | 2010-05-03 | 
|    4 | 2010-05-20 | 
|    5 | 2010-07-12 | 
+------+------------+ 
5 rows in set (0.00 sec) 

MariaDB [test]> alter table t3 modify c2 date; 
Query OK, 5 rows affected (0.11 sec) 
Records: 5  Duplicates: 0  Warnings: 0 

MariaDB [test]> select * from t3; 
+------+------------+ 
| c1   | c2         | 
+------+------------+ 
|    1 | 2010-02-01 | 
|    2 | 2010-04-05 | 
|    3 | 2010-05-03 | 
|    4 | 2010-05-20 | 
|    5 | 2010-07-12 | 
+------+------------+ 
5 rows in set (0.00 sec)



Il faudrait donc faire un traitement PHP (en SQL, je ne vois pas trop... le temps de chercher, tu aurais plus vite fait de le faire en PHP) qui parcourt l'ensemble des lignes, découpe le champ avec la date en 3 morceaux (année, mois, jour), les assemble dans le bon format, et les réinsère dans la table.




Configuration : Fedora 13 virtualisé sur machine hôte CentOS 5.5 (via VirtualBox)
0
eric204044 Messages postés 33 Date d'inscription mercredi 30 juin 2010 Statut Membre Dernière intervention 15 septembre 2010
1 août 2010 à 19:04
Merci pour ton aide, c'est justement ce que je cherche à faire: trouver un traitement en php qui me permette de changer le champ que je récupère dans mon formulaire de type text au format date et de stocker cette valeur dans la base de données à laquelle j'aurais préalablement changé le type varchar par le type date.
Cependant je ne vois pas trop comment passer de ma chaine de caractère au format date
0
HostOfSeraphim Messages postés 6750 Date d'inscription jeudi 2 février 2006 Statut Contributeur Dernière intervention 31 juillet 2016 1 608
Modifié par HostOfSeraphim le 1/08/2010 à 19:30
J'ai trouvé une solution. Attention, c'est un peu long, et je te conseille de faire l'essai sur une table temporaire dans un premier temps.


MariaDB [test]> desc t3; 
+-------+-------------+------+-----+---------+-------+ 
| Field | Type        | Null | Key | Default | Extra | 
+-------+-------------+------+-----+---------+-------+ 
| c1    | varchar(10) | YES  |     | NULL    |       | 
| c2    | varchar(10) | YES  |     | NULL    |       | 
+-------+-------------+------+-----+---------+-------+ 
2 rows in set (0.01 sec) 

MariaDB [test]> select * from t3; 
+------+------------+ 
| c1   | c2         | 
+------+------------+ 
| 1    | 01/02/2010 | 
| 2    | 05/04/2010 | 
| 3    | 03/05/2010 | 
| 4    | 20/05/2010 | 
| 5    | 12/07/2010 | 
+------+------------+ 
5 rows in set (0.00 sec) 

MariaDB [test]> alter table t3 add c3 date after c2; 
Query OK, 5 rows affected (0.11 sec) 
Records: 5  Duplicates: 0  Warnings: 0 

MariaDB [test]> update t3 set c3 = str_to_date(c2,'%d/%m/%Y'); 
Query OK, 5 rows affected (0.04 sec) 
Rows matched: 5  Changed: 5  Warnings: 0 

MariaDB [test]> select * from t3; 
+------+------------+------------+ 
| c1   | c2         | c3         | 
+------+------------+------------+ 
| 1    | 01/02/2010 | 2010-02-01 | 
| 2    | 05/04/2010 | 2010-04-05 | 
| 3    | 03/05/2010 | 2010-05-03 | 
| 4    | 20/05/2010 | 2010-05-20 | 
| 5    | 12/07/2010 | 2010-07-12 | 
+------+------------+------------+ 
5 rows in set (0.00 sec) 

MariaDB [test]> alter table t3 drop c2; 
Query OK, 5 rows affected (0.09 sec) 
Records: 5  Duplicates: 0  Warnings: 0 

MariaDB [test]> alter table t3 change c3 c2 date; 
Query OK, 0 rows affected (0.09 sec) 
Records: 0  Duplicates: 0  Warnings: 0 

MariaDB [test]> desc t3; 
+-------+-------------+------+-----+---------+-------+ 
| Field | Type        | Null | Key | Default | Extra | 
+-------+-------------+------+-----+---------+-------+ 
| c1    | varchar(10) | YES  |     | NULL    |       | 
| c2    | date        | YES  |     | NULL    |       | 
+-------+-------------+------+-----+---------+-------+ 
2 rows in set (0.01 sec) 

MariaDB [test]> select * from t3; 
+------+------------+ 
| c1   | c2         | 
+------+------------+ 
| 1    | 2010-02-01 | 
| 2    | 2010-04-05 | 
| 3    | 2010-05-03 | 
| 4    | 2010-05-20 | 
| 5    | 2010-07-12 | 
+------+------------+ 
5 rows in set (0.00 sec) 





Configuration : Fedora 13 virtualisé sur machine hôte CentOS 5.5 (via VirtualBox)
0
eric204044 Messages postés 33 Date d'inscription mercredi 30 juin 2010 Statut Membre Dernière intervention 15 septembre 2010
1 août 2010 à 19:48
c'est gentil mais en fait, il me faudrait une solution qui me le fasse en php car je récupère pleins de date, donc je ne peux pas faire ça à chaque fois sur la table, il me faudrait convertir la chaine en date et mettre ensuite cette date au format date dans un champ également au format date de ma table sql
ca serait plus pratique mais je ne sais pas trop comment m'y prendre, j'ai trouvé sur le net la fonction str_to_date mais bon j'y comprend pas grand chose à vrai dire, je vais essayer d'étudier ça
si t'as une solution n'hésite pas
merci d'avance
0
HostOfSeraphim Messages postés 6750 Date d'inscription jeudi 2 février 2006 Statut Contributeur Dernière intervention 31 juillet 2016 1 608
1 août 2010 à 19:51
Il te suffit tout simplement de modifier ton script PHP pour que les dates enregistrées soient désormais dans le bon format... et d'exécuter une fois ce que j'ai mis plus haut pour corriger les dates précédemment enregistrées.
0
eric204044 Messages postés 33 Date d'inscription mercredi 30 juin 2010 Statut Membre Dernière intervention 15 septembre 2010
1 août 2010 à 20:38
ben c'est ça mon pb trouver comment modifier mon programme pour que les dates soient au format correct, corriger les dates précédentes n'est pas nécessaire, ma base n'est pas encore définitive
0
HostOfSeraphim Messages postés 6750 Date d'inscription jeudi 2 février 2006 Statut Contributeur Dernière intervention 31 juillet 2016 1 608
1 août 2010 à 21:39
corriger les dates précédentes n'est pas nécessaire, ma base n'est pas encore définitive

Justement si : autant corriger pendant qu'il est encore temps. Ce n'est pas une fois la base rendue définitive que tu devras changer ça. Et un champ "date" pas dans le bon format, ça doit être corrigé.

Pour le script PHP, il faut utiliser la fonction explode() pour découper la chaîne.
0
eric204044 Messages postés 33 Date d'inscription mercredi 30 juin 2010 Statut Membre Dernière intervention 15 septembre 2010
1 août 2010 à 21:52
à quoi va me servir de faire un explode puisque ma date est au format texte comme ceci par exemple 01/08/2010 .
ma date dans ma table est maintenant au format date, mais l'insertion donne 0000-00-00
le explode est fait pour restructurer ma date, mais là elle est comme je la veux sauf qu'il faut que je la convertisse au format date.
j'essaye str_to_date mais ça donne aussi 0000-00-00
0
HostOfSeraphim Messages postés 6750 Date d'inscription jeudi 2 février 2006 Statut Contributeur Dernière intervention 31 juillet 2016 1 608
1 août 2010 à 22:36
Justement : tu DOIS lui donner "à manger" une date au format AAAA-MM-JJ et pas autre chose !
0