IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] une boucle qui ne boucle pas


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 82
    Points : 44
    Points
    44
    Par défaut [Tableaux] une boucle qui ne boucle pas
    Bonjour,

    J'essaie de monter un calendrier/agenda. Je voudrais qu'une fois mes rendez-vous enregistrés dans mon agenda, les jours du calendrier correspondants aux dates de rendez-vous s'affichent de couleur différentes.

    J'ai utilisée une boucle "for" pour parcourir tous les jours du mois un à un.
    Voici ma boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    //pour afficher les evenements existants
    $sql = 'SELECT * FROM agenda WHERE mois_even = '.$month.' AND annee_even = '.$year.' ORDER BY jour_even ASC;';
    $result = mysql_query ($sql, $cnx) or die('Erreur : '.mysql_error());
    $RsAgenda = mysql_fetch_array($result);
     
    //affiche tous les jours du mois actuel
    for ($i = 1; $i <= $jours_mois; $i++) { //de 1 a 30 (ou 31) jours
     
    	//si c'est aujourd'hui
    	if (($jouractuel==$i) && ($moisactuel==$month)) { 
    		//si c'est un evenement
    		if (($RsAgenda[1]==$i) && ($RsAgenda[2]==$month)) { 
    			echo ('<td width="15" class="caseActifEven"><a href="?y='.$year.'&m='.$month.'&d='.$i.'">'.$i.'</a></td>');
    		} else { //si ce n'est pas un evenement
    			echo ('<td width="15" class="caseActif">'.$i.'</td>');
    		}
    	} else { //tous les autres jours
    		//si c'est un evenement
    		if (($RsAgenda[1]==$i) && ($RsAgenda[2]==$month)) { 
    			echo ('<td width="15" class="caseEven"><a href="?y='.$year.'&m='.$month.'&d='.$i.'">'.$i.'</a></td>');
    		} else { //si ce n'est pas un evenement
    			echo ('<td width="15" class="case">'.$i.'</td>');
    		}
    	}
     
    	$case++;
     
    	if ($case%7==0){ //si on arrive a dimanche aller a la ligne
    		echo ('</tr><tr>');
    	}//fin du if
     
    }//fin du for
    Mon problème c'est que cette boucle ne boucle pas : j'ai 3 événements en septembre (les 14, 15 et 20) or seul le 14 s'affiche dans mon calendrier comme étant un événement (class="caseEven"). Les événements du 15 et 20 restent marqués comme des jours sans rien (class="case").

    Quelqu'un pourrait me dire ce que j'ai mal fait ou oublié ?
    Merci.

  2. #2
    Membre actif Avatar de MANU_2
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 417
    Points : 275
    Points
    275
    Par défaut
    ton $jours_mois viens d'où ?
    Tu as fait un echo de cette variable ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 82
    Points : 44
    Points
    44
    Par défaut
    oui oui, toutes les variables présentes ici sont ok.
    $jours_mois est déclarée un peu plus haut dans le code (je n'ai pas mis toute la page qui est un peu longue).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //nombre de jours dans le mois
    $jours_mois = date('t',$time);

  4. #4
    Membre confirmé Avatar de papyphp
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 438
    Points : 587
    Points
    587
    Par défaut
    Bonjour,

    A mon avis, le problème vient d'ici
    $RsAgenda = mysql_fetch_array($result);
    $RsAgenda ne contient que le première ligne du résultat. Il faut boucler pour obtenir les autres
    Lu kinze d' awousse, la Vierje arandje û dusbrôle lu timp.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 82
    Points : 44
    Points
    44
    Par défaut
    Oui j'y ai pensé mais je ne vois pas où insérer cette deuxième boucle.
    Là où je place mon "while", soit plus rien ne s'affiche soit j'ai un time out.

    Une suggestion ??

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 82
    Points : 44
    Points
    44
    Par défaut
    si je place un while autour de ma boucle for, j'obtiens 3 calendriers (normal puisque j'ai 3 enregistrements dans ma table).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    //pour afficher les evenements existants
    $sql = 'SELECT * FROM agenda WHERE mois_even = '.$month.' AND annee_even = '.$year.' ORDER BY jour_even ASC;';
    $result = mysql_query ($sql, $cnx) or die('Erreur : '.mysql_error());
    while ($RsAgenda = mysql_fetch_array($result)) {
     
    //affiche tous les jours du mois actuel
    for ($i = 1; $i <= $jours_mois; $i++) { //de 1 a 30 (ou 31) jours
     
    	//si c'est un evenement
    	if (($RsAgenda[1]==$i) && ($RsAgenda[2]==$month)) { 
    		//si c'est aujourd'hui
    		if (($jouractuel==$i) && ($moisactuel==$month)) { 
    			echo ('<td width="15" class="caseActifEven"><a href="?y='.$year.'&m='.$month.'&d='.$i.'">'.$i.'</a></td>');
    		} else { //si ce n'est pas aujourd'hui
    			echo ('<td width="15" class="caseEven"><a href="?y='.$year.'&m='.$month.'&d='.$i.'">'.$i.'</a></td>');
    		}
    	} 
     
    	//si ce n'est pas un evenement
    	if (!($RsAgenda[1]==$i) && ($RsAgenda[2]==$month)) { 	
    		//si c'est aujourd'hui
    		if (($jouractuel==$i) && ($moisactuel==$month)) { 
    			echo ('<td width="15" class="caseActif">'.$i.'</td>');
    		} else { //si ce n'est pas aujourd'hui
    			echo ('<td width="15" class="case">'.$i.'</td>');
    		}
    	}
     
    	$case++;
     
    	if ($case%7==0){ //si on arrive a dimanche aller a la ligne
    		echo ('</tr><tr>');
    	}//fin du if
     
    }//fin du for
    }//fin du while
    si je place mon while à l'intérieur de ma boucle for, seul les 3 premiers jours s'affichent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    //pour afficher les evenements existants
    $sql = 'SELECT * FROM agenda WHERE mois_even = '.$month.' AND annee_even = '.$year.' ORDER BY jour_even ASC;';
    $result = mysql_query ($sql, $cnx) or die('Erreur : '.mysql_error());
     
    //affiche tous les jours du mois actuel
    for ($i = 1; $i <= $jours_mois; $i++) { //de 1 a 30 (ou 31) jours
    while ($RsAgenda = mysql_fetch_array($result)) {
     
    	//si c'est un evenement
    	if (($RsAgenda[1]==$i) && ($RsAgenda[2]==$month)) { 
    		//si c'est aujourd'hui
    		if (($jouractuel==$i) && ($moisactuel==$month)) { 
    			echo ('<td width="15" class="caseActifEven"><a href="?y='.$year.'&m='.$month.'&d='.$i.'">'.$i.'</a></td>');
    		} else { //si ce n'est pas aujourd'hui
    			echo ('<td width="15" class="caseEven"><a href="?y='.$year.'&m='.$month.'&d='.$i.'">'.$i.'</a></td>');
    		}
    	} 
     
    	//si ce n'est pas un evenement
    	if (!($RsAgenda[1]==$i) && ($RsAgenda[2]==$month)) { 	
    		//si c'est aujourd'hui
    		if (($jouractuel==$i) && ($moisactuel==$month)) { 
    			echo ('<td width="15" class="caseActif">'.$i.'</td>');
    		} else { //si ce n'est pas aujourd'hui
    			echo ('<td width="15" class="case">'.$i.'</td>');
    		}
    	}
     
    	$case++;
     
    	if ($case%7==0){ //si on arrive a dimanche aller a la ligne
    		echo ('</tr><tr>');
    	}//fin du if
     
    }//fin du while
    }//fin du for
    La je vois vraiment pas quoi faire...
    Des suggestions ??

  7. #7
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2006
    Messages : 60
    Points : 66
    Points
    66
    Par défaut
    Le problème est assez évident... tu dois boucler sur tous les jours du mois (avec ta boucle for) et ensuite vérifier pour chaque entrée de ta base de données s'il y a un événement qui correspond à la date que tu es rendu dans ta boucle FOR.

    Ce que je ferais :
    au début, je crérais un array contenant toutes mes entrées, dont l'index serait la journée du mois, selon la syntaxe suivante :

    $tab_agenda[21] = array([0]=>tes données,[1]=>tes données,etc..)
    $tab_agenda[26] = array([0]=>tes données)

    voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $sql = 'SELECT * FROM agenda WHERE mois_even = '.$month.' AND annee_even = '.$year.' ORDER BY jour_even ASC;';
    $result = mysql_query ($sql, $cnx) or die('Erreur : '.mysql_error());
     
    $tab_agenda = array();
    while ($rs = MYSQL_FETCH_ARRAY($result,MYSQL_ASSOC)) {<div style="margin-left:40px">array_push($tab_agenda[$rs["jour_even"]],$rs);</div>}
     
    //affiche tous les jours du mois actuel
    for ($i = 1; $i <= $jours_mois; $i++) { //de 1 a 30 (ou 31) jours<div style="margin-left:40px">//Si on a des événements pour cette date...
    if (array_keys($tab_agenda,$i)) {<div style="margin-left:40px">//Tu affiches les infos
    foreach($tab_agenda[$i] as $valeur) {<div style="margin-left:40px">//Tu récupères les infos de la facon suivante...
    $valeur["titre"]
    $valeur["tes_autres_champs"]</div>}</div>} else {<div style="margin-left:40px">//Ici c'est qu'il n'y a pas d'événement pour cette date</div>}</div>}//fin du for
    Test le code et donnes moi des nouvelles !


  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 82
    Points : 44
    Points
    44
    Par défaut
    Merci pour ton code mais j'ai une erreur qui s'affiche :
    Warning: array_push() [function.array-push]: First argument should be an array

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    $sql = 'SELECT * FROM agenda WHERE mois_even = '.$month.' AND annee_even = '.$year.' ORDER BY jour_even ASC';
    $result = mysql_query ($sql, $cnx) or die('Erreur : '.mysql_error());
     
    $tab_agenda = array();
    while ($rs = MYSQL_FETCH_ARRAY($result,MYSQL_ASSOC)) {
    	array_push($tab_agenda[$rs["jour_even"]],$rs);
    }
     
    //affiche tous les jours du mois actuel
    for ($i = 1; $i <= $jours_mois; $i++) { //de 1 a 30 (ou 31) jours
    	//Si on a des événements pour cette date...
    	if (array_keys($tab_agenda,$i)) {//Tu affiches les infos
    		foreach($tab_agenda[$i] as $valeur) {//Tu récupères les infos de la facon suivante...
    		$valeur["jour_even"];
    		$valeur["mois_even"];
    		$valeur["annee_even"];
    		$valeur["categorie_even"];
    		$valeur["titre_even"];
    		$valeur["lieu_even"];
    		$valeur["descriptif_even"];
    		$valeur["auteur_even"];
    	}
    	} else {//Ici c'est qu'il n'y a pas d'événement pour cette date
    	}
    }//fin du for

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 82
    Points : 44
    Points
    44
    Par défaut
    Juste pour info. Le code est corrigé et fonctionne.
    Merci à vous pour votre soutien.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    //mois et jour actuels
    $moisactuel = date('n');
    $jouractuel = date('d');
     
    //recupere les evenements du mois en cours
    $sql = 'SELECT * FROM agenda WHERE mois_even = '.$month.' AND annee_even = '.$year.' ORDER BY jour_even ASC';
    $result = mysql_query ($sql, $cnx) or die('Erreur : '.mysql_error());
     
    $tab_agenda = array();
    while ($RsAgenda = mysql_fetch_array($result)) {
    	array_push($tab_agenda, $RsAgenda[1]);
    }
     
    for ($i = 1; $i <= $jours_mois; $i++) { //de 1 a 30 (ou 31) jours
    	if (in_array($i, $tab_agenda)) {//si c'est un evenement	
            if (($jouractuel==$i) && ($moisactuel==$month)) { //si c'est aujourd'hui
                echo ('<td width="15" class="caseActifEven"><a href="">'.$i.'</a></td>');
            } else { //si ce n'est pas aujourd'hui
                echo ('<td width="15" class="caseEven"><a href="">'.$i.'</a></td>');
            }   
        } else {//si ce n'est pas un evenement
            if (($jouractuel==$i) && ($moisactuel==$month)) { 
                echo ('<td width="15" class="caseActif">'.$i.'</td>');
            } else { //si ce n'est pas aujourd'hui
                echo ('<td width="15" class="case">'.$i.'</td>');
           }
        }//fin du if
     
        $case++;
        if ($case%7==0){ //si on arrive a dimanche aller a la ligne
            echo ('</tr><tr>');
        }
    }//fin du for

  10. #10
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2006
    Messages : 60
    Points : 66
    Points
    66
    Par défaut
    Je suis bien content que mon code fonctionne. Bonne chance dans ton projet !


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] utilisation d'une boucle qui ne fonctionne pas
    Par sharox dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 21/11/2013, 08h58
  2. Encore une boucle qui ne marche pas
    Par Runsh63 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 13/04/2011, 09h16
  3. Range.Offset(1) dans une boucle qui ne fonctionne pas
    Par Pierre.g dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/08/2008, 11h58
  4. Réponses: 10
    Dernier message: 07/01/2007, 12h03
  5. Réponses: 1
    Dernier message: 28/07/2005, 14h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo