[RESOLU] Probleme de boucle dans un tableau

Petit nouveau ! | 4 Messages

25 juin 2013, 11:03

Bonjour,

Voila je suis actuellement en stage en entreprise ou je doit créer un espece de planning de gestion de déplacement j'ai donc choisi le php comme langage pour faire la liaison avec ma base de données et l'ajax pour afficher ces données/envoyer de nouvelles données.

Mon probleme n'est pas du tout avec l'ajax mais je pense plus au niveau de ma boucle while, dans ce script php j'affiche un tableau où la premiere colonne sera les noms des techniciens et ma premiere ligne les jours du mois. Si un déplacement est enregistré dans la base de donnée comme de type DEPLACEMENT le 12juin pour PIERRE, alors un element div est inséré en face du bon technicien et de la bonne date, j'ai un script CSS qui en fonction du type de déplacement se colore de la couleur correspondante.

Avec ce script, le tableau se repete autant de fois que j'ai de déplacement dans ma base de données, or evidemment moi je ne le voudrais qu'une seule fois avec tout mes deplacements dedans.

J'espere que quelqu'un trouvera la réponse...
$sql = "Select * from deplacement";
$resultat = $dbh->query($sql);
$row=$resultat->fetch();
     
$mois = date('n');
$jourJ = date('d');
$libMois = ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aout', 'Septembre', 'Octobre', 'Novembre', 'Decembre'];
$moisEnCours = $libMois[date('n')-1];
$jourParMois = [31,28,31,30,31,30,31,31,30,31,30,31];
$listeEmployer = ['JEAN', 'PAUL', 'PIERRE', 'PATRICK', 'MARC'];
$nbEmpl = count($listeEmployer);
$anneeEnCours = date ('y');
$nbJourDuMois = $jourParMois[date('n')-1];
$semEnCours = date('W');
     
