Problème d'incrémentation calendrier

Mammouth du PHP | 686 Messages

08 sept. 2009, 20:23

Bonjour
j'ai créé comme un calendrier qui liste les semaines des mois seulement je me trouve confronté a un problème, lorsque je passe d'un mois a un autre, l'incrementation des jours n'est pas bon, ce qui me decalle tous les jours de la semaine
voici le resultat http://garbar-sylvain.info/stockage
et voici le code
<?php
/// on récupère le mois du jour
$moisjour = date("n");
$annee = date("Y");
$semaine = date("W");

/// on donne les variables pour l'ecriture en toute lettre
function mois($moisjour){
if ($moisjour == 1){
$moisjour_lettres = "Janv";}
elseif ($moisjour == 2){
$moisjour_lettres = "Févr";}
elseif ($moisjour == 3){
$moisjour_lettres = "Mars";}
elseif ($moisjour == 4){
$moisjour_lettres = "Avr";}
elseif ($moisjour == 5){
$moisjour_lettres = "Mai";}
elseif ($moisjour == 6){
$moisjour_lettres = "Juin";}
elseif ($moisjour == 7){
$moisjour_lettres = "Juil";}
elseif ($moisjour == 8){
$moisjour_lettres = "Août";}
elseif ($moisjour == 9){
$moisjour_lettres = "Sept";}
elseif ($moisjour == 10){
$moisjour_lettres = "Oct";}
elseif ($moisjour == 11){
$moisjour_lettres = "Nov";}
elseif ($moisjour == 12){
$moisjour_lettres = "Déc";}
return($moisjour_lettres);
}
$i = 0;
while($i < 12){
$i2 = 0;
if($moisjour == 13){
$annee = $annee+1;
$moisjour = 1;}
if($i%2 == 0){
$fond = "images/calendar_fd.jpg";
$color = "#B3D8E8";
}
else{
$fond = "images/calendar_fd2.jpg";
$color = "#DEECF5";
}
$moisjour_lettres = mois($moisjour);
/// Début de la boucle pour le tableau

echo "<table cellpadding=\"0\" cellspacing=\"0\" bordercolordark=\"white\" bordercolorlight=\"black\">
    <tr>";
/// Nom du mois
echo"	<!-- DEBUT DU MOIS -->
        <td width=\"30\" height=\"52\" style=\"background-image:url('images/calendar.gif'); background-repeat:no-repeat; background-attachment:scroll;\" valign=\"top\">
            <p style=\"margin-top:17px; margin-bottom:0px;\" align=\"center\"><font face=\"Arial\"><span style=\"font-size:7pt;\"><b>".$moisjour_lettres."</b></span></font></p>
            <p style=\"margin-top:0; margin-bottom:0;\" align=\"center\"><font face=\"Arial\"><span style=\"font-size:7pt;\">".$annee."</span></font></p>
        </td>
		<!-- FIN -->";
/// semaines
echo"<td width=\"500\" height=\"52\" bgcolor=\"".$color."\" style=\"background-image:url('".$fond."'); background-repeat:no-repeat; border-bottom-width:2px; border-left-width:2px; border-bottom-color:white; border-left-color:white; border-bottom-style:solid; border-left-style:solid;\">
            <table cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" height=\"100%\">
                <tr>
				";
				
				while($i2 < 4){
if($i2 == 0){
/// savoir quel est le premier jour de la semaine
$prem_j_sem = date("w", mktime(0, 0, 0, $moisjour, 1, $annee));
if($prem_j_sem != 6){

/// si le premier du mois ne tombe pas un samedi
$dern_j_mois_prec = date("d",mktime(0, 0, 0, $moisjour-1, 0, $annee));
$prem_j_sem = date("d-n-Y", mktime(0, 0, 0, $moisjour-1, $dern_j_mois_prec-$prem_j_sem, $annee));
$date = explode("-", $prem_j_sem);
$jour = $date[0];
$mois = $date[1];
$annee = $date[2];
$dern_j_sem = date("d-n-Y", mktime(0, 0, 0, $moisjour-1, 7+$prem_j_sem, $annee));
$date_d = explode("-", $dern_j_sem);
$jour_d = $date_d[0];
$mois_d = $date_d[1];
$annee_d = $date_d[2];
}
/// si le prem jour de la semaine est bien un samedi
else{
$prem_j_sem = date("d-n-Y", mktime(0, 0, 0, $moisjour, 1, $annee));
$date = explode("-", $prem_j_sem);
$jour = $date[0];
$mois = $date[1];
$annee = $date[2];
$dern_j_sem = date("d-n-Y", mktime(0, 0, 0, $moisjour-1, 7+$prem_j_sem, $annee));
$date_d = explode("-", $dern_j_sem);
$jour_d = $date_d[0];
$mois_d = $date_d[1];
$annee_d = $date_d[2];

}
$i2=$i2+1;
}

else {
$prem_j_sem = date("d-n-Y", mktime(0, 0, 0, $mois_d, $jour_d, $annee_d));
$date = explode("-", $prem_j_sem);
$jour = $date[0];
$mois = $date[1];
$annee = $date[2];
$dern_j_sem = date("d-n-Y", mktime(0, 0, 0, $moisjour, $jour+7, $annee));
$date_d = explode("-", $dern_j_sem);
$jour_d = $date_d[0];
$mois_d = $date_d[1];
$annee_d = $date_d[2];
$i2=$i2+1;
}


                   echo"
                   <!-- SEMAINE ".$i2." -->
                    <td width=\"118\"";
                   if($i2 != 0){
                   echo "style=\"border-left-width:1px; border-left-color:white; border-left-style:solid;\"";
                   }
                   echo ">
                        <p align=\"center\"><font face=\"Arial\"><span style=\"font-size:8pt;\">Du ".$jour." ".mois($mois)." au ".$jour_d." ".mois($mois_d)."</span></font></p>
                    </td>";
                    }
                    echo"
                </tr>
            </table>";
            
 //// fin du code
 echo "</td>
    </tr>
</table>";
$moisjour = $moisjour + 1;
$i = $i +1;
$semaine = $semaine+1;
}
Merci d'avance pour votre aide

