Difficulté dans l'affichage d'un tableau

Petit nouveau ! | 8 Messages

09 oct. 2016, 15:33

Bonjour,

Je bute depuis plusieurs jours sur un problème de présentation sous forme d'un tableau. En gros, je récupère des données d’un formulaire que les gens complètent pour identifier des risques dans un lieu. Pour chaque danger identifié, il faut saisir une précision puis une proposition pour éviter le danger.

Je dois ensuite présenter ces données sous forme d’un tableau de synthèse. Voici comment s’organisent ces données dans ma table :

danger1 - danger2 - danger3 - danger1_Precision - danger1_Proposition - danger2_Precision - danger2_Proposition - danger3_Precision - danger3_Proposition

Ci-dessous mon code.

fiche_test.php :
<?php
require_once ('connexion.php');
?>
 
 
<?php
//Déclaration de toutes les variables
$table = "risques" ;
 
$danger1_libelle = "Danger n°1" ;
$danger2_libelle = "Danger n°2" ;
$danger3_libelle = "Danger n°3" ;
$aucun = "Aucun danger" ;
$lieu = "lieu1" ;
 
// Définition de la largeur des 3 colonnes des tableaux
$largeur_colonne1 = "170px";
$largeur_colonne2 = "415px";
$largeur_colonne3 = "415px";
?>
 
 
 
<!-- ------------------------------------- -->
 
 
 
<?php
 
// On compte chaque enregistrements de "1" dans chaque colonne pour savoir si on affiche le tableau ou pas...
 
$requete = "SELECT COUNT(danger1) AS nb_danger1 FROM $table WHERE lieu ='$lieu' AND danger1 = '1'  ";
$resultat = mysql_query($requete)  or die('Erreur SQL !<br />'.$requete.'<br />'.mysql_error());
$columns = mysql_fetch_array($resultat);
$danger1 = $columns['danger1'];
 
$requete = "SELECT COUNT(danger2) AS nb_danger2 FROM $table WHERE lieu ='$lieu' AND danger2 = '1'  ";
$resultat = mysql_query($requete)  or die('Erreur SQL !<br />'.$requete.'<br />'.mysql_error());
$columns = mysql_fetch_array($resultat);
$danger2 = $columns['danger2'];
 
$requete = "SELECT COUNT(danger3) AS danger3 FROM $table WHERE lieu ='$lieu' AND danger3 = '1'  ";
$resultat = mysql_query($requete)  or die('Erreur SQL !<br />'.$requete.'<br />'.mysql_error());
$columns = mysql_fetch_array($resultat);
$danger3 = $columns['danger3'];
 
if (($danger1>0) or($danger2>0) or ($danger3>0))
{
include ("tableau_risque.php");
}
else
{
echo "";
}

mysql_close();
?>
et mon fichier d'affichage du tableau (tableau_risque.php)
<?php
 
// Tableau risque
 
$requete = ("SELECT * FROM $table WHERE lieu ='$lieu' AND aucun !='1'");
$resultat = mysql_query($requete)  or die('Erreur SQL !<br />'.$requete.'<br />'.mysql_error());
 
echo "<table cellpadding='5' border='1' width'auto'>";
 
// Les colonnes de titres
echo "
<tr align='center'>
<td width=$largeur_colonne1>Dangers identifiés</td>
<td width=$largeur_colonne2>Précisions</td>
<td width=$largeur_colonne3>Propositions</td>
</tr>\n";
 
