Page 1 sur 1

Recuperer les mois d'un champ date

Posté : 03 janv. 2007, 12:48
par supercanard
Bonjour,
J'ai un champ dâte ou les dâtes sont rentrés comme ceci : 2007-01-03

Je voudrais récupérer seulement les mois pour les affichers dans un select, qui servira à récupérer les entrées dont le mois correspond. Donc 2 requetes...

Pour la première opération, je sais pas si je dois faire une requete qui selectionne toute la date pour ensuite récuperer le mois via PHP ou si je peut directement le faire avec la requete SQL.
Et pour la deuxieme requete je ne sais pas comment faire nomplus... En gros il faut que je fasse WHERE moi de la date = mois :?

Voilà, si vous pouviez me mettre sur une piste :roll:

Bonnne journée

Posté : 03 janv. 2007, 12:53
par Ryle
Piste : regarde du côté de la fonction MONTH() de MySQL pour extraire uniquement le mois de la date :)
(tu auras peut être également besoin de la fonction YEAR() pour savoir de quelle année il s'agit)

Ensuite un simple DISTINCT et un ORDER BY te permettront d'éviter les doublons et de constituer ta liste déroulante sans te poser de question :)

Quant à la seconde requête, il suffit de réutiliser la fonction pour comparer uniquement le mois (et éventuellement l'année) aux valeurs choisies :)

Posté : 03 janv. 2007, 13:07
par supercanard
Merci je vais regarder la doc :)

Posté : 03 janv. 2007, 13:33
par supercanard
Alors c'était évident que ça allais se passer comme ça :)
Je suis carrément largué

Pour récupérer les données je crois que ça va :

Code : Tout sélectionner

$sql= "SELECT YEAR(date_news),MONTH(date_news) FROM undergame_news WHERE visible= '1' ORDER BY date_news DESC";
Pour le select, dans l'idée c'est peut être bon mais en pratique un peu moins

Code : Tout sélectionner

$encours = ''; while($data= mysql_fetch_assoc($req)) { if ($data['YEAR(date_news)'] != $encours) { // Si variable pas égale à dâte on execute la boucle echo '<option value="'.$data['YEAR(date_news)'].''.$data['MONTH(date_news)'].'">'.$data['MONTH(date_news)'].' '.$data['YEAR(date_news)'].'</option>'; $encours= $data['YEAR(date_news)']; } }
Pour la deuxième requete alors là je nage :lol:

Code : Tout sélectionner

$sql = "SELECT id_news,date_news,titre_news,intro_news,auteur_news FROM undergame_news WHERE visible= '1' AND YEAR(date_news)= '".$archives."' AND MONTH(date_news)= '".$archives."' ORDER BY date_news DESC";
Déjà il y a un truc que je saisie pas. Mon select renvoi une seule variable alors que je dois ensuite comparer le mois et l'année...
Sinon il faut aussi que je revois la comparaison avec la variable $encours...

Posté : 03 janv. 2007, 14:07
par Ryle
Pour le select, ton if() me parait un peu bizare... tu compares l'année à l'année précédement stockée et n'affiche les données que si elles sont différentes.. tu vas donc avoir un seul résultat par an au lieu d'un par mois...

Pourquoi ne pas utiliser l'instruction DISTINCT pour filtrer les doublons directement depuis ta requête ? :)

Concernant la seconde requête, tu ne recevras effectivement qu'une valeur une fois le formulaire envoyée. A toi d'identifier l'année et le mois en php pour pouvoir les passer en sql.
Supposons que ta valeur soit sous la forme "aaaa-mm", tu pourrais faire un explode() sur le tiret pour obtenir les deux valeurs et les inclure dans ta requête.
Si elles sont sous la forme "aaaamm" tu peux utiliser la fonction substr() etc.


P'tite remarque :
$data['YEAR(date_news)'].''.$data['MONTH(date_news)']
// revient au même que
$data['YEAR(date_news)'] . $data['MONTH(date_news)']
Il n'est pas utile de rajouter une chaine au milieu (ou au début ou à la fin) si elle est vide :)

Posté : 03 janv. 2007, 14:28
par supercanard
Merci :D
J'ai pas encore essayé mais je crois que ça devrais marcher :

De mon select :

Code : Tout sélectionner

$annee= substr($archives, 4); $mois= substr($archives, 4, 4);
1 : je recupere les 4 premiers caractere, donc l'année
2 : je recupere tout a partir du 5 eme, donc le mois

Ensuite dans ma requete SQL
Ah en fait la ça se complique... bon je reviendrais si je trouve... je vois pasz comment comparer mes 2 variables à une seule

Posté : 03 janv. 2007, 14:32
par Ryle
Ben tu étais bien parti, maintenant tu as tes deux valeurs $annee et $mois, il ne te reste plus qu'à les utiliser dans ta requête en remplacent le $archives avec la valeur qui va bien :) :
"... WHERE visible= '1' AND YEAR(date_news)= '".$archives."' AND MONTH(date_news)= '".$archives."'

Posté : 03 janv. 2007, 16:14
par supercanard
Ah oui je cherchais a faire compliqué alors que c'était simple :D

Bon je met le tout pour les débutants comme moi, au cas ou :

Selection du mois et de la l'année :

Code : Tout sélectionner

$sql= "SELECT YEAR(date_news),MONTH(date_news) FROM undergame_news WHERE visible= '1' ORDER BY date_news DESC";
Boucle sur un select, avec suppression des doublons au niveau du mois

Code : Tout sélectionner

while($data= mysql_fetch_assoc($req)) { if ($data['MONTH(date_news)'] != $encours) { // Si Mois pas égale à Mois en cours echo '<option value="'.$data['YEAR(date_news)'].$data['MONTH(date_news)'].'">'.$data['MONTH(date_news)'].'/'.$data['YEAR(date_news)'].'</option>'; $encours= $data['MONTH(date_news)']; // Mois en cours prend la valeur du Mois } }
Recherche renvoyé par le select

Code : Tout sélectionner

if (isset($_POST['archives'])) { $mois= substr($archives, 4); // RECUPERATION DES CARACTERES APRES LE 4ème $annee= substr($archives, 0, 4); // RECUPERATION DES 4 PREMIERS CARACTERES $sql = "SELECT id_news,date_news,titre_news,intro_news,auteur_news FROM undergame_news WHERE visible= '1' AND YEAR(date_news)= '".$annee."' AND MONTH(date_news)= '".$mois."' ORDER BY date_news DESC"; $req = mysql_query($sql) or die('Erreur sql<br />'.$sql.'<br />'.mysql_error());
Merci pour l'aide :D