Mammouth du PHP | 985 Messages

08 sept. 2009, 21:48

Salut :wink:
Tu déclares juste avant ton test que $i = 0; -> Donc $i toujours == 0
Même chose pour $i2 = 0; -> Donc $i2 toujours == 0
//Donc pourquoi ne pas mettre plutot: 
$i = $moisjour ;
//Donc ton while est tout de suite plus logique:
$i = $moisjour ;
while($i < 12){ // quand le numero du mois est inférieur à 12
J'e n'ai pas tout regardé, mais c'est ça qui ma sauté aux yeux dès le départ.

[EDIT]
Faute de frappe ici: if($i%2 == 0){ -> devrait être je pense : if($i2 == 0){
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Mammouth du PHP | 686 Messages

08 sept. 2009, 22:43

non c'est que j'initialise mes variables qui sont ensuite incrémentées en fin du boucles
Salut
Tu déclares juste avant ton test que $i = 0; -> Donc $i toujours == 0
Même chose pour $i2 = 0; -> Donc $i2 toujours == 0

"Faute de frappe ici: if($i%2 == 0){"
ce n'est pas une faute de frappe, il s'agit de savoir si $i est pair ou impair

Mammouth du PHP | 985 Messages

08 sept. 2009, 22:47

Oui tout à fait, c'est la boucle qui incrémente $i à partir de 0, je suis bête, j'ai réfléchis comme un if :wink:
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Mammouth du PHP | 686 Messages

08 sept. 2009, 23:24

Oui tout à fait, c'est la boucle qui incrémente $i à partir de 0, je suis bête, j'ai réfléchis comme un if :wink:
Pas bien grave ;)
Je suis sur la piste de mon erreur, je pense que c'est une histoire de soustraction ...
A plancher
JE tiens au courant, si vous avez des tuyaux ...

Mammouth du PHP | 686 Messages

09 sept. 2009, 00:44

Problème résolu ... en bidouillant un peu je l'avoue
voici le code :
<?php
/// on récupère le mois du jour
$moisjour = date("n");
$annee = date("Y");
$semaine = date("W");

/// on donne les variables pour l'ecriture en toute lettre
function mois($moisjour){
if ($moisjour == 1){
$moisjour_lettres = "Janv";}
elseif ($moisjour == 2){
$moisjour_lettres = "Févr";}
elseif ($moisjour == 3){
$moisjour_lettres = "Mars";}
elseif ($moisjour == 4){
$moisjour_lettres = "Avr";}
elseif ($moisjour == 5){
$moisjour_lettres = "Mai";}
elseif ($moisjour == 6){
$moisjour_lettres = "Juin";}
elseif ($moisjour == 7){
$moisjour_lettres = "Juil";}
elseif ($moisjour == 8){
$moisjour_lettres = "Août";}
elseif ($moisjour == 9){
$moisjour_lettres = "Sept";}
elseif ($moisjour == 10){
$moisjour_lettres = "Oct";}
elseif ($moisjour == 11){
$moisjour_lettres = "Nov";}
elseif ($moisjour == 12){
$moisjour_lettres = "Déc";}
return($moisjour_lettres);
}
$i = 0;
while($i < 12){
$i2 = 0;
if($moisjour == 13){
$annee = $annee+1;
$moisjour = 1;}
if($i%2 == 0){
$fond = "images/calendar_fd.jpg";
$color = "#B3D8E8";
}
else{
$fond = "images/calendar_fd2.jpg";
$color = "#DEECF5";
}
$moisjour_lettres = mois($moisjour);
/// Début de la boucle pour le tableau

echo "<table cellpadding=\"0\" cellspacing=\"0\" bordercolordark=\"white\" bordercolorlight=\"black\" align=\"center\">
    <tr>";
/// Nom du mois
echo"   <!-- DEBUT DU MOIS -->
        <td width=\"30\" height=\"52\" style=\"background-image:url('images/calendar.gif'); background-repeat:no-repeat; background-attachment:scroll;\" valign=\"top\">
            <p style=\"margin-top:17px; margin-bottom:0px;\" align=\"center\"><font face=\"Arial\"><span style=\"font-size:7pt;\"><b>".$moisjour_lettres."</b></span></font></p>
            <p style=\"margin-top:0; margin-bottom:0;\" align=\"center\"><font face=\"Arial\"><span style=\"font-size:7pt;\">".$annee."</span></font></p>
        </td>
                <!-- FIN -->";
/// semaines
echo"<td width=\"600\" height=\"52\" bgcolor=\"".$color."\" style=\"background-image:url('".$fond."'); background-repeat:no-repeat; border-bottom-width:2px; border-left-width:2px; border-bottom-color:white; border-left-color:white; border-bottom-style:solid; border-left-style:solid;\">
            <table cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" height=\"100%\">
                <tr>
                                ";
                                
while($i2 < 5){
if($i2 == 0){
/// savoir quel est le premier jour de la semaine
$prem_j_sem = date("w", mktime(0, 0, 0, $moisjour, 1, $annee));
if($prem_j_sem != 6){

/// si le premier du mois ne tombe pas un samedi
$dern_j_mois_prec = date("d",mktime(0, 0, 0, $moisjour-1, 0, $annee));
$numero_du_jour_prec = date("w",mktime(0, 0, 0, $moisjour-1, $dern_j_mois_prec, $annee));
$ajout = -1;
if ($prem_j_sem == 0){
$ajout = 6;
}
$prem_j_sem = date("d-n-Y", mktime(0, 0, 0, $moisjour-1, $dern_j_mois_prec-$numero_du_jour_prec+$ajout, $annee));
$date = explode("-", $prem_j_sem);
$jour = $date[0];
$mois = $date[1];
$annee = $date[2];
$dern_j_sem = date("d-n-Y", mktime(0, 0, 0, $moisjour-1, 7+$prem_j_sem, $annee));
$date_d = explode("-", $dern_j_sem);
$jour_d = $date_d[0];
$mois_d = $date_d[1];
if($mois_d == 1){
$annee_d = $date_d[2]+1;
}
else{
$annee_d = $date_d[2];
}
}
/// si le prem jour de la semaine est bien un samedi
else{
$prem_j_sem = date("d-n-Y", mktime(0, 0, 0, $moisjour, 1, $annee));
$date = explode("-", $prem_j_sem);
$jour = $date[0];
$mois = $date[1];
$annee = $date[2];
$dern_j_sem = date("d-n-Y", mktime(0, 0, 0, $moisjour-1, 7+$prem_j_sem, $annee));
$date_d = explode("-", $dern_j_sem);
$jour_d = $date_d[0];
$mois_d = $date_d[1];
$annee_d = $date_d[2];

}
$i2=$i2+1;
}
else {
$prem_j_sem = date("d-n-Y", mktime(0, 0, 0, $mois_d, $jour_d, $annee_d));
$date = explode("-", $prem_j_sem);
$jour = $date[0];
$mois = $date[1];
$annee = $date[2];
$dern_j_sem = date("d-n-Y", mktime(0, 0, 0, $moisjour, $jour+7, $annee));
$date_d = explode("-", $dern_j_sem);
$jour_d = $date_d[0];
$mois_d = $date_d[1];
$annee_d = $date_d[2];
$i2=$i2+1;
}


                   echo"
                   <!-- SEMAINE ".$i2." -->
                    <td width=\"118\"";
                   if($i2 != 0){
                   echo "style=\"border-left-width:1px; border-left-color:white; border-left-style:solid;\"";
                   }
                   echo ">";
                        if($i2 == 5 AND $mois == $mois_d){
                        echo "<p align=\"center\"><font face=\"Arial\"><span style=\"font-size:8pt;\">Du ".$jour." ".mois($mois)." au ".$jour_d." ".mois($mois_d)."</span></font></p>";
                        }
                        elseif($i2 == 5 AND $jour_d == 1){
                        echo "<p align=\"center\"><font face=\"Arial\"><span style=\"font-size:8pt;\">Du ".$jour." ".mois($mois)." au ".$jour_d." ".mois($mois_d)."</span></font></p>";
                        }
                        elseif($i2 < 5){
                        echo "<p align=\"center\"><font face=\"Arial\"><span style=\"font-size:8pt;\">Du ".$jour." ".mois($mois)." au ".$jour_d." ".mois($mois_d)."</span></font></p>";
                        }
                        else {
                        echo "<p align=\"center\"><font face=\"Arial\"><span style=\"font-size:8pt;\">&nbsp;</span></font></p>";

                        }
                    echo "</td>"; 
                    }
                    echo"
                </tr>
            </table>";
            
 //// fin du code
 echo "</td>
    </tr>
</table>";
$moisjour = $moisjour + 1;
$i = $i +1;
$semaine = $semaine+1;
}

Mammouth du PHP | 686 Messages

09 sept. 2009, 11:37

Mince, me voici de retour
Je viens de me rendre compte que j'ai un petit bug pour le mois de mai ... et là je sèche beaucoup, j'ai l'impression que le mois ne veut pas s'incrementer
Le lien que je poste c'est pour le code que j'ai mis dans mon message précédent
http://garbar-sylvain.info/stockage

Mammouth du PHP | 991 Messages

09 sept. 2009, 11:57

Je n'ai pas analyser ton code mais peut etre pour t'aider en mai le 1er du mois est un samedi :) comme j'ai lu que tu faisais un traitement dessus

voila Bye Hawk
DevOps, Symfony4, Hoa

Mammouth du PHP | 686 Messages

09 sept. 2009, 12:50

Je n'ai pas analyser ton code mais peut etre pour t'aider en mai le 1er du mois est un samedi :) comme j'ai lu que tu faisais un traitement dessus