echo ("<table id='tableau'>
 <thead id='thead'>
 <caption>Nous sommes le $jourJ $moisEnCours</caption>
 <tr><th>Technicien</th>
 ");
 for ($i=1; $i<=$nbJourDuMois; $i++) {
  $semDate = date('W',mktime(0,0,0, $mois, $i, $anneeEnCours));
  echo ("<th>$semDate</th>");
 }
 echo ('</tr>
 <tr><th></th>');
 for ($i=1; $i<=$nbJourDuMois; $i++) {
  echo ("<th id='jour' class='jour'>$i</th>");
 }
 echo('</tr>
 </thead>
 <tbody id="tbody">
 ');
 $ligne=1;
 while($row){
  foreach ($listeEmployer as $element) {
   echo ("<tr id='$element' class='ligne'><td>$element</td>");
   for ($jourP=1; $jourP<=$nbJourDuMois; $jourP++) {
    $tech = $row['technicien'];
    $jourD = $row['jour'];
    if ($element == $tech) {
     if ($jourD == $jourP) {               
      $tech = $row['technicien'];
      $jourD = $row['jour'];
      $mois = $row['mois'];
      $annee = $row['annee'];
      $nbJ = $row['nbJour'];
      $type = $row['type'];                                
      echo("<td id='$jourP' class='jour'><div id ='$type' class='drag' style='width:$taille;'></div></td>");
     }else{
      echo("<td id='$jourP' class='jour'></td>");
     }
    }else{
     echo("<td id='$jourP' class='jour'></td>");    
    }
   }
  }
  echo("</tr>");
  $ligne = $ligne+1;
  $jourP = 1;
  $row=$resultat->fetch();
 }
 echo("</tbody>
</table>");

Eléphant du PHP | 160 Messages

25 juin 2013, 11:21

Bonjour,

Et si tu met ton
$row=$resultat->fetch();
directement dans ton while ?

Comme ça
while($row=$resultat->fetch()){

Petit nouveau ! | 4 Messages

25 juin 2013, 11:26

Merci d'avoir pris le temps de répondre !
J'ai essayé mais non, aucun changement..

Eléphant du PHP | 160 Messages

25 juin 2013, 11:54

Humm dure :/

Ahh mais attend, pour l'instant, ça fonctionne mais ça te fait la boucle autant de fois qu'il y a eu de déplacements ? Mais toi tu voudrais que ça face tout d'un coup ?

C'est ça ?

Petit nouveau ! | 4 Messages

25 juin 2013, 13:27

Oui voila, actuellement je n'ai que 2deplacement enregistrés pour faire mes test et il m'ecrit 2fois le tableau alors que je voudrais simplement 1tableau reunissant les deplacements

ViPHP
ViPHP | 2577 Messages

25 juin 2013, 13:46

Bonjour,

Tu pourrais faire une lecture des données et les stocker dans un tableau
$donnees[$tecthnicien][$jour] = $row
avec $technicien le nom du technicien, $jour le jour^^ et row le résultat d'un fetch.

Ensuite tu fais 2 boucles pour afficher :
foreach ($données) as $nom => $ligne) {    // boucle sur les techniciens
   echo '<tr>';
      echo '<td>';
      echo $nom;
      echo '</td>';
   for ($i=1;$i <= 31;$i++) {     // boucle sur les jours pour un technicien
      echo '<td>';
      if (isset($ligne[$i])) {
//       affichage d'une cellule avec déplacement    
      } else {
//       affichage d'une cellule sans renseignement    
      }
      echo '</td>';
   } 
   echo '</tr>';
}

Petit nouveau ! | 4 Messages

26 juin 2013, 07:38

Tout d'abord merci pour vos réponses et pour le fait d'avoir pris le temps de m'aider, ce qui n'est pas arrivé sur les autres forums ou je suis passée :evil:. J'ai trouver la solution en prenant en compte vos conseils et ceux de mon professeur et j'ai enfin un script qui fonctionne :priere: ! Je le poste au cas ou cela pourra servir a quelqu'un
<?php
	session_start();
	include_once('connexion.inc.php');
	$moisEnCours = date('m');
	$anneeEnCours = date('Y');
	$nbJourMois = date('t');
	$sql = "Select * from deplacement WHERE mois = $moisEnCours AND annee = $anneeEnCours "; // Faire une sélection sur le mois en cours
	$sql = $sql . "ORDER BY technicien, jour;";  // Tri par technicien (important)
	$resultat = $dbh->query($sql);
	$row=$resultat->fetch();
	// Constitution du tableau pret a etre affiché
	$tabResultat = array();
	$i = -1;
	$tech = '';
	while ($row) {
		if ($tech != $row['technicien']) {  // Changement de technicien
			$i++;
			$tech = $row['technicien'];
			$tabResultat[$i] = array($nbJourMois +1);
			// Initialisation de la ligne
			for ($j = 0; $j <= $nbJourMois; $j++) {
				$tabResultat[$i][$j] = '';
			}
		}
		$tabResultat[$i][0] = $tech;
		$j = $row['jour'];
		$tabResultat[$i][$j] = $row['type'];
		$row=$resultat->fetch(); // lecture suivante
	}
	// Parcours du tableau et affichage
	echo "<table>";
	echo "<caption>Tableau établi le " . date('d/m/Y') . '</caption>';
	echo "<thead>";
	// Affichage des nos de semaine
	echo "<tr><th></th>";
	for ($i=1; $i<=$nbJourMois; $i++) {
		$dj = $moisEnCours . "/" . $i . "/" . $anneeEnCours;
		$noSem = date('W', strtotime($dj));
		echo "<th>" . $noSem . "</th>";
	}
	echo "</tr>";
	// Affichage des jours du mois
	echo "<tr><th></th>";
	for ($i=1; $i<=$nbJourMois; $i++) {
		echo ("<th class='jour'>$i</th>");
	}
	echo "</tr></thead><tbody>";
	$nbLigne = sizeof($tabResultat);
	for ($i = 0; $i < $nbLigne ; $i++) {
		echo "<tr>";
		for ($j = 0; $j <= $nbJourMois; $j++) {
			if ($j == 0) {
				echo "<td>" . $tabResultat[$i][$j] . "</td>";
			}
			else {
				echo("<td id='$j' class='jour'>");
				if ($tabResultat[$i][$j] <> '') {
					$taille = 25 + (28 * ($j - 1));
					$id = $tabResultat[$i][$j];
					echo ("<div id ='$id' class='drag' style='width:$taille;'></div>");
				}	
				echo "</td>";
			}
		}
		echo "</tr>";
	}
	echo "</tbody></table>";
?>