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 :

Creer tableau 2d avec resultats de requete mysql


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2022
    Messages : 35
    Points : 34
    Points
    34
    Par défaut Creer tableau 2d avec resultats de requete mysql
    Bonjour à tous
    Je demande votre aide afin de sortir un tableau sur la base de données de ma bdd.

    J'ai ma table qui est structurée comme ci dessous, j'aimerai récupérer les données et les afficher sous forme de tableau, j'essai en vain.

    Ma table
    Nom : BDD.png
Affichages : 128
Taille : 10,2 Ko

    Le résultat que je recherche
    Nom : tbl.png
Affichages : 108
Taille : 10,0 Ko

    Ci dessous 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    $statement = $connection->prepare("SELECT DISTINCT agent FROM matable");
    		$statement->execute();
    		$totalRowCount = $statement->rowCount();
    		$result = $statement->fetchAll();
    		if($totalRowCount>0){
    			$output .= '<table>
    							<thead>
    								<tr class="text-center">';
    									$output .= '<th>mesure</th>';
    								foreach($result as $row)
    								{
    									$output .= '<th>'.$row['agent'].'</th>';
    								}
    					$output .= '</tr>
    							</thead>
    							<tbody>';
     
    			$statement = $connection->prepare("SELECT agent, mes, valeur FROM matable");
    			$statement->execute();
    			$result = $statement->fetchAll();
    				foreach($result as $row)
    				{
    					$output .= '<tr class="text-center">
    									<td>'.$row['agent'].'</td>
    									<td>'.$row['mes'].'</td>
    									<td>'.$row['valeur'].'</td>
    								</tr>';
    				}
    				$output .= '</tbody>
    						</table>';
    		}
    Le résultat est catastrophiquement loin de l'objectif malheureusement et je ne sais pas comment corriger.
    Besoin de votre aide SVP.

    Merci

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    La difficulté est que tu as un nombre d'agents par mesure indéterminé.

    PDO permet de grouper les lignes selon la première colonne sélectionnée.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $sql = <<<SQL
        SELECT ALL
            mes, -- Pour le groupement PDO
            mes, agent, mesure
        FROM matable
        ORDER BY mes ASC, agent ASC
        SQL;
     
    $mesures = $pdo->query($sql)->fetchAll(PDO::FETCH_UNIQUE);
     
    print_r($mesures);

    Avec ceci tu devrais pouvoir boucler facilement sur les mesures (lignes), puis les agents (colonnes).
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2022
    Messages : 35
    Points : 34
    Points
    34
    Par défaut
    Ci dessous la sortie :
    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
    Array
    (
        [mes 1] => Array
            (
                [mes] => mes 1
                [0] => mes 1
                [agent] => agent 3
                [1] => agent 3
                [val] => 0.003
                [2] => 0.003
            )
     
        [mes 2] => Array
            (
                [mes] => mes 2
                [0] => mes 2
                [agent] => agent 3
                [1] => agent 3
                [val] => 0.033
                [2] => 0.033
            )
     
    )
    Pour cette sortie j'obtient uniquement les données pour l'agent 3, cependant j'aimerai avoir les données de tous les agents.

    En faisant cette modification j'obtient le tableau ci dessous :
    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
    Array
    (
        [0] => Array
            (
                [mes] => mes 1
                [0] => mes 1
                [1] => mes 1
                [agent] => agent 1
                [2] => agent 1
                [val] => 0.001
                [3] => 0.001
            )
     
        [1] => Array
            (
                [mes] => mess 1
                [0] => mes 1
                [1] => mes 1
                [agent] => agent 2
                [2] => agent 2
                [val] => 0.002
                [3] => 0.002
            )
     
        [2] => Array
            (
                [mes] => mes 1
                [0] => mes 1
                [1] => mes 1
                [agent] => agent 3
                [2] => agent 3
                [val] => 0.003
                [3] => 0.003
            )
     
        [3] => Array
            (
                [mes] => mes 2
                [0] => mes 2
                [1] => mes 2
                [agent] => agent 1
                [2] => agent 1
                [val] => 0.002
                [3] => 0.002
            )
     
        [4] => Array
            (
                [mes] => mes 2
                [0] => mes 2
                [1] => mes 2
                [agent] => agent 2
                [2] => agent 2
                [val] => 0.022
                [3] => 0.022
            )
     
        [5] => Array
            (
                [mes] => mes 2
                [0] => mes 2
                [1] => mes 2
                [agent] => agent 3
                [2] => agent 3
                [val] => 0.033
                [3] => 0.033
            )
     
    )
    Merci pour ton aide

  4. #4
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 835
    Points
    2 835
    Par défaut
    Bonjour,

    A la place de PDO::FETCH_UNIQUE, remplace par PDO::FETCH_GROUP et à mon avis le tour sera joué.

    Si ça ne fonctionne pas (ou en dehors de PDO), il est toujours possible de faire exactement la même chose en construisant soi-même son tableau

    Mais merci à @Séb. car je ne connaissais pas FETCH_UNIQUE

    Voici un petit lien très intéressant que j'ai trouvé en me renseignant sur cette constante : https://phpdelusions.net/pdo/fetch_modes

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2022
    Messages : 35
    Points : 34
    Points
    34
    Par défaut
    Bonjour, merci pour vos apports
    J'obtiens le tableau ci dessous :
    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
    Array
    (
        [mes 1] => Array
            (
                [0] => Array
                    (
                        [mes] => mes 1
                        [0] => mes 1
                        [agent] => agent 1
                        [1] => agent 1
                        [val] => 0.001
                        [2] => 0.001
                    )
     
                [1] => Array
                    (
                        [mes] => mes 1
                        [0] => mes 1
                        [agent] => agent2
                        [1] => agent 2
                        [val] => 0.002
                        [2] => 0.002
                    )
     
                [2] => Array
                    (
                        [mes] => mes 1
                        [0] => mes 1
                        [agent] => agent3
                        [1] => agent3
                        [val] => 0.003
                        [2] => 0.003
                    )
     
            )
     
        [mes 2] => Array
            (
                [0] => Array
                    (
                        [mes] => mes 2
                        [0] => mes 2
                        [agent] => agent 1
                        [1] => agent 1
                        [val] => 0.002
                        [2] => 0.002
                    )
     
                [1] => Array
                    (
                        [mes] => mes 2
                        [0] => mes2
                        [agent] => agent 2
                        [1] => agent 2
                        [val] => 0.022
                        [2] => 0.022
                    )
     
                [2] => Array
                    (
                        [mes] => mes 2
                        [0] => mes 2
                        [agent] => agent 3
                        [1] => agent 3
                        [val] => 0.033
                        [2] => 0.033
                    )
     
            )
     
    )
    Merci

  6. #6
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 835
    Points
    2 835
    Par défaut
    Bonjour,

    Oui, et ça correspond à la forme de votre <table></table>.
    Quel est le problème ?

  7. #7
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    Oups oui, c'est bien PDO::FETCH_GROUP qu'il fallait utiliser

    Ensuite pour commencer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php foreach ($mesures as $mes as $agents): ?>
        <tr>
            <td><?= $mes ?></td>
            <?php foreach ($agents as $agent) ?>
                <td><?= $agent['agent'] ?>  =>  <?= $agent['val'] ?></td>
            <?php endforeach ?>
        </tr>
    <?php endforeach ?>
    Restera ensuite à voir pour caler les colonnes.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  8. #8
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 835
    Points
    2 835
    Par défaut
    Rebonjour,

    Vu que j'évoquais le fait de construire soi-même le tableau, voici un exemple :
    On utilise plus FETCH_GROUP car on veut les résultats sans formatage (ici j'ai utilisé FETCH_OBJ)

    Le lien est temporaire mais voici le résultat final avec les différentes valeurs de chaque variable : https://tests.pierre-roels.com/creat...from-query.php

    Et voici le code de la page :
    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
    91
    92
    93
    94
    95
    96
    97
    <?php require_once(__DIR__ . '/wp-config.php'); ?><!doctype html>
    <html lang="en">
        <head>
            <meta charset="utf-8">
            <title>create-table-from-query</title>
            <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-0evHe/X+R7YkIZDRvuzKMRqM+OrBnVFBL6DOitfPri4tjfHxaWutUpFmBp4vmVor" crossorigin="anonymous">
            <style>
                .form-group {
                    margin-bottom: 1rem;
                }
     
                .form-control {
                    text-align: center;
                }
     
                thead th {
                    text-align: center;
                }
            </style>
        </head>
        <body>
            <?php
            $db = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USER, DB_PASSWORD);
            $db->EXEC("SET NAMES utf8");
     
            $sql = "SELECT ALL mes, mes, agent, valeur FROM mesures  ORDER BY mes ASC, agent ASC";
     
            // On récupère les résultats de façon classique
            $results = $db->query($sql)->fetchAll(PDO::FETCH_OBJ);
     
            // On prépare nos tableaux vides qu'on parcourera ensuite
            $mesures = [];
            $agents = [];
            foreach ($results AS $v) {
                $mesures[$v->mes][$v->agent] = $v;
                // On set les agents de cette façon afin d'éviter les doublons vu que les index sont uniques
                $agents[$v->agent] = 1;
            }
     
            // On remet nos agents en tant que "valeur" plutôt que "index"
            $agents = array_keys($agents);
     
            // Pour créer l'objet $agents, on aurait pu faire comme ci-après
            // Mais c'est absolument immonde et illisible donc je déconseille
            // d'autant qu'on parcourt de toute façon le tableau, donc une ligne d'instruction de plus ou de moins, c'est pareil
            $agents2 = array_keys($mesures[array_keys($mesures)[0]]);
            ?>
     
            <div class="container">
                <table class="table">
                    <thead>
                        <tr>
                            <th>mesure</th>
                            <?php foreach ($agents AS $agent) : ?>
                                <th><?= $agent; ?></th>
                            <?php endforeach; ?>
                        </tr>
                    </thead>
                    <tbody>
                        <?php foreach ($mesures AS $mes_id => $mesures_agents) : ?>
                            <tr>
                                <th><?= $mes_id; ?></th>
                                <?php
                                // Pour garder la cohérence des colonnes, on parcours selon 
                                // les colonnes agents et non pas selon les résultats des valeurs de $mesures_agents
                                // car ces dernières ne sont peut-être pas dans le même ordre !
                                ?>
                                <?php foreach ($agents AS $agent) : ?>
                                    <td>
                                        <input type="number" class="form-control" value="<?= $mesures_agents[$agent]->valeur; ?>" />
                                    </td>
                                <?php endforeach; ?>
                            </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
     
                <div class="row">
                    <div class="col-md-6">
                        <h2>$agents</h2>
                        <?php echo PHP_EOL . '<pre>' . print_r($agents, true) . '</pre>' . PHP_EOL; ?>
                    </div>
     
                    <div class="col-md-6">
                        <h2>$agents2</h2>
                        <?php echo PHP_EOL . '<pre>' . print_r($agents2, true) . '</pre>' . PHP_EOL; ?>
                    </div>
                </div>
     
                <h2>$mesures</h2>
                <?php echo PHP_EOL . '<pre>' . print_r($mesures, true) . '</pre>' . PHP_EOL; ?>
     
                <h2>RAW $results</h2>
                <?php echo PHP_EOL . '<pre>' . print_r($results, true) . '</pre>' . PHP_EOL; ?>
            </div>
        </body>
    </html>
    EDIT :
    Je m'ennuyais donc j'ai également créé la version avec FETCH_GROUP : https://tests.pierre-roels.com/creat...etch-group.php
    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
    <?php require_once(__DIR__ . '/wp-config.php'); ?><!doctype html>
    <html lang="en">
        <head>
            <meta charset="utf-8">
            <title>create-table-from-fetch-group</title>
            <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-0evHe/X+R7YkIZDRvuzKMRqM+OrBnVFBL6DOitfPri4tjfHxaWutUpFmBp4vmVor" crossorigin="anonymous">
            <style>
                .form-group {
                    margin-bottom: 1rem;
                }
     
                .form-control {
                    text-align: center;
                }
     
                thead th {
                    text-align: center;
                }
            </style>
        </head>
        <body>
            <?php
            $db = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USER, DB_PASSWORD);
            $db->EXEC("SET NAMES utf8");
     
            $sql = "SELECT ALL mes, mes, agent, valeur FROM mesures  ORDER BY mes ASC, agent ASC";
     
            // On récupère les résultats grâce à FETCH_GROUP
            $mesures = $db->query($sql)->fetchAll(PDO::FETCH_GROUP);
            // Par faciliter pour la création des colonnes
            // on va créer un tableau avec nos agents, comme dans la version classique
            $agents = [];
            foreach(array_values($mesures)[0] AS $v) {
                $agents[$v['agent']] = 1;
            }
            $agents = array_keys($agents);
            ?>
     
            <div class="container">
                <table class="table">
                    <thead>
                        <tr>
                            <th>mesure</th>
                            <?php foreach ($agents AS $agent) : ?>
                                <th><?= $agent; ?></th>
                            <?php endforeach; ?>
                        </tr>
                    </thead>
                    <tbody>
                        <?php foreach ($mesures AS $mesure_id => $mesures_agents) : ?>
                            <tr>
                                <th><?= $mesure_id; ?></th>
                                <?php
                                // Pour garder la cohérence des colonnes, on parcours selon 
                                // les colonnes agents et non pas selon les résultats des valeurs de $mesures_agents
                                // car ces dernières ne sont peut-être pas dans le même ordre !
                                ?>
                                <?php foreach ($mesures_agents AS $v) : ?>
                                    <td>
                                        <input type="number" class="form-control" value="<?= $v['valeur']; ?>" />
                                    </td>
                                <?php endforeach; ?>
                            </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
     
                <div class="row">
                    <div class="col-md-6">
                        <h2>$agents</h2>
                        <?php echo PHP_EOL . '<pre>' . print_r($agents, true) . '</pre>' . PHP_EOL; ?>
                    </div>
     
                    <div class="col-md-6">
                        <h2>$mesures</h2>
                        <?php echo PHP_EOL . '<pre>' . print_r($mesures, true) . '</pre>' . PHP_EOL; ?>
                    </div>
                </div>
            </div>
        </body>
    </html>

  9. #9
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2022
    Messages : 35
    Points : 34
    Points
    34
    Par défaut
    Bonjour
    Merci pour votre aide, mon problème est résolu grâce à vous et j'ai appris par la même occasion.

    Encore merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Boucle For each avec resultat de requete
    Par Hemoroide dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 22/03/2018, 16h12
  2. [PHP 5.6] Tableau - Separations de resultats de requetes
    Par jack77b dans le forum Langage
    Réponses: 3
    Dernier message: 21/11/2015, 03h44
  3. [MySQL] Découper un resultat de requete Mysql en plusieurs pages
    Par ots2 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 28/12/2010, 08h08
  4. resultats de requete mysql
    Par philoupuke dans le forum MySQL
    Réponses: 1
    Dernier message: 08/10/2010, 09h22
  5. Réponses: 2
    Dernier message: 01/06/2009, 16h50

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