Page 1 sur 1

Extraire les infos d'une requette...

Posté : 01 juin 2005, 09:27
par manuscle
Bonjour à tous!

J'aimerais avoir votre avis car j'ai du mal à trouver une idée afin d'afficher le résultat d'une requette et d'extraire les bonnes infos au bon moment, j'explique:

J'ai fait un rapport d'activité journalier que chaque utilisateur de la boite doit remplir, j'ai donc une base de donnée qui fait un enregistrement par jour et par utilisateur, voici la structure de la table:

act_id, act_date,util_id,contenu

Mon cher patron voudrais sélectionner des utilisateurs par des cases à cocher (membre[]) et afficher leur activité entre la semaine $weekDebut et $weekFin.
$membre est la recup des utilisateurs et nb_membre est le nombre total d'utilisateurs sélectionné.

Voici ma requette:
$sql = "SELECT WEEK(a.act_date) AS semaine, DATE_FORMAT(a.act_date,'%d %m %Y') AS datefr, a.contenu, ";
$sql .= "b.util_prenom, b.util_nom ";
$sql .= "FROM activite a ";
$sql .= "LEFT JOIN utilisateur b ON a.util_id = b.util_id ";
$sql .= "WHERE WEEK(a.act_date) BETWEEN '$weekDebut' AND '$weekFin' AND (";
		
for($i = 0; $i < $nb_membre; $i++)
  {
      $sql .= $i < ($nb_membre-1) ? "b.util_id = '$membre[$i]' OR " : "b.util_id = '$membre[$i]' ";
  } 
				
$sql .= ") ORDER BY semaine ASC ";
J'aimerais afficher le résultat comme suit:

Semaine x:
Utilisateur x:
Lundi {date}: contenu
Mardi {date}: contenu
.....
Utilisateur x:
Lundi {date}: contenu
Mardi {date}: contenu
.......
Semaine x:
Utilisateur x:
Lundi {date}: contenu
Mardi {date}: contenu
.....
Utilisateur x:
Lundi {date}: contenu
Mardi {date}: contenu
.......

ect .....

La mise en page html est faite vu que j'utilise un template, mais mon problème c'est que je ne sais pas comment m'y prendre afin d'afficher les bonnes infos au bon moment.

Pouvez-vous m'aider à structurer tout ça? N'hesitez pas si vous avez besoin de plus de detail. :wink:

Posté : 01 juin 2005, 10:18
par Cyrano
Salut,
une première piste: tu aurais grand avantage à pousser un peu plus loin la clause ORDER BY en ajoutant, outre la semaine, l'utilisateur et le jour,
ce qui donnerait:
$sql .= ") ORDER BY semaine ASC,  b.util_nom, datefr";
Partant de là, tu auras un tri chronologique au niveau des semaines, pour chaque semaine un ordre alphabétique par nom et pour chaque nom un tri chronologique par jour par jour.

Une auter idée: récupères le résultat dans un tableau multi-dimensionnel du genre:
$semaine = array("numero_semaine", "utilisateur");
$semaine['utilisateur'] = array("jour", "activite");
Et de là tu gères ton affichage.

Posté : 06 juin 2005, 13:20
par manuscle
Je suis désolé mais j'ai un gros problème pour fabriquer le tableau multidimensionnel!

J'ai passé la matinée à imbriquer tout ça mais à chaque fois j'ai des erreurs!

Pourrais-tu me donner un exemple plus concret car je pense que j'ai des lacunes sur la compréhension......je me mélange les pedales! :oops:

Posté : 07 juin 2005, 10:51
par manuscle
Y a vraiment personne qui peut m'aider sur ce problème ?! :cry:

Posté : 07 juin 2005, 11:07
par manuscle
Bon, j'ai trouvé une solution qui m'affiche bien les résultats escompté mais peut etre qu'il y a plus facile, voici le code
$sql = "SELECT WEEK(a.act_date) AS semaine, DATE_FORMAT(a.act_date,'%d %m %Y') AS datefr, a.contenu, ";
$sql .= "b.util_id ";
$sql .= "FROM activite a ";
$sql .= "LEFT JOIN utilisateur b ON a.util_id = b.util_id ";
$sql .= "WHERE WEEK(a.act_date) BETWEEN '$weekDebut' AND '$weekFin' AND (";

for($i = 0; $i < $nb_membre; $i++)
	{
		$sql .= $i < ($nb_membre-1) ? "b.util_id = '$membre[$i]' OR " : "b.util_id = '$membre[$i]' ";
	} 
		
$sql .= ") ORDER BY semaine ASC, b.util_prenom, datefr ";
$req = mysql_query($sql) or die ('Erreur selection activité : '.mysql_error());
$total = mysql_num_rows($req);

while ($row=mysql_fetch_assoc($req))
{
	extract($row);
	$data[$semaine][] = $util_id;
	$data[$semaine][$util_id][] = array($datefr, $contenu);
}

for($i=$weekDebut; $i<=$weekFin; $i++)
{
	echo "<dl>Semaine $i:";
	foreach ($membre as $m) 
	{
                // $nom_membre est le nom de chaque membre sélectionné dont la clé est l'id du membre
		echo "<dt>{$nom_membre[$m]}</dt>";
		for ($a=0; $a<=4; $a++)
                // $a = 4 max car je n'affiche que 5 jours par semaine
		{
			echo "<dd>{$data[$i][$m][$a][0]}</dd>";
			echo "<dd>{$data[$i][$m][$a][1]}</dd>";
		}
	}
	echo "</dl>";
}		
Donc voilà!
Si quelqu'un se sent le courage de me dire si c'est bon..... :wink: