création dynamique d'un tableau

Eléphant du PHP | 148 Messages

11 sept. 2007, 14:32

Bonjour tout le monde,

me revoilà avec un autre petit problème :

j'essaie de générer un calendrier dans un tableau, en fonction du mois et de l'année choisis. Les jours sont sur une ligne, chacun dans une case, ensuite sur les lignes suivantes sont affichés les enregistrements correspondants aux jours, chaque ligne représentant une periode.

Pour le calendrier, c'est bon, sur la première ligne les jours s'affichent correctement. Mon souci est de faire correspondre les évenements selon la période et le jour.

Pour être plus clair, voici mon code :
<?php
session_start();
require ("_cnn/_cnn.php");

// requete dans la base
	$id_med = $_SESSION['id_med'];
	$req_evnm = "SELECT * FROM evenement WHERE medecin='$id_med'";
	$rs_evnm = mysql_query($req_evnm) or die(mysql_error());
	$row_req_evnm = mysql_fetch_assoc($rs_evnm);
	$totalRows_req_evnm = mysql_num_rows($rs_evnm);
	


// calendrier

$date=date('D/d/m/Y');
list($dcourt,$day, $month, $year) = explode("/", $date);
if (isset($_POST['valider'])){
	if (isset($_POST['mois'])) {
		$date=date('D/d/m/Y');
		list($dcourt,$day, $month, $year) = explode("/", $date);
		$month = $_POST['mois'];
		if (isset($_POST['annee'])) {
			if ($_POST['annee'] <> $year) {
				$year_choisi = $_POST['annee'];
				$annee = $year_choisi;
			}
			else {
				$year = $_POST['annee'];
				$annee = $year;
			}
		}
	}
	else {
		$date=date('D/d/m/Y');
		list($dcourt,$day, $month, $year) = explode("/", $date);
	}


	// début tableau
	echo "<table width=\"95%\" border=\"1\">";
	echo "<tr>";
	echo "<td>&nbsp;</td>";
	
	// début calendrier
	
	$joursem = array('dim', 'lun', 'mar', 'mer', 'jeu', 'ven', 'sam');
	$mois=array('','Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre');
	
	
	
	// nombre de jours du mois
	$nombreDeJours =  date("t",mktime(0,0,0,$month +1,0,$annee)); 
	
	// initialisation du compteur              
	$i=1;
	
	//$month_t=intval(date("n"));
	$month_t=$mois[$month];

	// affichage du mois par son nom
	echo "<p>Planning du mois de ".$month_t." ".$annee." du Dr ".$_SESSION['nom']."</p>";
	
	// début d'entrée des dates.
	
	while ($i<=$nombreDeJours){
	
		// calcul du timestamp
		$timestamp = mktime (0, 0, 0, $month, $i, $annee);
		
		$l=$year."-".$month."-".$i;
		
		list($a, $m, $d) = sscanf($l, "%d-%d-%d"); //%d pour récupérer des entiers
		
		// jour en français
		$vrai_jour = $joursem[date("w",$timestamp)];
		
		// Gestion du style
		if (($vrai_jour == "sam") || ($vrai_jour == "dim")) {
			$style = "red";
			}
		else {
			$style = "normal";
		}
		
		// affichage
		echo "<td align=\"center\"><span class=\"".$style."\">".$vrai_jour." ".$i."</span></td>";
		$i=$i+1;
	}
	
	//fermeture de la ligne
	echo "</tr>";
	##############################################################
	
	// Pour la periode 1
	
	$i = 1;
	echo "<tr>";
	echo "<td align=\"center\">8h30 - 13h30</td>";
	$date_req = $annee."-".$month."-".$i;
	while ($i<=$nombreDeJours) {
		do {
			if (($row_req_evnm['periode'] === "8h30 - 13h30") && ($row_req_evnm['date'] === $annee."-".$month."-".$i)){
				
				// affichage
				echo $date_req;
				echo "<td align=\"center\">".$row_req_evnm['type']."</td>";
				$i=$i+1;
			}
			else {
				echo "<td align=\"center\"> - </td>";
				$i=$i+1;
			}
		} while($row_req_evnm = mysql_fetch_object($rs_evnm));
	}
?>
L'affichage de la 2e ligne du tableau commence aux ###
Le problème c'est que l'enregistrement concerné est toujours le même. Donc si "n" est le nombre de jours, j'ai n fois l'affichage de la même date ( echo $date_req;)

Voilà, je pense qu'il y a un problème dans la fin de mon script. Je n'ai pas implémenté les 2e et 3e lignes, ce sera pareil, seule une condition changera.

Merci de vos conseils zavisés ;)
Et hop !

d0m
Mammouth du PHP | 1141 Messages

11 sept. 2007, 15:03

effectivement, une petite erreur de placement,
ta ligne
$date_req = $annee."-".$month."-".$i;
est hors de la boucle.
Ta date n'est donc jamais incrémentée.

Eléphant du PHP | 148 Messages

11 sept. 2007, 15:08

Oui, je viens de le voir, mais en fait, je ne me sers pas de cette variable dans ma condition juste en dessous.

Mais j'ai trouvé le problème, j'avais inversé le while et le do while. Dans l'autre sens, ça marche...

Youpi !

Merci pour l'indice !

@ +

<edit/>Bon, ben en fait j'ai crié victoire trop vite !! ça ne marche que pour un seul enregistrement, j'en ai mis 2 pour la même période et sur le même mois, un le 20 et un le 22, seul le 20 s'affiche, et pour les autres périodes c'est pire, rien ne s'affiche. Voici mon code actuel :
<?php
session_start();
require ("_cnn/_cnn.php");

// requete dans la base
	$id_med = $_SESSION['id_med'];
	$req_evnm = "SELECT * FROM evenement WHERE medecin='$id_med'";
	$rs_evnm = mysql_query($req_evnm) or die(mysql_error());
	$row_req_evnm = mysql_fetch_assoc($rs_evnm);
	$totalRows_req_evnm = mysql_num_rows($rs_evnm);
	
// calendrier

$date=date('D/d/m/Y');
list($dcourt,$day, $month, $year) = explode("/", $date);
if (isset($_POST['valider'])){
	if (isset($_POST['mois'])) {
		$date=date('D/d/m/Y');
		list($dcourt,$day, $month, $year) = explode("/", $date);
		$month = $_POST['mois'];
		if (isset($_POST['annee'])) {
			if ($_POST['annee'] <> $year) {
				$year_choisi = $_POST['annee'];
				$annee = $year_choisi;
			}
			else {
				$year = $_POST['annee'];
				$annee = $year;
			}
		}
	}
	else {
		$date=date('D/d/m/Y');
		list($dcourt,$day, $month, $year) = explode("/", $date);
	}


	// début tableau
	echo "<table width=\"95%\" border=\"1\">";
	echo "<tr>";
	echo "<td>&nbsp;</td>";
	
	// début calendrier
	
	$joursem = array('dim', 'lun', 'mar', 'mer', 'jeu', 'ven', 'sam');
	$mois=array('','Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre');
	
	
	
	// nombre de jours du mois
	$nombreDeJours =  date("t",mktime(0,0,0,$month +1,0,$annee)); 
	
	// initialisation du compteur              
	$i=1;
	
	//$month_t=intval(date("n"));
	$month_t=$mois[$month];

	// affichage du mois par son nom
	echo "<p>Planning du mois de ".$month_t." ".$annee." du Dr ".$_SESSION['nom']."</p>";
	
	// début d'entrée des dates.
	
	while ($i<=$nombreDeJours){
	
		// calcul du timestamp
		$timestamp = mktime (0, 0, 0, $month, $i, $annee);
		
		$l=$year."-".$month."-".$i;
		
		list($a, $m, $d) = sscanf($l, "%d-%d-%d"); //%d pour récupérer des entiers
		
		// jour en français
		$vrai_jour = $joursem[date("w",$timestamp)];
		
		// Gestion du style
		if (($vrai_jour == "sam") || ($vrai_jour == "dim")) {
			$style = "red";
			}
		else {
			$style = "normal";
		}
		
		// affichage
		echo "<td align=\"center\"><span class=\"".$style."\">".$vrai_jour." ".$i."</span></td>";
		$i=$i+1;
	}
	
	//fermeture de la ligne
	echo "</tr>";
	##############################################################
	
	// Pour la periode 1
	
	$i = 1;
	echo "<tr>";
	echo "<td align=\"center\">8h30 - 13h30</td>";
	
	do {
		while ($i<=$nombreDeJours) {
			if (($row_req_evnm['periode'] === "8h30 - 13h30") && ($row_req_evnm['date'] === $annee."-".$month."-".$i)){
				
				// affichage
				echo "<td align=\"center\">".$row_req_evnm['type']."</td>";
				$i=$i+1;
			}
			else {
				echo "<td align=\"center\"> - </td>";
				$i=$i+1;
			}
		}
	} while($row_req_evnm = mysql_fetch_assoc($rs_evnm));
	echo "</tr>";
	
	#############################################################
	// Pour la periode 2
	
	$i = 1;
	echo "<tr>";
	echo "<td align=\"center\">13h30 - 18h30</td>";
	do {
		while ($i<=$nombreDeJours) {
			if (($row_req_evnm['periode'] === "13h30 - 18h30") && ($row_req_evnm['date'] === $annee."-".$month."-".$i)){
				
				// affichage
				echo "<td align=\"center\">".$row_req_evnm['type']."</td>";
				$i=$i+1;
			}
			else {
				echo "<td align=\"center\"> - </td>";
				$i=$i+1;
			}
		}
	} while($row_req_evnm = mysql_fetch_assoc($rs_evnm));
	echo "</tr>";
	
	#############################################################
	// Pour la periode 3
	
	$i = 1;
	echo "<tr>";
	echo "<td align=\"center\">18h30 - 8h30</td>";
	
	do {
		while ($i<=$nombreDeJours) {
			if (($row_req_evnm['periode'] === "18h30 - 8h30") && ($row_req_evnm['date'] === $annee."-".$month."-".$i)){
				
				// affichage
				echo "<td align=\"center\">".$row_req_evnm['type']."</td>";
				$i=$i+1;
			}
			else {
				echo "<td align=\"center\"> - </td>";
				$i=$i+1;
			}
		}
	} while($row_req_evnm = mysql_fetch_assoc($rs_evnm));
	
	// fin de la ligne et du tableau
	echo "</tr>";
	echo "</table>";
// fermeture du if
}
?>
du coup je sais pas trop pourquoi je n'ai qu'un seul enregistrement d'affiché, et pourquoi sur les autres périodes ça n'affiche rien du tout...

Merci pour un nouveau coup de pouce !
</edit>
Et hop !