voila Bye Hawk
Merci beaucoup, c'est effectivement dans cette partie du code qu'il y avait l'erreur
/// si le prem jour de la semaine est bien un samedi
else{
$prem_j_sem = date("d-n-Y", mktime(0, 0, 0, $moisjour, 1, $annee));
$date = explode("-", $prem_j_sem);
$jour = $date[0];
$mois = $date[1];
$annee = $date[2];
//// l'erreur est sur cette ligne
$dern_j_sem = date("d-n-Y", mktime(0, 0, 0, $moisjour-1, 7+$prem_j_sem, $annee));
////
$date_d = explode("-", $dern_j_sem);
$jour_d = $date_d[0];
$mois_d = $date_d[1];
$annee_d = $date_d[2];

}
l'incrementation du mois n'etait pas bonne
il faut mettre
$dern_j_sem = date("d-n-Y", mktime(0, 0, 0, $moisjour, 7+$prem_j_sem, $annee));
Je vous donne le code en intégralité si ca peut servir à quelqun, il est un peu fouilli, il faudrai rajouter quelques lignes de commentaires ... :?
<meta http-equiv="content-type" content="text/html; charset=Windows-1252">
<?php
/// on récupère le mois du jour
$moisjour = date("n");
$annee = date("Y");
$semaine = date("W");

