Afficher tableau inversé pour HTML

Signaler
Messages postés
200
Date d'inscription
dimanche 15 février 2009
Statut
Membre
Dernière intervention
22 mai 2014
-
Messages postés
200
Date d'inscription
dimanche 15 février 2009
Statut
Membre
Dernière intervention
22 mai 2014
-
Bonjour à tous,
J'ai une table MySQL comme suit :
*---------------*
| TRI	| EC	|
*---------------*
| COS	| ASDER	|
| COS	| DERTI	|
| TAM	| FOLTI	|	
| TAM	| PIROU	|
*---------------*

J'utilise l'interface PDO pour la connexion à ma base.
J'arrive à récupérer dans un objet les enregistrements :
array (size=4)
  0 => 
    object(stdClass)[3]
      public 'TRI' => string 'COS' (length=3)
      public 'EC' => string 'ASDER' (length=5)
  1 => 
    object(stdClass)[4]
      public 'TRI' => string 'COS' (length=3)
      public 'EC' => string 'DERTI' (length=5)
  2 => 
    object(stdClass)[5]
      public 'TRI' => string 'TAM' (length=3)
      public 'EC' => string 'FOLTI' (length=5)
  3 => 
    object(stdClass)[6]
      public 'TRI' => string 'TAM' (length=3)
      public 'EC' => string 'PIROU' (length=5)

Et je souhaiterais l'afficher avec mon objet PHP dans un tableau HTML comme suite :
<table>
   <tr>
      <th>COS</th>
      <th>TAM</th>
   </tr><tr>
      <td>ABCD</td>
      <td>GHYU<td/>
   </tr><tr>
      <td>DFRT</td>
      <td>DFRS<td/>
   </tr>
</table>

J'ai cherché des méthodes (SQL notamment) comme Pivot ou autre mis c'est du SQL Server.

Pouvez-vous m'aider ?
Merci d'avance.

7 réponses

Messages postés
34701
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 janvier 2022
358
Bonjour,
A mon avis il faudra passer par un "group_concat" dans ta requête MySQL, puis un explode pour convertir ces informations en tableau

Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
16
salut !

si l'idée est d'obtenir un flux XML, il te suffit de construire chacunes de te lignes en t'appuyant sur la fonction CONCAT depuis la requête :
SELECT CONCAT('<tr><th>',TRI,'</th><th>',EC,'</th></tr>')
...


ou via une fonction :
function ta_fonction(var tri , var ec) 
{
    return '<tr><th>' . TRI . '</th><th>' . EC . '</th></tr>';
}

(n'oublie pas de délimiter par '<table>' ... '</table>)

ce sont des exemple, comme dit précédemment, sans connaitre le code et la structure de ta table c'est délicat de t'aider.

naga

