Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/06/2008, 04h19   #1
Membre confirmé
 
Avatar de Jihnn
 
Inscription : décembre 2005
Messages : 330
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 330
Points : 216
Points : 216
Par défaut Affichage de tous les mois depuis X date jusqu'à aujourd'hui

Bonjour, c'est encore moi,

Vous avez peut-être lu mon sujet de ce matin (enfin, c'est relatif, le matin québécois ) à propos des sessions. Maintenant ce "problème" passé, je me bute à un nouveau.

Je souhaite faire un système d'archive autonome. Il liste tous les mois écoulés depuis telle date, jusqu'à aujourd'hui.

Par exemple, je choisis le 1er avril 2008 :
Mai 2008 - Archives
Avril 2008 - Archives

J'ai eu beau chercher une solution, je ne trouve pas.

J'ai premièrement voulu soustraire le timestamp du premier avril 2008 à minuit à l'heure du moment, puis diviser la réponse par le nombre de secondes contenu dans un mois. Un problème : Savoir si le mois contient 28, 29, 30 ou 31 jours, bref, que de complications.
Admettons que je donne comme moyenne 365/12 (~30.41 de mémoire), il faut que j'applique la fonction floor() à la réponse de l'équation précédente, pour savoir si un mois entier s'est écoulé.
Si c'est le cas, je fais une boucle, et c'est ici que j'ai stoppé. Il faudrait que j'additionne le nombre de mois écoulés à la première date, vérifier s'il est plus grand que 12, si c'est le cas changer l'année, etc.

Bref, vous vous rendez compte que ça serait très dûr à lire, pas clair du tout et sujet à beaucoup de bugs.

Je me demandais (et j'espère ^^) s'il y a une solution plus simple à mon problème.

Merci d'avance,

Jihnn

P.S. Désolé pour le mauvais emplacement du topic précédent, j'espère que cette fois c'est la bonne
Jihnn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2008, 09h09   #2
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
http://fr3.php.net/fr/strtotime
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2008, 09h39   #3
Membre du Club
 
Avatar de Badaboumpanpan
 
Inscription : janvier 2006
Messages : 202
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : janvier 2006
Messages : 202
Points : 47
Points : 47
Je ne suis pas sûr de comprendre ce que tu veux faire...

Un système d'archives regroupées par mois ?

Que tu consultes ensuite ?

Tu veux lister les mois qui sépare la date que tu choisis et maintenant ?

Bon je suis débutant alors peut être que mon script est pourri... mais je le mets quand même !!!

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<?php
/*
* Fonction month permettant d'avoir le mois textuel
*/
function month($mois) {
  switch ($mois) {
    case 1:
      $month = "Janvier";
      break;
    case 2:
      $month = "Février";
      break;
    case 3:
      $month = "Mars";
      break;
    case 4:
      $month = "Avril";
      break;
    case 5:
      $month = "Mai";
      break;
    case 6:
      $month = "Juin";
      break;
    case 7:
      $month = "Juillet";
      break;
    case 8:
      $month = "Août";
      break;
    case 9:
      $month = "Septembre";
      break;
    case 10:
      $month = "Octobre";
      break;
    case 11:
      $month = "Novembre";
      break;
    case 12:
      $month = "Décembre";
      break;
  }
  return $month;
}
 
/*
* Retour de la date choisie
*/
$choix = '2006-4-1';
$choix = explode('-',$choix);
$ch_an = $choix[0];
$ch_mo = $choix[1];
$ch_jo = $choix[2];
 
/*
* Récupération de la date du jour
*/
$annee = date(Y);
$mois = date(n);
$jour = date(j);
 
/*
* Détermination du premier passage
*/
$first = 0;
 
/*
* Affichage des mois entre la date choisie et aujourd'hui
*/
while ($ch_an <= $annee) {
/*
* Année(s) antérieure(s)
*/
  if ($ch_an < $annee) {
    // premier passage
    if ($first == 0) {
      while ($ch_mo <= 12) {
        $month = month($ch_mo);
        echo $month." ".$ch_an."<br>";
        $ch_mo++;
      }
      $first = 1;
    // autres passages
    } else {
      $ch_mo = 01;
      while ($ch_mo <= 12) {
        $month = month($ch_mo);
        echo $month." ".$ch_an."<br>";
        $ch_mo++;
      }
    }
/*
* Année actuelle
*/
  } else if ($ch_an == $annee) {
    // premier passage
    if ($first == 0) {
      while ($ch_mo <= $mois) {
        $month = month($ch_mo);
        echo $month." ".$ch_an."<br>";
        $ch_mo++;
      }
    // autres passages
    } else {
      $ch_mo = 01;
      while ($ch_mo <= $mois) {
        $month = month($ch_mo);
        echo $month." ".$ch_an."<br>";
        $ch_mo++;
      }
    }
  }
  $ch_an++;
}
?>
Badaboumpanpan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2008, 14h27   #4
Membre confirmé
 
Avatar de Jihnn
 
Inscription : décembre 2005
Messages : 330
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 330
Points : 216
Points : 216
@Fladnag : Merci, mais mon problème ne se situait pas à ce niveau, je suis capable de créer un timestamp

@Badaboumpanpan : Je ne cherche pas un script déjà fait (premièrement parce que je déteste recopier bêtement le travail des autres, deuxièmement parce que je monte mon site pour programmer ), par contre il y a certaines pistes, je vais voir de ton côté.

Voici mon code pour ceux que ça intéresse :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
	if (isset($_GET['mois'], $_GET['an']))
	{
	}
	else
	{
		$firstMonth = 5;
		$firstYear = 2008;
		$currMonth = date('n');
		$currYear = date('Y');
 
		$now = mktime(0,0,0,$currMonth,1,$currYear);
		while (mktime(0,0,0,$firstMonth,1,$firstYear) < $now)
		{
			if ($firstMonth > 12)
			{
				$firstMonth = 1;
				$firstYear++;
			}
			else
			{
				echo '<a href="index.php?page=archives&mois=' . $firstMonth . '&an=' . $firstYear . '">' . getMois($firstMonth) . ' ' . $firstYear . '</a><br />';
				$firstMonth++;
			}
		}
	}
?>
getMois() (Oui franglais, j'ai réalisé trop tard... ) ne fait que retourner le nom en lettres du mois)
Jihnn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2008, 14h57   #5
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
avec strtotime, tu n'as pas besoin de réflechir aux changement d'années, aux moins de 29, 30 ou 31 jour, il gere tout ca tout seul

Tu prend une date correspondant au 1er du mois courant et tu fait "+1 months" ou "-1 months" pour générer le timestamp souhaité.

Quand tu veux t'arreter, tu récupere le numéro du mois du timestamp généré (avec date()) et tu le compare a ta valeur d'arret.

Pour générer le 1er du mois courant, utilise mktime

Sinon, si tu n'aime pas strtotime, tu peux tout générer avec mktime en incrémentant le numero du mois (il "normalise" aussi tout seul, ca marche si tu lui donne 578 en numero de mois, il va comprendre +2 mois +48 années ^^)
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h07.


 
 
 
 
Partenaires

Hébergement Web