while ($row = mysql_fetch_array($resultat))
{
$danger1=($row[danger1]);
if ($danger1=="0") {$danger1="";} else {$danger1=$danger1_libelle."<br>";}
 
$danger2=($row[danger2]);
if ($danger2=="0") {$danger2="";} else {$danger2=$danger2_libelle."<br>";}
 
$danger3=($row[danger3]);
if ($danger3=="0") {$danger3="";} else {$danger3=$danger3_libelle."<br>";}
 
 
 
$danger1_Precision=($row[danger1_Precision]);
if ($danger1_Precision!="") {$danger1_Precision=$danger1_Precision."<br>";}
$danger1_Proposition=($row[danger1_Proposition]);
if ($danger1_Proposition!="") {$danger1_Proposition=$danger1_Proposition."<br>";}
 
$danger2_Precision=($row[danger2_Precision]);
if ($danger2_Precision!="") {$danger2_Precision=$danger2_Precision."<br>";}
$danger2_Proposition=($row[danger2_Proposition]);
if ($danger2_Proposition!="") {$danger2_Proposition=$danger2_Proposition."<br>";}
 
$danger3_Precision=($row[danger3_Precision]);
if ($danger3_Precision!="") {$danger3_Precision=$danger3_Precision."<br>";}
$danger3_Proposition=($row[danger3_Proposition]);
if ($danger3_Proposition!="") {$danger3_Proposition=$danger3_Proposition."<br>";}
 
echo "
<tr>
<td>
$danger1
$danger2
$danger3
</td>
 
<td style='color:red;'>
$danger1_Precision
$danger2_Precision
$danger3_Precision
</td>
 
<td>
$danger1_Proposition
$danger2_Proposition
$danger3_Proposition
</td>
";
echo "</tr>";
}
echo "</table><br><br>";
?>
Le problème c'est que l'affichage ne me convient pas. je souhaiterais regrouper chaque risque dans une seule ligne du tableau mais je n'y arrive pas.

Je vous remercie par avance pour votre aide.

Mammouth du PHP | 881 Messages

09 oct. 2016, 22:47

Bonjour didhuche,

vous introduisez quelque chose de nouveau à la fin « .. je souhaiterais regrouper chaque risque ... » (risque) tandis que vous parlez de « danger » ailleurs. Est-ce une question de stylistique française (ne pas répéter la même expression) ou est-ce que « risque » regroupe plusieurs « dangers » ?

Quoi qu'il en soit, ton code compte plusieurs répétitions; ceci - à grande échelle - ralentira considérablement le processus.

Voici ce que je crois être le résultat final attendu :
<table><tr><td>Lieux</td><td>Dangers</td><td>Solutions</td></tr>
<tr><td>Armoire</td><td>Danger 1  armoire</td><td>Solution 1 armoire</td></tr>
<tr><td>&nbsp;</td><td>Danger 2  armoire</td><td>Solution 2 armoire</td></tr>
<tr><td>&nbsp;</td><td>Danger 3  armoire</td><td>Solution 3 armoire</td></tr>
<tr><td>Garagee</td><td>Danger 1  garage</td><td>Solution 1 garage</td></tr>
<tr><td>&nbsp;</td><td>Danger 2  garage</td><td>Solution 2 garage</td></tr>
<tr><td>&nbsp;</td><td>Danger 3  garage</td><td>Solution 3 garage</td></tr>
</table>
.......
Si c'est bien cela, je tâcherais, ayant déjà affiché l'en-tête du tableau ....
1) de n'avoir qu'une seule requête MySql
2) de compter le nombre de résultats avant de traiter
$resultat = mysqli_query ($db, $requete);
       $Nombre = mysqli_num_rows($resultat);
3) d'afficher le tableau plein
if ($Nombre > 0) {   //S'il y a des résultats
   while ($contenu = mysqli_fetch_assoc ($resultat)) {
   echo '<tr><td>'.$contenu['lieu'].'</td><td>'.$contenu['danger1'].'</td><td>'.$contenu['danger1_Precision'].'</td><td>'.$contenu['danger1_proposition'].'</td></tr>';
   echo '<tr><td>&nbsp;</td><td>'.$contenu['danger2'].'</td><td>'.$contenu['danger2_Precision'].'</td><td>'.$contenu['danger2_proposition'].'</td></tr>';
   echo '<tr><td>&nbsp;</td><td>'.$contenu['danger3'].'</td><td>'.$contenu['danger3_Precision'].'</td><td>'.$contenu['danger3_proposition'].'</td></tr>';
   }
} else {    //Si la requête n'a retourné aucun résultat
   echo '<tr><td colspan="4">Aucun résultat</td></tr>'; 
}
Soyez artisans de paix

Petit nouveau ! | 8 Messages

09 oct. 2016, 23:07

