requetes en fonction d'une date

Eléphant du PHP | 254 Messages

21 mars 2006, 15:48

Bonjour
J'affiche sur une page des événements.

Dans ma base, j'ai evenement d'un coté:
ID
nom
description
etc.....

De l'autre une table nommée sessions :
ID
evenement_ID
date_debut

Je souhaiterais afficher les résultats de ma base en fonction du mois en cours. donc lorsque qu'on clique sur événements, ne s'affichent que les événements programmés au mois de mars..et ainsi de suite.

Ce n'est pas vraiment un agenda que je cherche, mais un affichage sur la base d'un élément date...et j'avoue que je suis un peu perdue.
Est-ce que vous auriez des pistes à me donner ?

Jusqu'à maintenant, j'ai écrit ça :
<?php
mysql_select_db($database, $connexion);
$query_session = "SELECT sessions.ID, sessions.cours_id, sessions.date_debut, sessions.nbre_participants, cours, intitule, description, lieu, horaires, FROM sessions, evenement WHERE sessions.cours_id=evenement.cours ORDER BY date_debut ASC";
$session = mysql_query($query_session, $connexion) or die(mysql_error());
$row_session = mysql_fetch_assoc($session);
$totalRows_session = mysql_num_rows($session);
?>
J'imagine qu'il faut que je pose les variables $date_debut, $month....
Et qu'ensuite dans ma requete je rajoute dans la clause WHERE qqch.
Merci de votre aide, mais j'avoue que je sèche sur les dates, dans mon tableau, j'ai déjà du mal à sortir la date en format français :wink:

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

21 mars 2006, 16:11

Tu peux tout faire directement dans la requête, si la colonne qui contient la date est bien de format DATE

Condition : le mois de l'événement = le mois courant

Fonctions MySQL :
NOW() renvoie la date courante
MONTH(date) renvoie le mois d'une date passée en paramètre

A partir de là, tu as tout ce qu'il faut ;)

Eléphant du PHP | 254 Messages

21 mars 2006, 16:29

merci !
Alors pour la conversion date, je n'avais pas assez bien utilisé la recherche :oops:
J'ai fait ça :
<?php $date_us = $row_session['date_debut'];
	$annee = substr($date_us,0,4);
	$mois = substr($date_us,5,2);
	$jour = substr($date_us,8,2);
	$date_fr = $jour ."-". $mois ."-". $annee;?>
Et donc plus bas dans mon tableau :
<?php echo $date_fr;?>
ça fonctionne nickel, on me retourne : 21-03-2006 ! Mais TOUTES les dates passent à 21-03-2006 :? :)
Je sais que le jour est %A, comment l'introduire dans mon code ci-dessus si je souhaite plutôt afficher la date : mardi 21-03--2006 ?
Pour les explications que tu me donnes :
J'ai compris à quoi sert la fonction NOW()..mais le reste est un peu flou ! :D
Je vais m'essayer et vous dirais !

Eléphant du PHP | 254 Messages

21 mars 2006, 16:42

Fonctions MySQL :
NOW() renvoie la date courante
MONTH(date) renvoie le mois d'une date passée en paramètre

A partir de là, tu as tout ce qu'il faut ;)
Alors alors
J'ai rajouté deux sessions mois d'avril dans ma base :
Dans ma requête j'ai rajouté :
$mois=date('m');
///blablabla
WHERE sessions.cours_id=evenement.cours AND '$mois' = MONTH(date_debut) ORDER BY date_debut ASC";
Ca semble fonctionner !
Dis moi si je fais erreur!!
bon, fo corser le truc, sinon ça serait pas drole :-D
Je vais essayer d'ajouter un lien : mois suivant ;-)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

21 mars 2006, 16:56

Oui, mais là tu triches, tu n'utilises pas le now() :)

Je n'ai pas essayé, mais je suppose que "AND MONTH(date_debut) = MONTH(NOW())" doit te donner le même résultat sans avoir besoin de faire appel à la fonction date de php :)
(cela dit ca marche très bien aussi ;))

