Parcourir une table (mysql/php)

Résolu
Bonjour à tous,

Je viens de créer une table dans une base de donnée Mysql.
La table contient 3 champs : Date (la clé primaire) , titre, description.

Ensuite , j'ai une page PHP qui affiche des dates.

Je voudrais trouver une fonction ou une structure qui parcours le champs DATE de
ma table et si une des dates affichées existent aussi dans la table, elle sera afficher
d'une autre couleur.

Je m'explique mieux. Par exemple, j'affiche touts les jours du mois de juin, je veux que la fonction recherche à chaque date afficher si un evenement de la table correspond. Si oui, je lui rajoute une classe CSS.

Merci d'avance!!
Configuration: Windows XP
Firefox 2.0.0.14

12 réponses

  1. Voici un exemple, inspires-toi en.
    En effet, tu peux générer depuis mysql un array qui contient tous les évenements.
    Pour générer ton array :
    $i = 0;
    $evenements = array();
    $req_array = mysql_query('SELECT * FROM `evenements`');
    while (mysql_fetch_array($req_array) = $champs) {
    	$evenements[$i][0] = $champs[0]; // Date
    	$evenements[$i][1] = $champs[1]; // Titre
    	$evenements[$i][2] = $champs[2]; // Description
    	$i++;
    }

    Lorsque PHP génère ton calendrier, il génère d'abord le 1, puis le 2, le 3, etc.
    Il faut que au moment ou PHP génère ces chiffres tu testes si la date se trouve dans l'array :
    (Exemple dans le cas du 06/06/2008)
    if (in_array('06/06/2008', $evenements)) {
    	// Le date est dans l'array
    } else {
    	// La date n'est pas dans l'array
    }
    
    1. J'ai essayer d'insérer ton code le mieu possible dans mon script, mais j'ai une erreur :

      Fatal error: Can't use function return value in write context in C:\Program Files\EasyPHP 2.0b1\www\Calendrier\script_presentation.php on line 70

      A cette ligne là :

      while (mysql_fetch_array($req_array) = $champs) {

      Est ce que tu vois ce que ça peut être?
    2. @LaorraAutant pour moi, il manquait juste le = :$

      Merci!
  2. bonjour,

    j'ai utilisé le script du calendrier.php et cela marche. Cependant dans mes évènement j'ai plusieurs évènement le même jour. et je n'arrive pas a afficher une infobulle avec Deux évènement. je n'arrive que seulement a en affiché un!

    // Fonction pour afficher le calendrier
    function showCalendar($periode) {
    	
    /*connexion a la base de données*/
    $mabasededonnee="bdsite_intranet";
    $connection = mysql_connect("","","");// c'est ma onnexion => Sécurité ;p
    mysql_select_db($mabasededonnee) or die ("pas de connection"); 
    if (!$connection ){	die ("connection impossible");}
    		
    $leCalendrier = "";
    // Tableau des valeurs possibles pour un numéro de jour dans la semaine
    $tableau = Array("0", "1", "2", "3", "4", "5", "6", "0");
    $nb_jour = Date("t", mktime(0, 0, 0, getMonth($periode), 1, getYear($periode)));
    $pas = 0;
    $indexe = 1;
    // Affichage du mois et de l'année
    $leCalendrier .= "\n<p class=\"titreCalendrier\">  " . monthNumToName(getMonth($periode)) . " " . getYear($periode) . "</p>";
    // Affichage des entêtes
    $leCalendrier .= "
    <table id=\"libelle\">
    	<td>L</td>
    	<td>M</td>
    	<td>M</td>
    	<td>J</td>
    	<td>V</td>
    	<td>S</td>
    	<td>D</td>
    </table>";
    		
    // Tant que l'on n'a pas affecté tous les jours du mois traité
    while ($pas < $nb_jour) {
    	if ($indexe == 1) $leCalendrier .= "\n<table class=\"ligne\">";
    			
    	// Si le jour calendrier == jour de la semaine en cours
    	if (Date("w", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode))) == $tableau[$indexe]) {
    			
    		// Si jour calendrier == aujourd'hui
    		$afficheJour = Date("j", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode)));
    		if (Date("Y-m-d", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode))) == Date("Y-m-d")) {
    			$class = " class=\"itemCurrentItem\" ";
    		}
    				
    		else {
    			//mes manipulations
    			$requete="SELECT dateEv, descEv FROM evenement WHERE dateEv like '".getYear($periode)."-".getMonth($periode)."-%' group by dateEv  "; // requête
    			$result = mysql_query($requete,$connection); // envoi de la requête 
    			while($row = mysql_fetch_row($result)){
    				$date = $row[0];
    				$desc = $row[1];
    						
    				if ($row[0] == Date("Y-m-d", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode))))//si la date de l'évènement correspond a une date du mois alors on a une info bulle
    				{
    					$afficheJour = "<a  class='info' href=\"".$row[0].".php\">" . Date("j", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode))) . "<span>".$row[1]."</span></a>";
    				}
    				else
    				{
    					$class = " class=\"itemExistingItem\" ";
    				}
    			}
    		}
    		// Ajout de la case avec la date
    		$leCalendrier .= "\n<td$class>$afficheJour</td>";
    		$pas++;
    	}
    	//
    	else {
    		// Ajout d'une case vide
    		$leCalendrier .= "\n<td> </td>";
    	}
    	if ($indexe == 7 && $pas < $nb_jour) { $leCalendrier .= "\n</ul>"; $indexe = 1;} else {$indexe++;}
    }
    // Ajustement du tableau
    for ($i = $indexe; $i <= 7; $i++) {
    	$leCalendrier .= "\n<td> </td>";
    }
    $leCalendrier .= "\n</table>\n";
    // Retour de la chaine contenant le Calendrier
    return $leCalendrier;}
    
    1. Je peut te proposer un script simple, prêt à l'emploi et facile à installer même pour un novice, qui affiche un calendrier avec des couleurs de fond des cellules différentes si la date est inscrite dans la base de données.
      Tu trouvera une démonstration sur cette page https://www.mathieuweb.fr/calendrier/calendrier.php
      1. Merci beaucoup adgemO, j'ai bidouillé un peu mon code avec le tien, et ça me donne quelque chose de pas mal du tout!!

        Encore merci et bonne après midi à toi :D
        1. Oui moi j'ai une idée ...
          Télécharge et teste ça :
          Calendrier.php

          Ne te contente pas de le voir fonctionner mais cherche à savoir comment ça fonctionne !
          Bonne chance et préviens-moi si tu rencontre des problèmes !
          1. Bonjour, ton lien vers le calendrier ne fonctionne pas ?
        2. J'ai mis une accolade en trop à la fin attention!
          1. Bon,
            J'ai essayé de faire un petit mix avec les explication de vos deux posts.
            Mais ça ne marche pas. Les date ne sont pas coloré.
            Je reposte mon code, après modifications :

            <?php
            if (isset($_POST['change'])){
            $oldDate = $_POST['currentDate'];
            switch ($_POST['change']){
            case ">":
            $tab = getdate($_POST['currentDate']);
            $tab["mon"]++;
            $date = mktime(0,0,0,$tab['mon'], $tab['mday'], $tab['year']);
            break;
            case "<":
            $tab = getdate($_POST['currentDate']);
            $tab["mon"]--;
            $date = mktime(0,0,0,$tab['mon'], $tab['mday'], $tab['year']);
            break;
            }
            }

            // substr garde la chaine de caract? d?rmin?par $start
            function getSeconde($valeur) {
            return substr($valeur, 17, 2);
            }
            function getMinute($valeur) {
            return substr($valeur, 14, 2);
            }
            function getheure($valeur) {
            return substr($valeur, 11, 2);
            }
            function getjour($valeur) {
            return substr($valeur, 8, 2);
            }
            function getMois($valeur) {
            return substr($valeur, 5, 2);
            }
            function getAnnee ($valeur) {
            return substr($valeur, 0, 4);
            }
            function numMois($mois) {
            $tableau = Array("", "Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout" , "Septembre", "Octobre", "Novembre", "Décembre");
            return (intval($mois) > 0 && intval($mois) < 13) ? $tableau[intval($mois)] : "Ind?ni";
            } //intval converti par d?ult une valeur en base 10
            //Fonction pour afficher le calendrier
            function showCalendar($timestamp) {
            $periode = date("Y-m", $timestamp);

            $leCalendrier = "";
            $mois = getMois($periode);
            $annee = getAnnee ($periode);
            // Tableau des valeurs possibles pour un num? de jour dans la semaine
            $tableau = Array("0", "1", "2", "3", "4", "5", "6", "0");
            $nb_jour = Date("t", mktime(0, 0, 0, $mois, 1, $annee));
            $pas = 0;
            $index = 1;
            mysql_connect("localhost", "root", "");
            mysql_select_db("calendrier");
            $i = 0;
            $evenement = array(); //génération du tableau
            $req_array = mysql_query("SELECT * FROM evenement")or die(mysql_error());
            while ($champs = mysql_fetch_array($req_array)) {
            $evenements[$i][0] = $champs[0]; // Date
            $evenements[$i][1] = $champs[1]; // Titre
            $evenements[$i][2] = $champs[2]; // Description
            $i++;
            }
            // Affichage du mois et de l'ann?en titre
            $leCalendrier .= "<form method=\"post\" action=\"new.php\"><h2><input type=\"submit\" value=\"<\" name=\"change\" />" . numMois($mois) . " " . $annee . "<input type=\"submit\" value=\">\" name=\"change\" /></h2><input type=\"hidden\" name=\"currentDate\" value=\"" . $timestamp . "\" /></form>";
            // Affichage des ent?s
            $leCalendrier .= "
            <ul id=\"libelle\">
            \t<li>L</li>
            \t<li>M</li>
            \t<li>M</li>
            \t<li>J</li>
            \t<li>V</li>
            \t<li>S</li>
            \t<li>D</li>
            </ul>";
            // Tant que l'on n'a pas affect?ous les jours du mois trait?
            while ($pas < $nb_jour) {
            if ($index == 1) $leCalendrier .= "\n\t<ul class=\"ligne\">";
            // Si le jour calendrier == jour de la semaine en cours
            if (Date("w", mktime(0, 0, 0, $mois, 1 + $pas, $annee)) == $tableau[$index]) {
            // Si jour calendrier == aujourd'hui
            $afficheJour = Date("j", mktime(0, 0, 0, $mois, 1 + $pas, $annee));
            if (Date("Y-m-d", mktime(0, 0, 0, $mois, 1 + $pas, $annee)) == Date("Y-m-d")) {
            $class = " class=\"itemCurrentItem\"";
            }
            else {
            //Il faut parcourir le tableau pour voir si la date qui va ?e existe dans la bdd
            $LaDate = $annee .'-'. numMois($mois). '-' . $afficheJour ;
            if (in_array($LaDate, $evenement)) {

            $class = " class=\"itemExistingItem\"";
            //apr?pour choisir les jours avec liens, base de donn?SQL
            $afficheJour = "<span>" . Date("j", mktime(0, 0, 0, $mois, 1 + $pas, $annee)) . "</span>";
            }
            else {
            $class = "";
            }
            }
            // Ajout de la case avec la date
            $leCalendrier .= "\n\t\t<li$class>$afficheJour</li>";
            $pas++;
            }
            //
            else {
            // Ajout d'une case vide
            $leCalendrier .= "\n\t\t<li> </li>";
            }
            if ($index == 7 && $pas < $nb_jour) { $leCalendrier .= "\n\t</ul>"; $index = 1;} else {$index++;}
            }
            // Ajustement du tableau
            for ($i = $index; $i <= 7; $i++) {
            $leCalendrier .= "\n\t\t<li> </li>";
            }
            $leCalendrier .= "\n\t</ul>\n";
            // Retour de la chaine contenant le Calendrier
            return $leCalendrier;
            }
            if (!isset($date)) $date = time();
            ?>
            <html>
            <head>
            <link rel="stylesheet" media="screen" type="text/css" title="style" href="style.css" />
            </head>
            <body class="back">
            <?php
            echo showCalendar($date);
            ?>
            </body>
            </html>

            Je pense que le probleme vient du passage souligné.
            Ma base de données s'appelle Calendrier, ma table : evenement.

            Une idée?
        3. //VOICI dans les grandes lignes:

          <style>
          .classEnRouge {color:red}
          .classPasEnRouge {}
          </style>

          //Fontion qui renvoie true si la la date $date existe dans la table des
          //Evenements (ta table: date,titre, description)
          function existEvenement($date)
          {
          $requeteSQL="select 1 from tableDesEvenements where date='$date'";
          $reponse=mysql_query($requeteSQL);
          $exist=(mysql_num_rows($reponse)>0); //Mis à true si la date $date existe dans tableDesEvenements

          return($exist);
          }

          //Tableau dont chaque élément est une date à afficher
          $aListeDesDatesAAfficher =Array("20080612","20080615");

          //Boucle de lecture du tableau ci-dessus.
          forEach($aListeDesDatesAAfficher as $date)
          {

          //Choix du nom de la classe CSS
          //(la fonction existEvenement() est appelée avec la date $date en paramètre).
          $classCSS=(existEvenement($date))? "classEnRouge" : "classPasEnRouge";

          //Affichage de la date dans la bonne couleur
          $codeHTML="<span class='$classCSS'>$date</span>";
          echo "$codeHTML<br/>"; }
          }

          //Pour le format des dates je te laisse gérer..., ça dépendra aussi du type de ton champ date.
          1. Oui !
            J'en ai connu des pires ...
            1. Bin voilà !!

              <?php

              if (isset($_POST['change'])){

              $oldDate = $_POST['currentDate'];

              switch ($_POST['change']){

              case ">":

              $tab = getdate($_POST['currentDate']);

              $tab["mon"]++;

              $date = mktime(0,0,0,$tab['mon'], $tab['mday'], $tab['year']);

              break;

              case "<":

              $tab = getdate($_POST['currentDate']);

              $tab["mon"]--;

              $date = mktime(0,0,0,$tab['mon'], $tab['mday'], $tab['year']);

              break;

              }

              }

              // substr garde la chaine de caractËre dÈterminÈe par $start

              function getSeconde($valeur) {

              return substr($valeur, 17, 2);

              }

              function getMinute($valeur) {

              return substr($valeur, 14, 2);

              }

              function getheure($valeur) {

              return substr($valeur, 11, 2);

              }

              function getjour($valeur) {

              return substr($valeur, 8, 2);

              }

              function getMois($valeur) {

              return substr($valeur, 5, 2);

              }

              function getAnnÈe($valeur) {

              return substr($valeur, 0, 4);

              }

              function numMois($mois) {

              $tableau = Array("", "Janvier", "FÈvrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "AÙut", "Septembre", "Octobre", "Novembre", "DÈcembre");

              return (intval($mois) > 0 && intval($mois) < 13) ? $tableau[intval($mois)] : "IndÈfini";

              } //intval converti par dÈfault une valeur en base 10

              //Fonction pour afficher le calendrier

              function showCalendar($timestamp) {

              $periode = date("Y-m", $timestamp);

              $leCalendrier = "";

              $mois = getMois($periode);

              $annee = getAnnÈe($periode);

              // Tableau des valeurs possibles pour un numÈro de jour dans la semaine

              $tableau = Array("0", "1", "2", "3", "4", "5", "6", "0");

              $nb_jour = Date("t", mktime(0, 0, 0, $mois, 1, $annee));

              $pas = 0;

              $index = 1;

              // Affichage du mois et de l'annÈe en titre

              $leCalendrier .= "<form method=\"post\" action=\"calendrier.php\"><h2><input type=\"submit\" value=\"<\" name=\"change\" />" . numMois($mois) . " " . $annee . "<input type=\"submit\" value=\">\" name=\"change\" /></h2><input type=\"hidden\" name=\"currentDate\" value=\"" . $timestamp . "\" /></form>";

              // Affichage des entÍtes

              $leCalendrier .= "

              <ul id=\"libelle\">

              \t<li>L</li>

              \t<li>M</li>

              \t<li>M</li>

              \t<li>J</li>

              \t<li>V</li>

              \t<li>S</li>

              \t<li>D</li>

              </ul>";

              mysql_connect("localhost", "root", "");

              mysql_select_db("calendrier");

              $i = 0;

              $evenement = array(); //génération du tableau

              $req_array = mysql_query("SELECT * FROM evenement")or die(mysql_error());

              while (mysql_fetch_array($req_array) == $champs) {

              $evenement[$i][0] = $champs[0];

              $evenement[$i][1] = $champs[1];

              $evenement[$i][2] = $champs[2];

              $i++;

              }

              // Tant que l'on n'a pas affectÈ tous les jours du mois traitÈ

              while ($pas < $nb_jour) {

              if ($index == 1) $leCalendrier .= "\n\t<ul class=\"ligne\">";

              // Si le jour calendrier == jour de la semaine en cours

              if (Date("w", mktime(0, 0, 0, $mois, 1 + $pas, $annee)) == $tableau[$index]) {

              // Si jour calendrier == aujourd'hui

              $afficheJour = Date("j", mktime(0, 0, 0, $mois, 1 + $pas, $annee));

              if (Date("Y-m-d", mktime(0, 0, 0, $mois, 1 + $pas, $annee)) == Date("Y-m-d")) {

              $class = " class=\"itemCurrentItem\"";

              }

              else {

              //Il faut parcourir le tableau pour voir si la date qui va Ítre existe dans la bdd

              if (1)) {

              $class = " class=\"itemExistingItem\"";

              //aprËs pour choisir les jours avec liens, base de donnÈe SQL

              $afficheJour = "<a href=\"\">" . Date("j", mktime(0, 0, 0, $mois, 1 + $pas, $annee)) . "</a>";

              }

              else {

              $class = "";

              }

              }

              // Ajout de la case avec la date

              $leCalendrier .= "\n\t\t<li$class>$afficheJour</li>";

              $pas++;

              }

              //

              else {

              // Ajout d'une case vide

              $leCalendrier .= "\n\t\t<li> </li>";

              }

              if ($index == 7 && $pas < $nb_jour) { $leCalendrier .= "\n\t</ul>"; $index = 1;} else {$index++;}

              }

              // Ajustement du tableau

              for ($i = $index; $i <= 7; $i++) {

              $leCalendrier .= "\n\t\t<li> </li>";

              }

              $leCalendrier .= "\n\t</ul>\n";

              // Retour de la chaine contenant le Calendrier

              return $leCalendrier;

              }

              if (!isset($date)) $date = time();

              ?>

              <html>

              <head>

              <link rel="stylesheet" media="screen" type="text/css" title="style" href="style.css" />

              </head>

              <body class="back">

              <?php

              echo showCalendar($date);

              ?>

              </body>

              </html>

              Je te souhaite bien du courage. J'ai pour l'instant seulement rajouter ton script pour créer le array, et encore je ne sais pas si il est bien placé (Ca me dit que $champs n'est pas défini). Merci beaucoup en tout cas!
          2. Alors ton problème est-il résolu ?
            Préviens moi si tu rencontre encore des difficultés ...
            1. Et bien ça ne marche pas ... mais je ne me vois pas poster tout mon code ici :s
              Il fais une centaine de ligne.

              Tu as du courage?
          3. Bonjour et merci !

            Mais comment parcourir une table Mysql?
            Je dois enregistrer la table dans un array?
            Ou je peu la parcourir comme ça?
            1. Il faut faire deux boucles while imbriquée l'une dans l'autre.
              La première pour toutes les dates et la deuxième pour vérifier à cette date si il y a des évenements.