Tout d'abord, merci d'avoir pris le temps de comprendre mon souci :wink:
En effet, c'est tout à fait bien vu : un risque regroupe plusieurs dangers, et pour chaque danger enregistré dans la base, on a une précision de ce danger et une proposition pour éviter ce danger. L'idée est donc d'afficher un tableau de synthèse regroupant toutes les précisions et propositions pour le danger 1, puis pour le danger 2, puis le 3, etc.

En fait, actuellement mon code m'affiche cela :
Image

Et je souhaiterais avoir cet affichage :
Image

Merci encore.
Didhuche

Mammouth du PHP | 881 Messages

10 oct. 2016, 02:04

Bonjour Didhuche,
au départ, je questionnerais ta structure de base de données. Pourquoi grouper toutes les informations dans une seule ligne ?
Ce serait plus souple, plus facile à traiter si tes données étaient explosées en plusieurs tables inter-reliées.
C'est peut-être une autre question à laquelle tu n'as pas le goût de répondre. Je crains, cependant, que tu y sois contraint dès le moment où tu voudras plus de dangers, plus de précisions, plus de propositions que tes 1, 2, 3 actuels.
Passons.

Dans l'état actuel des choses, tu pourrais transférer tes données de table MySQL vers un tableau PHP bien structuré, un peu comme ceci:
Avec ta table php, tu pourras alors rappeler les éléments que tu veux, les classer par ordre alphabétique si tu le veux.

Mais j'y reviens, je réviserais ta structure en éclatant tes données sur plusieurs tables:
  1. une table risques
  2. une table dangers
  3. une table précisions
  4. une table propositions
Soyez artisans de paix

Mammouth du PHP | 881 Messages

10 oct. 2016, 02:06

Le vrai problème, c'est que tes données sont en colonnes alors que l'écriture HTML se fait en lignes.
Soyez artisans de paix

Petit nouveau ! | 8 Messages

10 oct. 2016, 09:11

La structure des données est effectivement complètement merdique...
Le souci, c'est que les utilisateurs complètent le formulaire sur un Limesurvey. Moi, de mon côté, je récupère les données sous forme d'un fichier csv que je réinjecte dans une table MySQL pour en faire une synthèse.
Pour te donner un exemple, voilà la structure du fichier csv : http://didhuche.free.fr/donnees_test.csv.
Et pour info, je n'ai pas qu'un seul risque, j'en ai 18 ! Et pour chaque risque j'ai quatre ou cinq dangers avec à chaque fois une précision et une proposition. Ce qui fait que le tableau csv fait… 239 colonnes ! Et donc ma table en contient autant ! C'est un festival... :?
J'avais même pensé créer une petite moulinette pour pouvoir effectivement restructurer les données dans des tables mieux organisées. Mais j'ai peur que ce soit encore plus chronophage, et je crains ne pas savoir le faire...

Mammouth du PHP | 881 Messages

10 oct. 2016, 13:07

Et bien, à plus fortes raisons (tu disposes de données libres, tu as tes tas de risques et de dangers) ... vas-y avec une nouvelle structure.

Table 1: risque
Champs : id_risque, lieu

Table 2: dangers
Champs: id_danger, id_risque,niveau, Description, Precision

Table 3: propositions
Champs: id_proposition,id_danger,niveau,Details

J'ai pensé ajouter « niveau » aux dangers, de manière à ne pas perdre ce que était - me semblait - dans un ordre d'importance en termes de danger1, danger2, danger3

Ensuite, ce sera un jeu d'enfant de récupérer tes données comme tu le souhaites et ça te fera une base de données facile à faire croître.
Soyez artisans de paix

Petit nouveau ! | 8 Messages

10 oct. 2016, 21:48

Merci pour ta proposition de structure qui, effectivement est parfaite. Le champ "Niveau" n'est finalement pas utile car il n'y a aucune hiérarchie dans les dangers ;)
Ce serait donc :

Table 1: risque
Champs : id_risque, lieu

Table 2: dangers
Champs: id_danger, id_risque, Description

Table 3: Precision
Champs: id_precision,id_danger,Details

Table 3: propositions
Champs: id_proposition,id_danger,Details

Mais mon gros souci, c'est : comment je passe de ma table de 239 colonnes à cette nouvelle structure ??? :?

Mammouth du PHP | 881 Messages

10 oct. 2016, 23:24