/// on donne les variables pour l'ecriture en toute lettre
function mois($moisjour){
if ($moisjour == 1){
$moisjour_lettres = "Janv.";}
elseif ($moisjour == 2){
$moisjour_lettres = "Févr.";}
elseif ($moisjour == 3){
$moisjour_lettres = "Mars";}
elseif ($moisjour == 4){
$moisjour_lettres = "Avr.";}
elseif ($moisjour == 5){
$moisjour_lettres = "Mai";}
elseif ($moisjour == 6){
$moisjour_lettres = "Juin";}
elseif ($moisjour == 7){
$moisjour_lettres = "Juil.";}
elseif ($moisjour == 8){
$moisjour_lettres = "Août";}
elseif ($moisjour == 9){
$moisjour_lettres = "Sept.";}
elseif ($moisjour == 10){
$moisjour_lettres = "Oct.";}
elseif ($moisjour == 11){
$moisjour_lettres = "Nov.";}
elseif ($moisjour == 12){
$moisjour_lettres = "Déc.";}
return($moisjour_lettres);
}
$i = 0;
while($i < 12){
$i2 = 0;
if($moisjour == 13){
$annee = $annee+1;
$moisjour = 1;}
if($i%2 == 0){
$fond = "images/calendar_fd.jpg";
$color = "#B3D8E8";
}
else{
$fond = "images/calendar_fd2.jpg";
$color = "#DEECF5";
}
$moisjour_lettres = mois($moisjour);
/// Début de la boucle pour le tableau

echo "<table cellpadding=\"0\" cellspacing=\"0\" bordercolordark=\"white\" bordercolorlight=\"black\" align=\"center\">
    <tr>";
/// Nom du mois
echo"
<!-- DEBUT DU MOIS ".strtoupper($moisjour_lettres)." -->
        <td width=\"30\" height=\"52\" style=\"background-image:url('images/calendar.gif'); background-repeat:no-repeat; background-attachment:scroll;\" valign=\"top\">
            <p style=\"margin-top:17px; margin-bottom:0px;\" align=\"center\"><font face=\"Arial\"><span style=\"font-size:7pt;\"><b>".$moisjour_lettres."</b></span></font></p>
            <p style=\"margin-top:0; margin-bottom:0;\" align=\"center\"><font face=\"Arial\"><span style=\"font-size:7pt;\">".$annee."</span></font></p>
        </td>
<!-- FIN DU TITRE DE ".strtoupper($moisjour_lettres)."-->";
/// semaines
echo"
<td width=\"600\" height=\"52\" bgcolor=\"".$color."\" style=\"background-image:url('".$fond."'); background-repeat:no-repeat; border-bottom-width:2px; border-left-width:2px; border-bottom-color:white; border-left-color:white; border-bottom-style:solid; border-left-style:solid;\">
            <table cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" height=\"100%\">
                <tr>
                                ";
                                
while($i2 < 5){
if($i2 == 0){
/// savoir quel est le premier jour de la semaine
$prem_j_sem = date("w", mktime(0, 0, 0, $moisjour, 1, $annee));
if($prem_j_sem != 6){

/// si le premier du mois ne tombe pas un samedi
$dern_j_mois_prec = date("d",mktime(0, 0, 0, $moisjour-1, 0, $annee));
$numero_du_jour_prec = date("w",mktime(0, 0, 0, $moisjour-1, $dern_j_mois_prec, $annee));
$ajout = -1;
if ($prem_j_sem == 0){
$ajout = 6;
}
$prem_j_sem = date("d-n-Y", mktime(0, 0, 0, $moisjour-1, $dern_j_mois_prec-$numero_du_jour_prec+$ajout, $annee));
$date = explode("-", $prem_j_sem);
$jour = $date[0];
$mois = $date[1];
$annee = $date[2];
$dern_j_sem = date("d-n-Y", mktime(0, 0, 0, $moisjour-1, 7+$prem_j_sem, $annee));
$date_d = explode("-", $dern_j_sem);
$jour_d = $date_d[0];
$mois_d = $date_d[1];
if($mois_d == 1){
$annee_d = $date_d[2]+1;
}
else{
$annee_d = $date_d[2];
}
}
/// si le prem jour de la semaine est bien un samedi
else{
$prem_j_sem = date("d-n-Y", mktime(0, 0, 0, $moisjour, 1, $annee));
$date = explode("-", $prem_j_sem);
$jour = $date[0];
$mois = $date[1];
$annee = $date[2];
$dern_j_sem = date("d-n-Y", mktime(0, 0, 0, $moisjour, 7+$prem_j_sem, $annee));
$date_d = explode("-", $dern_j_sem);
$jour_d = $date_d[0];
$mois_d = $date_d[1];
$annee_d = $date_d[2];

}
$i2=$i2+1;
}
else {
$prem_j_sem = date("d-n-Y", mktime(0, 0, 0, $mois_d, $jour_d, $annee_d));
$date = explode("-", $prem_j_sem);
$jour = $date[0];
$mois = $date[1];
$annee = $date[2];
$dern_j_sem = date("d-n-Y", mktime(0, 0, 0, $moisjour, $jour+7, $annee));
$date_d = explode("-", $dern_j_sem);
$jour_d = $date_d[0];
$mois_d = $date_d[1];
$annee_d = $date_d[2];
$i2=$i2+1;
}


                   echo"
                   <!-- SEMAINE ".$i2." DE ".strtoupper($moisjour_lettres)." -->
                    <td width=\"118\"";
                   if($i2 != 0){
                   echo "style=\"border-left-width:1px; border-left-color:white; border-left-style:solid;\"";
                   }
                   echo ">";
                        if($i2 == 5 AND $mois == $mois_d){
                        echo "<p align=\"center\"><font face=\"Arial\"><span style=\"font-size:8pt;\">Du ".$jour." ".mois($mois)." au ".$jour_d." ".mois($mois_d)."</span></font></p>";
                        }
                        elseif($i2 == 5 AND $jour_d == 1){
                        echo "<p align=\"center\"><font face=\"Arial\"><span style=\"font-size:8pt;\">Du ".$jour." ".mois($mois)." au ".$jour_d." ".mois($mois_d)."</span></font></p>";
                        }
                        elseif($i2 < 5){
                        echo "<p align=\"center\"><font face=\"Arial\"><span style=\"font-size:8pt;\">Du ".$jour." ".mois($mois)." au ".$jour_d." ".mois($mois_d)."</span></font></p>";
                        }
                        else {
                        echo "<p align=\"center\"><font face=\"Arial\"><span style=\"font-size:8pt;\">&nbsp;</span></font></p>";

                        }
                    echo "</td>"; 
                    }
                    echo"
                </tr>
            </table>";
            
 //// fin du code
 echo "</td>
    </tr>
</table>";
$moisjour = $moisjour + 1;
$i = $i +1;
$semaine = $semaine+1;
}
Prochaine étape : croiser ce tableau avec une base de donnée pour connaitre les semaines qui sont deja reservées !
Si le script final interresse quelqun, qu'il me le fasse savoir, dans ce cas je publierai le code une fois terminé

Bonne journée à tous !