Tri et date...soucis

Avatar du membre
ViPHP
ViPHP | 3008 Messages

30 mars 2005, 09:02

Bonjour à tous,

J'ai un petit soucis concernant ce que je veux faire.

En fait j'ai un formulaire qui me permet de mettre en bdd 3 champs qui correspondent à une date (jour, mois et année). Ces champs sont de type INT.

Je voudrais ensuite afficher la liste des enregistrements triées par cette même date, et là je coince. J'ai bien essayé de faire ORDER BY annee, mois, jour mais ça ne marche pas mieux.

Avez-vous une idée pour que je puisse régler ce problème ? Existe-t-il un meilleur moyen pour intégrer une date (à partir de 3 champs distincts) dans une base ?

Merci encore ! J'attend avec impatience la solution ! :wink:

Mammouth du PHP | 19672 Messages

30 mars 2005, 09:29

Inverse l'"ORDER BY" en mettant année, mois et jour au lieu de jour, mois et année.
Question subsidiaire: pourquoi trois champs de type INT au lieu d'un seul champ de type DATE ? PArce que dans ce dernier cas, ce serait encore plus simple, ORDER BY champ_date...
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Avatar du membre
ViPHP
ViPHP | 3008 Messages

30 mars 2005, 10:22

Oui le ORDER BY que j'ai fait est bien annee, mois et jour et non le contraire mais ça ne marche pas.

Comment puis-je intégrer mes 3 données "jour", "mois" et "année" provenant de mon formulaire (3 champs select) dans un seul champs unique date de ma base ?

Parce qu'en fait je veux formater ma date sous forme "30.03.2005".

Merci !

Mammouth du PHP | 19672 Messages

30 mars 2005, 10:39

Il faut distinguer le format d'affichage du format de stockage;
Dans MySQL, la date est stockée au format anglo-saxon, YYYY-MM-DD et nous l'affichons au format français JJ MM AAAA

Ce que tu peux donc faire, c'est construire une chaine correspondant au format de stockage pour envoyer les données ou les comparer avec ce qui est dans la base et faire l'opération inverse pour l'afficher sur une page.

Voici un exemple : je récupère une date dans un champs `date-cde` que je mets dans une variable $date_cde et je veux l'afficher en français sur ma page :
	$jour_cde = substr($date_cde,8,2);
	$mois = substr($date_cde, 5, 2);
	switch ($mois)
	{
		case 01 : $mois_cde = "janvier"; break;
		case 02 : $mois_cde = "février"; break;
		case 03 : $mois_cde = "mars"; break;
		case 04 : $mois_cde = "avril"; break;
		case 05 : $mois_cde = "mai"; break;
		case 06 : $mois_cde = "juin"; break;
		case 07 : $mois_cde = "juillet"; break;
		case 08 : $mois_cde = "août"; break;
		case 09 : $mois_cde = "septembre"; break;
		case 10 : $mois_cde = "octobre"; break;
		case 11 : $mois_cde = "novembre"; break;
		case 12 : $mois_cde = "décembre"; break;
	}
	$annee_cde = substr($date_cde, 0, 4);
	$cde_formatee = "le ". $jour_cde ." ". $mois_cde ." ". $annee_cde .";
Si tu récupères les éléments constituants de la date de trois champs de formulaire distincts, tu construis une chaîne avec ces éléments pour la mettreau format DATE de ta base avant de faire une insertion ou une comparaison avec une valeur existante avec le même principe.

Mais dans ma base, je n'ai pas trois champs mais un seul et la clause ORDER BY le traite très bien.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Avatar du membre
ViPHP
ViPHP | 3008 Messages

30 mars 2005, 10:43

Oki merci beaucoup pour ton aide :)

Je vais essayer tout ça et voir si ça fonctionne ;) Je te tiens au courant.

Avatar du membre
ViPHP
ViPHP | 3008 Messages

30 mars 2005, 11:13

Mmmmhhh en fait j'ai pas tout bien compris...

Pour la construction de la chaîne ça va je peux transformer mes 3 champs en une donnée unique qui sera sous forme "30.03.2005".

Mais lorsque je fait l'insertion dans la bdd, comment ça se passe ?
Sachant que le code est :

Code : Tout sélectionner

$add = "INSERT INTO xxx VALUES ('$jour', '$mois', '$annee')"
comment lui dire qu'il faut intégrer la nouvelle chaîne que l'on a construit...?
$cde_formatee = $jour_cde.".".$mois_cde.".".$annee_cde.";
$add = "INSERT INTO xxx VALUES ('$cde_formatee')";
ceci marcherait ? (cde_formatee sera le nouveau champs date de la base)

Mammouth du PHP | 19672 Messages

30 mars 2005, 11:20

Non, pour envoyer vers la base de données (ou simplement dialoguer avec) il faut que tu utilises le format approprié donc le format DATE de ySQL donc : YYYY-MM-DD, pas l'inverse qui ne te sert que pour l'affichage dans tes pages
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Avatar du membre
ViPHP
ViPHP | 3008 Messages

30 mars 2005, 11:24

Donc si je comprend bien pour insérer dans ma base je dois utiliser :
$cde_formatee = $annee_cde." ".$mois_cde." ".$jour_cde."; 
$add = "INSERT INTO xxx VALUES ('$cde_formatee')";
?

Eléphant du PHP | 102 Messages

30 mars 2005, 12:17

Avec les tirets qui vont bien à la place des espaces, oui. :wink:

Avatar du membre
ViPHP
ViPHP | 3008 Messages

30 mars 2005, 12:20

oki merci pour la confirmation ;)

Je testerais tout ça tranquillement chez moi :p

Merci pour votre aide ! :wink:

Avatar du membre
ViPHP
ViPHP | 3008 Messages

30 mars 2005, 20:27

Je confirme, ça marche nickel c'est génial ;)

Thanks !