Il faut que tu repères un « système » dans tes 239 colonnes et que ce système soit toujours vrai.
Alors il sera facile d'«enseigner» le système à ton serveur afin qu'il passe au travers de toutes tes lignes à 239 colonnes.

J'anticipe que tes colonnes soient:
id_risque, Risque, danger_1, details_1, solution_1, danger_2, details_2, solution_2, danger_3,details_3, ..., danger_238, details_238, solution_238

Si tel est le cas, tu peux faire une boucle while pour charger une ligne à la fois, puis faire lire par trio avec une variable implémentée. Au gré de la boucle, tu enregistres les informations dans tes nouvelles tables.
Soyez artisans de paix

Petit nouveau ! | 8 Messages

11 oct. 2016, 00:09

Malheureusement non, la table n'est pas organisée de cette façon...
Voici un exemple de fichier csv que je récupère : http://didhuche.free.fr/donnees_test.csv. Il ny pa pas d'id du risque et le libellé du risque est une variable définie "en dur" uniquement pour l'affichage. Les colonnes sont constituées des différents dangers avec pour chacun d'eux une précision et une proposition.
Pour info, le formulaire que les gens complètent est ici : https://edu-sondage.ac-versailles.fr/in ... 44?lang=fr
Bien entendu c'est un exemple. Là, nous n'avons qu'un seul risque. Dans le vrai formulaire, il y en a 18 avec, à chaque fois, les différents dangers à cocher (ou pas d'ailleurs puisqu'à chaque fois on a une case "Aucun danger")...

Mammouth du PHP | 881 Messages

11 oct. 2016, 02:47

Et bien voilà .. tu nous décris ici le « système ». Il ne te reste maintenant qu'à conceptualiser ce système en termes de boucles, de repérage, d'identification des éléments; puis nous lirons cela.
Repères les constantes, les éléments qui varient et les structures.
Soyez artisans de paix

Mammouth du PHP | 881 Messages

11 oct. 2016, 02:50

Remarque, que j'ai fait dévier ton sujet.
Si tu veux te limiter à lire tes données, c'est libre à toi.
Il suffit de nous le dire et nous reviendrons à la demande initiale.
Tout ce que je t'ai proposé jusqu'à maintenant, c'est dans une optique de croissance ultérieure et de facilité de traitement. Si l'outil est rendu plus compliqué que le résultat final, revenons à la question de base.
Soyez artisans de paix

Petit nouveau ! | 8 Messages

11 oct. 2016, 09:45

Non, pas du tout, le sujet ne dévie pas, ou alors c'est pour améliorer, donc c'est une bonne "déviance".
Si je comprends bien, il faudrait faire un script qui me permette de créer des tables plus organisées à partir de ma looooooongue table. Et c'est justement cela que je ne sais pas faire...

Mammouth du PHP | 881 Messages

11 oct. 2016, 13:27

Tu lis ta table, ligne par ligne
À chaque ligne, tu tires l'information pertinente et de l'enregistres de manière ordonnée dans tes nouvelles tables.
while ($UneLigne = mysqli_fetch($resultat)) {
   mysqli_query("INSERT INTO risques (champ1, champ2, champ3) VALUES ('Je ne sais', '".$UneLigne[0]."', 'blabla') ", $db);
   $NumRisque = mysqli_insert_id($db);
   for ($x=1; $x<238; $x++) {
          mysli_query("INSERT INTO dangers (id_risque, LeDanger, Description) VALUES (".$NumRisque.", '".$UneLigne["Danger_".$x]."', '".$UneLigne["Description_".$x]."')
          mysli_query("INSERT INTO solutions (id_risque, LeDanger, Description) VALUES (".$NumRisque.", '".$UneLigne["Solution_".$x]."', '".$UneLigne["JeNeSais_".$x]."')
   }
}
Une boucle d'enregistrement pour chaque ligne devrait faire le travail pour toi.

Attention, je n'ai vérifié ni la syntaxe, ni l'orthographe des commandes, je ne fais ici que jeter des idées.
Soyez artisans de paix

Petit nouveau ! | 8 Messages

11 oct. 2016, 13:52

Je teste ça dès ce soir.
Je te tiens au courant de toute façon.
Merci ! :)