Et pis histoire de corser un peu plus (bon ok, c'est plus pour pinailler) au lieu d'un égal, ne serait-ce pas les événement dont la date_debut est inférieur ou égale, et la date_fin supérieure ou égale, au mois en cours qu'il serait judicieux de ramener ? ;p

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

21 mars 2006, 16:56

En effet, ça fonctionne
mais dans cet ordre là ce serait plus compréhensible je trouve :
WHERE sessions.cours_id=evenement.cours 
AND MONTH(date_debut) = '$mois'
ORDER BY date_debut ASC";
(Je te l'accorde, c'est du détail)

Mais je t'avais dit que tu pouvais tout faire dans la requête ;)

Code : Tout sélectionner

WHERE sessions.cours_id=evenement.cours AND MONTH(date_debut) = MONTH(NOW()) ORDER BY date_debut ASC
Après pour le lien mois suivant c'est pas bien compliqué non plus :)

Eléphant du PHP | 254 Messages

21 mars 2006, 17:27

Merci Ryle et oucékiléou ;-)
Effectivement c'est peut-être du détail, mais plus je pratique le péhachepaïe, plus je comprends que la syntaxe est importante, donc merci de me corriger !
Heuuuuuu, vous ne m'avez pas sortie de la ù*ù*^$ avec ma conversion de la date en français qui me ramène toutes mes dates du mois de mars à la date du jour !!! :lol: j'ai dû bidouiller un truc pas très...hum !
Ryle : j'ai nommé le champ date_debut, car j'ai vu sur un post ici, qu'une personne avait utilisé comme moi un champ nommé 'date' (tout court) et que c'est réservé à SQL. Donc je l'ai renommé date_début, mais il n'y a pas de date de fin !!!! car ça dure une journée !!!! :P
oucékiléou :
Pour les liens, avril, mai, juin....
J'ai imaginé soitr définir chaque mois de l'année.
Comme mon mois de départ est
$mois = date('m');
Les autres mois seraient égaux à :
$mois2 = $mois-1;
Donc mon lien :

Code : Tout sélectionner

<a href="agenda.php?mois=$_GET['$mois2']">
etc....mais encore une fois, est-ce que je fais fausse route ? parce que ça ne marche pas bien évidemment !!! :-" [/php]

Edité par moi-même plus tard...
La conversion de la date fonctionne..me manque plus qu'à comprendre comment rajouter le jour mardi mercredi etc...
Modifié en dernier par coxine le 21 mars 2006, 17:52, modifié 1 fois.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

21 mars 2006, 17:46

Effectivement c'est peut-être du détail, mais plus je pratique le péhachepaïe, plus je comprends que la syntaxe est importante, donc merci de me corriger !
En fait là c'était plutôt une question d'habitude, on met :
variable = valeur plutôt que l'inverse, même si ça marche
Heuuuuuu, vous ne m'avez pas sortie de la ù*ù*^$ avec ma conversion de la date en français qui me ramène toutes mes dates du mois de mars à la date du jour !!!
Je ne comprends pas à quoi tu fais référence ici :roll:

Sinon pour tes liens, qu'est-ce que tu veux faire exactement ?
Ton exemple est un peu confus :roll:

Eléphant du PHP | 254 Messages

21 mars 2006, 17:55

En fait je viens de trouver ! pour la conversion de la date !
<?php $date_us = $row_session['date_debut'];
			// coupe la date
			$annee = substr($date_us,0,4);
			$mois = substr($date_us,5,2);
			$jour = substr($date_us,8,2);
			// on regroupe les element
			$date_fr = $jour ."-". $mois ."-". $annee;?>
et plus loin dans mon tableau :
<?php echo $date_fr; ?>
Je cherche aussi à afficher le jour mardi ou mercredi...

Pour les liens :
Comme j'affiche par défaut les événements du mois en cours (mars pour l'instant) je voudrais donner la possibilité de cliquer sur un lien (avril - mai - juin...etc) pour que l'on affiche les événements du mois suivant.
Et c'est là que je sèche à nouveau...j'imagine qu'il faut indiquer dans le code une fonction de type incrémentation ou autre...je ne sais pas !
Je cherche des exemples, mais si tu peux me donner une piste je serais ravie !

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

21 mars 2006, 18:10

J'avais sauté la dernière ligne du premier message, je ne comprenais pas pourquoi tu parlais de conversion de date tout d'un coup :oops:

Il y avait des éléments de réponse ici aussi : http://www.phpfrance.com/forums/voir_sujet-8323.php
Pour les liens :
Comme j'affiche par défaut les événements du mois en cours (mars pour l'instant) je voudrais donner la possibilité de cliquer sur un lien (avril - mai - juin...etc) pour que l'on affiche les événements du mois suivant.
Et c'est là que je sèche à nouveau...j'imagine qu'il faut indiquer dans le code une fonction de type incrémentation ou autre...je ne sais pas !
Je cherche des exemples, mais si tu peux me donner une piste je serais ravie !
SI tu veux afficher les liens du mois en cours par défaut, et un lien vers l'affichage du mois suivant uniquement, c'est assez simple.
En gros :
// récupérer un mois par GET, s'il n'y a rien mettre par défaut au mois courant