PS : pour plus de mise en forme, tu peux rajouter les caractères : '\n' pour le saut de ligne et '\t' pour la tabulation (il me semble qu'en php et mysql ils sont bien acceptés ... tu t'en rendra vite compte ^^)
Messages postés
34701
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 janvier 2022
358
Bonjour,
Je ne suis pas sûr que ta solution corresponde à sa demande...(à lui de nous le dire..mais bon..)
D'après ce que j'ai compris (vu la forme de sa Table qu'il nous a donné en exemple), il semble qu'il veuille:
afficher un tableau de deux colonnes qui aura en en-tête:
COS | TAM
Puis sur chaque ligne en dessous la valeur 'EC' correspondant

Pour la colonne COS
ASDER
DERTI
...

Pour la colonne PAM
FOLTI
PIROU
...

Donc je ne vois pas comment un simple CONCAT pourrait faire ceci.. :-(

Pour moi, il vaut mieux faire un GROUP_CONCAT pour récupérer pour chaque TRI ( COS, PAM) les valeurs EC correspondantes, puis les traiter via un Explode.. non ?
Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
16
le group concat sera util dans le cas ou il souhaitera regrouper des lignes de résultats, ce qui ne semble pas être le cas ici vu que justement une ligne représente un enregistrement.

Utiliser le concat lui servira juste à écrire son flux via la requête plutot que par le code (c'est pour ca que j'ai proposé la seconde solution) .

mais je me suis en effet trompé, je n'avais pas calculé que la première info représentais le tire de colonne. Donc je pense que la solution se présentera plutot par le code : un group_concat lui permettra d'avoir tous les COS regroupé avec un séparateur , et un autre résultat avec les tam.

Je me suis trompé car ce qu'il souhaite est ... étrange : comment identifie tu les couple de ton tableau ? c'est à dire que ok COS et TAM son des en-tête, mais comme savoir si ASDER va avec FOLTI ou plutot PIROU ?

je sais pas si je suis super clair dans ma démarche ^^ (mais en gros j'ai l'impression que soit la structure qu'il donne est incomplète, soit elle est inappropriée )

naga
Messages postés
34701
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 janvier 2022
358
Je pense que la structure est inapropiée.. mais bon,
Avec un Group_Concat il peut récupérer toutes les valeurs EC pour COS et idem pour TAM.
Il obtient donc un array à deux dimensions avec une colonne contenant
COS et TAM
Et dans une deuxième colonne, toutes les valeurs EC appartenant à ces TRI..

COS => ADSER,DERTI,...,...
TAM=> PIROU,FOLRI,...,...

il n'a plus qu'à faire un explode de ces colonnes pour récupérer chaque valeur et les mettre dans son tableau..

select distinct 'TRI' , group_concat('EC') from SaTable
group by 'TRI'
Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
16
je suis d'accord sur le principe mais c'est en mon sens un peu lourd ^^. Quoi qu'il en soit il n'obtiendra surement pas les meilleurs résultats s'il ne revois pas sa structure ;) (ou qu'il en dise plus =p)
Messages postés
34701
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 janvier 2022
358
Je n'ai jamais dis que j'allais faire un miracle. ..juste proposer une réponse à sa question telle qu'elle est énoncée. . ;-)
Messages postés
34701
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 janvier 2022
358
Smag, heu.. penses à modifier ta signature... lol
GOOGLE et ton AMI utilise le !!!!!!!!!!
ET et EST.. ce n'est pas la même chose ;)

(A moins que ce soit voulu.. ^^ )
Messages postés
200
Date d'inscription
dimanche 15 février 2009
Statut
Membre
Dernière intervention
22 mai 2014

Coucou à tous merci pour toutes vos premières réponses.

jordane45 est dans le vrai.
Je souhaiterais avoir l'affichage suivant :
*---------------*
| COS	| TAM	|
*---------------*
| ASDER	| FOLTI	|
| DERTI	| PIROU	|
*---------------*


Je vais tester la méthode group_concat, je vous tiens au courant.
Messages postés
200
Date d'inscription
dimanche 15 février 2009
Statut
Membre
Dernière intervention
22 mai 2014

Bonsoir,
Après quelques test sj'ai tester en ajoutant un enregistrement POY dans la colonne TRI.
J'obtiens avec group_concat les valeurs suivantes :
COS ASDER,DERTI
POY
TAM FOLTI,PIROU

Mais maintenant comment puis-je afficher le résultat dans un tableau HTML avec la colonne TRI (donc COS, POY et TAM) en entête?
GOOGLE est ton AMI utilise le !!!!!!!!!!
Messages postés
34701
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 janvier 2022
358
Ta requête te sort un array (un tableau) à deux dimensions..
*Voir : mysqli-result.fetch-array ou équivalent PDO
La première colonne contient tes entêtes (COS, PAM, POY)
La deuxième colonne contient les valeurs (associées à chaque entête)
ASDER,DERTI Pour la ligne correspondant à COS
"" pour POY
FOLTI,PIROU pour TAM

Tu peux reconvertir ces lignes en tableau en utilisant la fonction explode
-> Tu auras donc autant de tableaux que de libellés (COS,PAM,POY)

NB: Tu peux nommer ces nouveaux tableaux de façon dynamique
=> Les variables dynamiques

Enfin, il te faudra boucler sur ces TABLEAUX pour remplir ta table html

Parcourir un tableau

Appuies toi sur les liens que je viens de te donner.
Tu as toutes les infos nécessaires à la réalisation de ton code.
Si tu rencontres des soucis, présentes nous le code que tu as essayé de réaliser, nous verrons si nous pouvons te le corriger


Cordialement,
Jordane
Messages postés
200
Date d'inscription
dimanche 15 février 2009
Statut
Membre
Dernière intervention
22 mai 2014

Coucou à tous.
Désolé de pas donner de nouvelle plutôt !
J'ai revu mon organisation pour mieux analyser les résultats.
Ce code me donne le résultat de trois tableaux coller au lieu d'un seul.

jordane45 : Je recherche à faire le plus possible du code industriel et évolutif, cette exemple concerne 5-6 enregistrement, mais en fait il y en a plus d'une centaine.
J'espère ne pas arriver à alourdir mon code en mettant dans une variable une chaine de caractères très, très longue pour ensuite la "sliter". (ce serra mon dernier recourt :) )

J'espère qu'avec mon code vous pourrez mieux m'aider à tous rassembler en un seul tableau HTML.

Je vous laisse regarder :
<?php
try {
    $connect = new PDO('mysql:dbname=test;host=127.0.0.1', 'xxxxx', 'xxxxxx');

    $sqlTRI = 'SELECT * FROM ttri WHERE 1';
    $resultTRI = $connect->prepare($sqlTRI);
    $resultTRI->execute();
    $arrTRI = $resultTRI->fetchAll(PDO::FETCH_OBJ);

//RESULTAT : 
//object(stdClass)[8]
//  public 'IDTRI' => string '1' (length=1)
//  public 'NOM' => string 'COS' (length=3)
//
//object(stdClass)[9]
//  public 'IDTRI' => string '3' (length=1)
//  public 'NOM' => string 'POY' (length=3)
//
//object(stdClass)[10]
//  public 'IDTRI' => string '2' (length=1)
//  public 'NOM' => string 'TAM' (length=3)

    $sqlEc = 'SELECT * FROM tec WHERE 1';
    $resultEc = $connect->prepare($sqlEc);
    $resultEc->execute();
    $arrEc = $resultEc->fetchAll(PDO::FETCH_OBJ);

//RESULTAT :   
//object(stdClass)[3]
//  public 'IDEC' => string '1' (length=1)
//  public 'TRI' => string '1' (length=1)
//  public 'VALEUR' => string 'ASDER ' (length=6)
//
//object(stdClass)[4]
//  public 'IDEC' => string '2' (length=1)
//  public 'TRI' => string '1' (length=1)
//  public 'VALEUR' => string 'DERTI' (length=5)
//
//object(stdClass)[5]
//  public 'IDEC' => string '3' (length=1)
//  public 'TRI' => string '2' (length=1)
//  public 'VALEUR' => string 'FOLTI' (length=5)
//
//object(stdClass)[6]
//  public 'IDEC' => string '4' (length=1)
//  public 'TRI' => string '2' (length=1)
//  public 'VALEUR' => string 'PIROU' (length=5)

    foreach ($arrTRI as $tri) {
        echo '<table border="1" style="display:block;float:left;">';
        echo '<tr><th>' . $tri->NOM . '</th></tr>';
        foreach ($arrEc as $ec) {
            if ($tri->IDTRI === $ec->TRI) {
                echo '<tr><td>' . $ec->VALEUR . '</td></tr>';
            }
        }
        echo '</table>';
    }
} catch (PDOException $e) {
    echo 'Connexion échouée : ' . $e->getMessage();
}
?>


Résultat HTML :
<table border="1" style="display:block;float:left;">
    <tr><th>COS</th></tr>
    <tr><td>ASDER</td></tr>
    <tr><td>DERTI</td></tr>
</table>
<table border="1" style="display:block;float:left;">
    <tr><th>POY</th></tr>
</table>
<table border="1" style="display:block;float:left;">
    <tr><th>TAM</th></tr>
    <tr><td>FOLTI</td></tr>
    <tr><td>PIROU</td></tr>
</table>


Résultat souhaité :
<table border="1">
    <tr><th>COS</th><th>POY</th><th>TAM</th></tr>
    <tr><td>ASDER</td><td></td><td>FOLTI</td></tr>
    <tr><td>DERTI</td><td></td><td>PIROU</td></tr>
</table>