Page 1 sur 1

Probleme de boucle dans un tableau

Posté : 25 juin 2013, 11:03
par babelau
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>");

Re: Probleme de boucle dans un tableau

Posté : 25 juin 2013, 11:21
par Lyssorus
Bonjour,

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

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

Re: Probleme de boucle dans un tableau

Posté : 25 juin 2013, 11:26
par babelau
Merci d'avoir pris le temps de répondre !
J'ai essayé mais non, aucun changement..

Re: Probleme de boucle dans un tableau

Posté : 25 juin 2013, 11:54
par Lyssorus
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 ?

Re: Probleme de boucle dans un tableau

Posté : 25 juin 2013, 13:27
par babelau
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

Re: Probleme de boucle dans un tableau

Posté : 25 juin 2013, 13:46
par Mazarini
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>';
}

Re: Probleme de boucle dans un tableau

Posté : 26 juin 2013, 07:38
par babelau
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>";
?>