// insertion de ce mois dans la requête SQL

// lien vers mois suivant : mois traité+1

Eléphant du PHP | 254 Messages

21 mars 2006, 18:59

heuu
oulà ça se complique un chouilla pour moi.
tu veux dire par là ?
qu'il faut que je pose des conditions : si rien ce mois ci j'affiche 'pas d'événements" sinon.....
??
J'ai essayé de poser des variables :
$mois =
$mois2=$mois+1 etc..
de les appeler dans mon lien, mais ça ne semble pas fonctionner.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

21 mars 2006, 19:15

Oops.. bon bah j'ai rien dit (forcément si tout le monde appelle ses dates date_debut, moi je m'y perd entre ceux qui ont des dates de fin et ceux qui n'en n'ont pas ;))
C'est vrai que c'est mieux de ne pas utiliser le mot "date" puisque c'est un mot clé sql, donc réservé, mais je crois que mysql est pas trop difficile là dessus.. quoi qu'il en soit c'est mieux de s'en passer :)

Pour tes mois suivants et précédent, l'idée en fait, c'est de garder une seul variable $mois qui contiendra le numéro du mois à afficher. Si lorsque tu arrives sur la page la première fois, tu n'as pas de valeur, tu utilises le mois en cours :
if(!isSet($_GET['mois'])
  $mois = date('m');
else
  $mois = $_GET['mois'];
tu peux donc faire un lien précédent et suivant (en faisant attention au 1 et 12 qui donneront respectivement 12 au précédent et 1 au suivant)
<a href="page.php?mois=<?= ($mois-1) ?>mois précédent</a>
mois en cours : <?= $mois ?>
<a href="page.php?mois=<?= ($mois+1) ?>mois suivant</a>
Pis pour agrémenter tout ça, tu utilises un tableau avec les noms des mois pour faire plus joli :
<? $libMois = array("Janvier", "Février", "Mars", ...); ?>
Mois en cours : <?= $libMois[$mois-1] ?>
// -1 parce que l'index du tableau commence à 0 
Et pour finir, pour avoir le jour correspondant à ta date, il te faut utiliser la fonction mktime pour reconstruire ta date à partir des jour, mois, année :
echo date("D", mktime(0, 0, 0, $mois, $jour, $annee));
En utilisant :
- "D" si tu veux le jour de la semaine, en trois lettres (et en anglais) : Mon à Sun
- "w" pour le jour de la semaine au format numérique 0 (pour dimanche) à 6 (pour samedi) (celui-ci pouvant être utilisé dans un tableau comme pour les mois, array("dimanche", "lundi", ...); )
- "N" même chose mais de 1 (pour Lundi) à 7 (pour Dimanche)
...

Eléphant du PHP | 254 Messages

21 mars 2006, 20:25

merci pour les tyuaux Ryle !
Donc le GEt ferait appel à 'mois' ? que je remplace par 'date_début' ?
C'est ça ou je fais fausse route ?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

21 mars 2006, 21:13

L'explication de Ryle est très claire

Par contre je crois que tu te mélanges un peu les pinceaux

date_debut : c'est la colonne de ta table, dans MySQl

mois : c'est une variable, PHP, qui va te permettre de savoir quel mois afficher, et de construire les liens "précédent" et "suivant" (en faisant +/- 1)

donc tu vas construire dynamiquement ta requête, dans laquelle tu compareras dans le WHERE, date_debut avec la valeur de $mois

Eléphant du PHP | 254 Messages

21 mars 2006, 22:15

rhooooo merci merci à tous les deux pour ces explications !!\:D/
En fait, j'avais créé cette variable au tout début, puis effacée.
Donc j'ai :
<?php
if(!isset($_GET['mois'])) 
  $mois = date('m') ;
else
  $mois = $_GET['mois'];
mysql_select_db($database, $connexion);
$query_session = "SELECT .../... WHERE sessions.cours_id=evenement.cours AND (MONTH(date_debut) = $mois) ORDER BY date_debut ASC ";
$session = mysql_query($query, $connexion) or die(mysql_error());
$row_session = mysql_fetch_assoc($session);
$totalRows_session = mysql_num_rows($session);
 ?>
Puis plus bas :
<? $libMois = array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"); ?> 
	<p align="center">Evenements du mois de : <?= $libMois[$mois-1] ?> - <a href="agenda.php?mois=<?= ($mois+1) ?>">mois suivant</a>
!
Thank's guys ;-)
bon, reste à convertir le jour Wed en mercredi, et c'est parfait !!
Merciii