IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Tableau dynamique avec while


Sujet :

PHP & Base de données

  1. #1
    Membre actif Avatar de Meloooo
    Femme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 324
    Points : 288
    Points
    288
    Par défaut Tableau dynamique avec while
    Bonjour à tous,
    Je souhaite réaliser un tableau de statistiques comme suit :
    ______colonne1 | colonne 2 | colonne 3
    ligne1 resultat1 | resultat4 | resultat7
    ligne2 resultat2 | resultat5 | resultat8
    ligne3 resultat3 | resultat6 | resultat9

    Le nombre de colonne et le nombre de ligne sont dynamique, mais j'arrive à afficher mon tableau selon les données que j'ai dans ma base de données, grâce à mysql_num_rows, j'ai donc bien le nombre de ligne et le nombre de colonne, ce que je souhaite faire c'est de remplir mon tableau selon une requête SQL.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    // nombre de colonne
    $colonne=$rows_pays;
    // nombre de ligne
    $ligne=$rows_profession;
    echo '<table border="1">';
    	for($j=0;$j<=$ligne;$j++){
    		echo '<tr>';
    		for($i=0;$i<=$colonne;$i++){
    			echo '<td>';
    			while($stat = mysql_fetch_array($query_stat)){echo $stat[0];}
    			echo  '</td>';
    			}
    	}
    echo '</table>';
    Mais mon while fait tout foiré
    Il ne me met pas les résultats dans les tableaux et ne sont pas bien positionnés, mais quand j'enlève mon while et que je met des valeurs en "durs" cela fonctionne.
    Comment construire proprement mon tableau dynamique avec un while ?

    Merci de vos réponses.

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    Quelle forme a ton tableau $stat ? Et comment fais-tu pour savoir que dans ton exemple resultat5 doit être dans la 2ème colonne de la 2ème ligne.

  3. #3
    Membre actif Avatar de Meloooo
    Femme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 324
    Points : 288
    Points
    288
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Quelle forme a ton tableau $stat ?
    Mon $stat est en faite un entier qui me donne le nombre total de professionnel de santé selon un pays

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    comment fais-tu pour savoir que dans ton exemple resultat5 doit être dans la 2ème colonne de la 2ème ligne.
    Car je veux que la structure de mon tableau soit comme ca.
    et que ma table est construite comme ceci :
    num_profession | num_pays | tot_stat
    1 1 2000
    2 1 2500
    3 1 300
    ...
    ....

    Je vais vous donner un exemple concret :

    ______ France | Espagne | Allemagne
    Medecin 2000 | 1500 | 400
    Infirmier 2500 | 1280 | 600
    Sage femme 3000 | 1600 | 555

    J'ai en tout pour le moment 18 lignes, et 8 colonnes, mais bien évidemment cela peux ce modifier par la suite... J'ai donc fait le mysql_num_rows.

    Suis-je assez claire ou pas du tout ?

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Est ce que tu as un index unique dans ta table sur la paire (num_profession/num_pays) ?

  5. #5
    Membre actif Avatar de Meloooo
    Femme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 324
    Points : 288
    Points
    288
    Par défaut
    Non, j'ai un index unique sur un champs que je n'ai pas mis la car c'est un auto increment.

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Postes ta requête SQL

  7. #7
    Membre actif Avatar de Meloooo
    Femme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 324
    Points : 288
    Points
    288
    Par défaut
    Alors la je sens que je vais me faire fusiller, actuellement ma requête c'est ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT tot_stat FROM stat_pays_profession
    Elle récupère uniquement les stats.

    Alors en faite le truc c'est qu'au début ma requête sql ressemblait à ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT nom_pays, nom_profession, tot_stat
    FROM pays, stat_pays_profession, profession
    WHERE pays.num_pays = stat_pays_profession.num_pays
    AND profession.num_profession = stat_pays_profession.num_profession
    Mais il me repétait du coup plusieurs fois le même pays, (logique étant donné que j'ai 18 professionnel de santé par pays, et vice versa) alors du coup je vais taper dans plusieurs table...

    Une solution ?

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par Meloooo Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT tot_stat FROM stat_pays_profession
    Elle récupère uniquement les stats.
    Euh, toi tu crois au Père-Noël, non ?

  9. #9
    Membre actif Avatar de Meloooo
    Femme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 324
    Points : 288
    Points
    288
    Par défaut
    J'utilisais cette requête uniquement la mise en page de mon tableau...
    PS : sérieux le père noël existe pas ?

  10. #10
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bon, je t'ai adapté un de mes scripts générant des tableaux croisés de ce genre quand les lignes et colonnes sont dynamiques.
    J'ai essayé de commenter au mieux et j'espère que tu suiveras bien la logique, en s'y prenant pas à pas c'est tout à fait jouable. On est loin de ton code et de ta malheureuse requête SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    <?php
     
    $sql = <<<'SQL'
    SELECT
       nom_profession,
       nom_pays,
       SUM(tot_stat) AS nbTotal
    FROM pays
       INNER JOIN stat_pays_profession ON pays.num_pays = stat_pays_profession.num_pays
       INNER JOIN profession ON stat_pays_profession.num_profession = profession.num_profession
    GROUP BY
       nom_profession,
       nom_pays
    ORDER BY
       nom_profession,
       nom_pays
    SQL;
     
    $exec = mysql_query($sql);
     
    if ( ! $exec) {
       die ('sql error = ' . mysql_error());
    }
     
    $data = array();
    $prof = array();
    $pays = array();
     
    while($row = mysql_fetch_assoc($exec)) {
       $data[] = $row;
       // on récupère de manière unique la liste des professions et des pays
       $prof[$row['nom_profession']] = null;
       $pays[$row['nom_pays']] = null;
    }
     
    $prof   = array_flip($prof);   // inversion clé-valeur
    $pays   = array_flip($pays);   // inversion clé-valeur
    $nbPays = count($pays);
    $nbData = count($data);
    sort($pays); // tri des pays par ordre alphabétique (les professions sont déjà triées par le sql)
     
     
    $webFormat = array();   // représente le tableau de données final
    $webRow = array();      // représente une ligne de données numériques du tableau final
    $iData = 0;             // curseur de départ pour la lecture du tableau $data (on le modifiera afin de ne pas parcourir à chaque fois des données déjà traitées)
     
    // pour chaque profession
    foreach($prof as $profession) {
       // on rempli la ligne de rendu avec des valeurs nulles (dans le cas où il n'y aurait pas de données pour un pays)
       $webRow = array_fill(0, $nbPays, null);
       // on parcourt le tableau des données rattachées à la profession
       for($i = $iData; $i < $nbData; ++$i) {
          // si la profession dans le tableau de données ne correspond plus à la profession en cours de traitement,
          // on s'arrête et on modifie le curseur iData pour la prochaine itération (profession suivante)
          if ($details[$i]['nom_profession'] !== $profession) {
             $iData = $i;
             break;
          }
          // sinon on recherche le n° de colonne du pays
          $posPays = array_search($details[$i]['nom_pays'], $pays, true);
          // enregistrement de la valeur statistique à l'intersection profession/pays
          $webRow[$posPays] = $details[$i]['nbTotal'];
       }
       $webFormat[$profession] = $webRow;
    }
     
     
    // fonction de sécurisation des données à afficher
    $hsc = function($p) { return htmlspecialchars($p, ENT_QUOTES); };
    ?>
    <table>
       <thead>
          <tr>
             <th>&nbsp;</th>
             <?php foreach($pays as $value): ?>
             <th><?php echo $hsc($value); ?></th>
             <?php endforeach; ?>
          </tr>
       </thead>
       <tbody>
       <?php foreach($webFormat as $profession => $webRow): ?>
          <tr>
             <td><?php echo $hsc($profession); ?></td>
             <?php foreach($webRow as $nbTotal): ?>
             <td><?php echo $nbTotal; ?></td>
             <?php endforeach; ?>
          </tr>
       <?php endforeach; ?>
       </tbody>
    </table>
    Comme toujours, je n'ai rien testé, ça sort du four donc à prendre avec des gants

  11. #11
    Membre actif Avatar de Meloooo
    Femme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 324
    Points : 288
    Points
    288
    Par défaut
    Merci beaucoup, je vais regarder ca de très près, et je reviens vers vous pour des explications... j'en ai une
    par contre je ne connais vraiment pas bien les requête avec les inner join, pouvez m'expliquer brièvement le fonctionnement ? Ce sont des "jointures amélioriées" ?
    car je viens de lancer la requête dans mon MySql et c'est exactement ca !!

Discussions similaires

  1. Création d'un tableau dynamique avec "rich:columns"
    Par Seiphir0the dans le forum JSF
    Réponses: 2
    Dernier message: 26/05/2009, 20h52
  2. Création tableau dynamique avec php
    Par yasinfo dans le forum Langage
    Réponses: 3
    Dernier message: 05/10/2008, 14h28
  3. tableau dynamique avec surlignement de la ligne
    Par hartecel dans le forum Général JavaScript
    Réponses: 20
    Dernier message: 11/07/2008, 11h17
  4. [Tableaux] Tableau dynamique avec php
    Par Ricus28 dans le forum Langage
    Réponses: 3
    Dernier message: 01/08/2006, 22h46
  5. Création d'un tableau dynamique avec XSL-FO
    Par lionelbrizuela dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 31/01/2006, 11h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo