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 :

Afficher des enregistrements d'un $id sous forme de ligne


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Février 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Février 2013
    Messages : 3
    Par défaut Afficher des enregistrements d'un $id sous forme de ligne
    Bonsoir,

    Je suis un peu débuatnt en php mysql, je suis entrain de préparer un petit site de contrôle et d'évaluation pour nous aider à faire un suivi de progression de l'apprenant( cp...cm2)

    j'ai crée plusieurs tables, mais l'essentiel ce sont les tables suivantes :

    classes(id_c,classe, id_n)

    matiers(id_m, mat, id_d, id_lang)

    eleves( id_e, eleve,id_n,id_c …)

    evaluations( id_ev, id_e, id_c, id_p, id_d, id_m, aquis, verif, id_u)

    mon problème, je veux afficher les enregisterements de l’évalation sous forme d’un tableau comme suivant
    Nom : ecolmysql.png
Affichages : 309
Taille : 33,0 Ko
    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
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
     
    <?php
     
    require_once'functions.php';
     
    session_start();
     
    logged_only();
     
    require_once'header1.php';?>
     
    <!---debut table au sein du corps----->
     
    <?php
     
    if( isset($_SESSION['auth'])){
     
    $d = $_SESSION['auth']->langue;
     
    $n = $_SESSION['auth']->niveau;
     
    $ec = $_SESSION['auth']->ecole;
     
    $un = $_SESSION['auth']->uniteS;
     
    require_once('configEc.php');
     
    require_once('config_bd.php');
     
    require_once('functions.php');
     
    $q = $bd->query(" SELECT ecole FROM ecoles WHERE ecoles.id_ec='".$ec."' ");
     
    $r = $q->fetch();
     
    $q1 = $bd->query("SELECT uniteS FROM unites WHERE unites.id_un='".$un."' ");
     
    $r1 = $q1->fetch();
     
    $q2 = $bd->query("SELECT niv FROM niveaux WHERE niveaux.id_n='".$n."' ");
     
    $r2 = $q2->fetch();
     
    $q3 = $bd->query("SELECT an FROM annees ORDER BY id_a DESClimit1 ");
     
    $r3 = $q3->fetch();?>
     
    <div class="bulleg">
     
    Etablissement :<?php {echo' '.$r->ecole.' ';}?><br/>
     
    Unitée :<?php {echo' '.$r1->uniteS.' ';}?><br/>
     
    </div>
     
    <div class="bulled">
     
    Année scolaire:<?php { echo' '.$r3->an.' ';}?><br/>
     
    Niveau:<?php { echo' '.$r2->niv.' ';}?><br/>
     
    Professeur:<?php echo' '.$_SESSION['auth']->nom.' ';?>&nbsp;<?php echo' '.$_SESSION['auth']->prenom.' ';?><br/>
     
    Doti:<?php echo' '.$_SESSION['auth']->doti.' ';?>
     
    </div>
     
    <!---afficher les evaluations des élèves--->
     
    <table class="table table-striped" border="1">
     
    <?php
     
    $cl = $_GET['id_c'];
     
    require_once('functions.php');require_once('config_bd.php');require_once('configEc.php');
     
    $r2=$bd->query('SELECT classe FROM classes
     
    WHERE classes.id_c='.$cl.' ');
     
    $s2=$r2->fetch();{?><caption>Grille de dépouillement de la classe: <?php echo' '.$s2->classe.' ';}?></caption>
     
    <tr>
     
    <td>Eleve</td>
     
    <?php
     
    $cl = $_GET['id_c'];
     
    $r1=$bd->query('SELECT id_m, mat FROM matieres
     
    WHERE matieres.id_lang='.$d.' ORDER BY id_m ');
     
    while ($s1=$r1->fetch())
     
    {?>
     
    <td><?php echo' '.$s1->id_m.' ';?><?php echo' '.$s1->mat.' ';?></td><?php }?>
     
    </tr>
     
    <tr><?php
     
    $cl = $_GET['id_c'];
     
    $r=$bd->query('SELECT id_e, eleve FROM eleves WHERE eleves.id_clas='.$cl.'');
     
    while ($s=$r->fetch()){?>
     
    <td><?php echo' '.$s->id_e.' ';?><?php echo' '.$s->eleve.' ';?></td>
     
    <?php $cl = $_GET['id_c'];
     
    $u=$_SESSION['auth']->id_u;
     
    $r3=$bd->query('SELECT id_e,id_m,aquis FROM evaluations
     
    WHERE evaluations.id_e='.$s->id_e.' AND evaluations.id_u='.$u.' ORDER BY id_m ');
     
    while ($s3=$r3->fetch()){?>
     
    <td><?php echo' '.$s3->aquis.' ';?>*<?php echo' '.$s3->id_m.' ';?></td><?php }?>
     
    </tr><?php }?>
     
    </table>
     
    <!---fin de l'affichage des évaluations--->
     
    <?php }?>
    les resulats que j'ai maintenant, sont affichés de cette façon sous forme d'un tableau
    Nom eleve Matières Acquis
    Alain Oral A
    SARA Oral B
    Alain Lecture C
    Alain Informatique A
    Robert Lecture A
    Moi, je cherche à mettre les aquis de x par exemple, sur la meme ligne avec le nom de chaque matiere.
    Nom Eleve Oral Lecture Informatique Geometrie
    Alain A C A B
    Sara B A B A
    Robert B A A B

    Merci pour vos réponses

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    Bienvenue !

    Ne donne pas de noms cryptiques à tes colonnes (la règle est la même pour les noms de variables PHP), ça n'a aucun intérêt et rend la lecture difficile.
    => Je n'ai pas regardé ton schéma

    Côté PHP, on évite de mélanger HTML et PHP autant que possible et on indente le script, sinon c'est illisible.
    => Je n'ai pas regardé ton script

    Bon tu vas te dire que je n'ai pas regardé grand chose mais je vais tout de même répondre sur l'essentiel.

    Tu veux pivoter ton jeu de données, SQL n'est pas très fort pour cela. L'idée serait plutôt de récupérer en une unique requête toutes les données dont tu as besoin (il faudra quelques jointures) sur la page puis de transformer le résultat du SQL pour l'affichage. Ainsi on évite les requêtes SQL dans des boucles, ce qui est généralement une *très* mauvaise pratique.

    Puisque tu débutes c'est bien de voir étape par étape dans le détail sans les petites astuces qui raccourciraient le script :
    1. Récupérer les données
    2. Indexer les données
    3. Créer les axes
    4. Créer la matrice d'affichage
    5. Afficher

    Tu ne fournis pas de jeu de données SQL, ainsi mon exemple n'est pas fourni fonctionnel, mais le principe y est.
    J'espère que $db est une instance PDO (quoi d'autre en 2023 ?)

    1. -- Récupérer les données

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $sql = 'SELECT ALL ...';
    $data = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
    /* 
    Mettons un tableau obtenu de la forme :
     
    $data = [
        ['student' => 'Alain', 'subject' => 'Oral', 'level' => 'A'],
        ['student' => 'Sara', 'subject' => 'Oral', 'level' => 'B'],
        ['student' => 'Alain', 'subject' => 'Lecture', 'level' => 'C'],
        ['student' => 'Alain', 'subject' => 'Informatique', 'level' => 'A'],
        ['student' => 'Robert', 'subject' => 'Lecture', 'level' => 'A'],
        // ...
    ];
    */

    2. -- Indexer les acquis selon les élèves et les matières

    Code PHP : 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
    $index = [];
    foreach ($data as $record) {
        $index[$record['student']][$record['subject']] = $record['level'];
    }
    /*
    À ce stade nous avons un tableau $index de la forme :
     
    $index = [
        'Alain' => [
            'Oral' => 'A',
            'Lecture' => 'C',
            'Informatiqe' => 'A',
        ],
        'Sara' => [
            'Oral' => 'B',
        ],
        'Robert' => [
            'Lecture' => 'B',
        ],
        // ...
    ];
     
    Que se passe-t-il si plusieurs élèves ont le même prénom ?
    => Il faudra indexer selon des ID
    */

    3. -- Créer les axes

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // 3.1. Axe X : les matières
    $subjects = array_column($data, 'subject'); // Récupère toutes les matières possibles parmi $data
    $sujects = array_unique($subjects); // Dédoublonne => ['Oral', 'Lecture', 'Informatique']
    sort($subjects); // On trie les matières => ['Informatique', 'Lecture', 'Oral']

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // 3.2. Axe Y : les élèves
    $students = array_column($data, 'student'); // Récupère tous les élèves possibles parmi $data
    $students = array_unique($students); // Dédoublonne => ['Alain', 'Sara', 'Robert']
    sort($students); // On trie les élèves => ['Alain', 'Robert', 'Sara']

    4. -- Créer la matrice $table qui sera utilisée pour l'affichage HTML <table>

    Code PHP : 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
    $table = [];
    foreach ($students as $student) {
        $tr = []; // <tr> HTML, un élément par <td>
        foreach ($subjects as $subject) {
            // On récupère l'évaluation de chaque matière de chaque étudiant
            // Si pas d'évaluation présente, on obtient "(nd)"
            $tr[$subject] = $index[$student][$subject] ?? '(nd)';
        }
        $table[$student] = $tr; // Ajout de la ligne à la matrice
    }
    /*
    Arrivé ici on a un tableau $table de la forme :
     
    $table = [
        'Alain' => ['Informatique' => 'A', 'Lecture' => 'C', 'Oral' => 'A'],
        'Robert' => ['Informatique' => '(nd)', 'Lecture' => 'B', 'Oral' => '(nd)'],
        'Sara' => ['Informatique' => '(nd)', 'Lecture' => '(nd)', 'Oral' => 'B'],
        // ...  
    ];
     
    */

    5. -- Afficher, un peu plus bas dans ton HTML, il suffit maintenant de dérouler $table

    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
    <table border="1">
        <tr>
            <th>Elève</th>
            <?php foreach ($subjects as $subject): ?>
                <th><?= $subject ?></th>
            <?php endforeach ?>
        </tr>
        <?php foreach ($table as $student => $levels): ?>
            <tr>
                <td><?= $student ?></td>
                <?php foreach ($levels as $subject => $level): ?>
                    <td><?= $level ?></td>
                <?php endforeach ?>
            </tr>
        <?php endforeach ?>
    </table>
    À l'affichage cette <table> donnera l'attendu

    That's all Folks!!

  3. #3
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Février 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Février 2013
    Messages : 3
    Par défaut
    Merci, je vais voir comment ça marche avec moi et je vais vous répondre ensuite.

  4. #4
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Février 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Février 2013
    Messages : 3
    Par défaut
    Salut;
    j'ai fait comme vous avez fait, mais je n'ai pas de résultats.
    je vous envoie ma nouvelle requete
    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
     
    <?php
     $bd = new PDO('mysql:dbname=ecole;host=127.0.0.1', 'root', '');
     $bd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     $bd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
     $bd->exec("SET CHARACTER SET utf8");
     
     <!---affichage des evalautaions--->
    <?php 
                $cl = $_GET['id_c'];
             $sql = $bd->query("SELECT eleves.eleve, matieres.mat, evaluations.aquis FROM evaluations
             inner join eleves on evaluations.id_e = eleves.id_e
             inner join matieres on evaluations.id_m = matieres.id_m
            where evaluations.id_c = '".$cl."' ");
            while($data = $sql->fetch()){
               var_dump($data);
            }?>
     
            <!---les resultats de (var_dump) pour cette classe sont les suivants:--->
     
    object(stdClass)#12 (3) { ["eleve"]=> string(25) "Alain" ["mat"]=> string(12) "Calcul" ["aquis"]=> int(1) }
    object(stdClass)#13 (3) { ["eleve"]=> string(25) "Alain" ["mat"]=> string(26) "Obj_sciences" ["aquis"]=> int(0) } object(stdClass)#12 (3) { ["eleve"]=> string(23) "Robert" ["mat"]=> string(26) "Obj_sciences" ["aquis"]=> int(0) } object(stdClass)#13 (3) { ["eleve"]=> string(25) "Alain" ["mat"]=> string(12) "Mesure" ["aquis"]=> int(0) } 
    object(stdClass)#12 (3) { ["eleve"]=> string(25) "Alain" ["mat"]=> string(7) "Lecture" ["aquis"]=> int(1) } 
    object(stdClass)#13 (3) { ["eleve"]=> string(25) "Alain" ["mat"]=> string(27) "Informatique" ["aquis"]=> int(1) } object(stdClass)#12 (3) { ["eleve"]=> string(25) "Sara" ["mat"]=> string(14) "Géométrie" ["aquis"]=> int(0) }
    object(stdClass)#13 (3) { ["eleve"]=> string(25) "Alain" ["mat"]=> string(14) "Géométrie" ["aquis"]=> int(1) }
    Mais, si je met fetch_ALL, je n'oubtiens aucune donnée et si je change fetch_obj par fetch_assoc, je n'oubtiens aucune donnée aussi.
    vraiment, vraiment, je suis figé dans ma place, je ne sais plus quoi faire.

    Merci pour votre aide

  5. #5
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 574
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 574
    Par défaut
    j'ai l'impression que le données que vous nous montrez correspondent au format de la 1re partie du message de Séb :
    Citation Envoyé par Séb. Voir le message
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $data = [
        ['student' => 'Alain', 'subject' => 'Oral', 'level' => 'A'],
        ['student' => 'Sara', 'subject' => 'Oral', 'level' => 'B'],
        ['student' => 'Alain', 'subject' => 'Lecture', 'level' => 'C'],
        ['student' => 'Alain', 'subject' => 'Informatique', 'level' => 'A'],
        ['student' => 'Robert', 'subject' => 'Lecture', 'level' => 'A'],
        // ...
    ];
    donc à partir de cela, vous pouvez transformer ce format à l'aide du code de la 2e partie "Indexer les acquis selon les élèves et les matières".

Discussions similaires

  1. [XL-2003] Copier des données et les coller sous forme de ligne.
    Par rousskoff dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/01/2017, 16h56
  2. Afficher des enregistrements sur deux colonnes
    Par Dauphind dans le forum Access
    Réponses: 1
    Dernier message: 22/06/2006, 14h16
  3. Réponses: 3
    Dernier message: 27/04/2006, 10h01
  4. Afficher des enregistrement en colonne ?
    Par Goldenduck4000 dans le forum Access
    Réponses: 6
    Dernier message: 20/04/2006, 14h11
  5. Réponses: 7
    Dernier message: 30/12/2005, 14h40

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