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 de résultats ++. [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    Novembre 2013
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Electronicien
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 99
    Points : 51
    Points
    51
    Par défaut Tableau de résultats ++.
    Bonjour,

    Ayant réalisé il y a quelques jours avec l'aide d'un programmeur très compétent ce tableau que voici:
    Image n°1

    Nom : 2017-09-13_13h53_48.jpg
Affichages : 147
Taille : 45,7 Ko

    Il se trouve que désormais, avec d'autres membres de mon site, nous voudrions ajouter deux nouvelles colonnes à ce tableau selon ce schéma:
    Image n°2

    Nom : 2017-09-13_12h15_03.jpg
Affichages : 81
Taille : 30,9 Ko

    Ainsi il serait finalement intéressant d'obtenir dans ce tableau le nombre total de points gagnés par chaque participants et si possible éventuellement le nombre de bonnes réponses en statistiques.

    Pour cela je vous présente mes 3 tables que voici:
    inscriptions
    avec les colonnes suivantes : id, usernames, password
    coeffi
    avec les colonnes suivantes : id, dossier, date, rep_bonne, adresse_image
    reponses
    avec les colonnes suivantes : id, inscription_id, rep_bon, nbr_questions, titre, date_reponse, point_total, titre_id
    Avec pour la colonne inscription_id une liaison avec username de la table inscription.
    Pour la colonne rep_bon les champs valent 1 lorsque la réponse est bonne sinon 0.
    Pour la colonne nbr_questions les champs sont toujours à 1 car il y a qu'une question posée à chaque sujet.
    Pour la colonne titre les champs correspondent au titre de la question.(C' est du varchar).
    Pour la colonne date_reponse les champs correspondent à la date à laquelle le participant à répondu.
    Pour la colonne point_total les champs correspondent à la totalité des points si il y en a.
    Pour la colonne titre_id une liaison avec id de la table coeffi.

    Pour la colonne du tableau correspondant à Points totaux, je parviens à obtenir ce code qui fonctionne et que voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $req = $connection->prepare("
        SELECT username, SUM(point_total) AS points
        FROM reponses r
        INNER JOIN inscriptions i ON i.id = r.inscription_id 
        GROUP BY username 
        ORDER BY points DESC
     ");
    	 $req->execute();
    		 while ($row = $req->fetch(PDO::FETCH_ASSOC))
    			{		   
    				 echo "<blockquote><span style='color:blue;font-size:16px'>".$row['username']." à obtenu ".$row['points']." points à ce jour</span></blockquote>";  
    			}
    Ce script représente une liste des pseudos dont l'ordre des points va du premier nom ayant acquis le plus grand nombre de points au nombre le plus petit. (Mais ce ne serait pas une obligation pour le nouveau tableau à réaliser.Cela ne constituerait qu'une option).

    Cependant je ne sais pas intégrer ce code à celui qui permet d'obtenir le tableau ci dessus correspondant à l'image n°1.

    C'est ainsi que je demande à nouveau de l'aide afin de pouvoir le faire.Et si possible y ajouter en bout de tableau la colonne qui totalise les bonnes réponses pour chaque participants.
    Je pense que la personne qui m'a permis d'obtenir les codes et qui les as défini est celle la plus compétente pour effectuer cet ajout de colonnes.

    Alors si vous voulez bien apporter cette modification, je vous en serai gré.

    Merci d'avance.
    L' ignorance, toujours mène à la servitude.

  2. #2
    Membre du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    Novembre 2013
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Electronicien
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 99
    Points : 51
    Points
    51
    Par défaut
    Oups,

    J'ai oublié le script correspondant au tableau représenté par l'image N°1 et que voici:

    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
    <?php
     
    include 'connexion.php';
     
    // code html tableau
    $html_header_question = '';
    $html_header_coef     = '';
    $html_body            = '';
     
    $ids_question = [];
    // création du code html de l'en-tête
    foreach ($connection->query('SELECT id, coef FROM coeffi ORDER BY id', PDO::FETCH_ASSOC) as $v) {
        $html_header_question .= '<th>'.(int)$v['id'].'</th>';
        $html_header_coef     .= '<th>'.(int)$v['coef'].'</th>';
        $ids_question[]        = (int)$v['id'];
    }
     
    // fonction d'échappement des caractères dangereux
    $hsc = function($p) { return htmlspecialchars($p, ENT_QUOTES, 'utf-8'); };
     
    // résultats du questionnaire
    $sql = <<<'sql'
    SELECT username, inscription_id, titre_id, point_total
      FROM reponses r
           INNER JOIN inscriptions i ON i.id = r.inscription_id
           INNER JOIN coeffi       c ON c.id = r.titre_id
    ORDER BY username, titre_id
    sql;
     
    $last_user_id = '';
    $answers      = [];
    // vu qu'il n'y a aucun paramèrtre, la préparation de la requête est inutile
    foreach ($connection->query($sql, PDO::FETCH_ASSOC) as $v) {
        // gestion des nouveaux noms
        if ($last_user_id !== (int)$v['inscription_id']) {
            $answers[$v['inscription_id']]             = array_fill_keys($ids_question, '&nbsp;');
            $answers[$v['inscription_id']]['username'] = $v['username'];        
            $last_user_id                              = (int)$v['inscription_id'];
        }
        $answers[$last_user_id][(int)$v['titre_id']] = (int)$v['point_total'];  
    }
    // var_dump($answers);
    foreach ($answers as $user_id => $v) {
        $html_body .= '<tr><td>'.$hsc(array_pop($v)).'</td>';   // username
        $html_body .= '<td>'.implode('</td><td>', $v).'</td></tr>';
    }
    ?>
    <!DOCTYPE html>
    <html>
    <head>
    <title>Résultats</title>
    <meta charset="utf-8" /><!--Pour obtenir les bons caractères-->
    <body>
    <table>
        <thead>
            <tr><th>Question n°</th><?= $html_header_question ?></tr>
            <tr><th>Coefficient</th><?= $html_header_coef ?></tr>
        </thead>
        <tbody>
            <?= $html_body ?>
        </tbody>
    </table>
    </body>
    </html>
    L' ignorance, toujours mène à la servitude.

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Commencez par exécuter les requêtes et récupérer les résultats dans des tableaux de valeur puis dans le foreach du premier tableau, récupérez les valeurs voulues du second tableau par leur indice commun.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  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
    Salut,

    comme ceci :
    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
    <?php
     
    include 'connexion.php';
     
    // code html tableau
    $html_header_question = '';
    $html_header_coef     = '';
    $html_body            = '';
     
    $ids_question = [];
    // création du code html de l'en-tête
    foreach ($connection->query('SELECT id, coef FROM coeffi ORDER BY id', PDO::FETCH_ASSOC) as $v) {
        $html_header_question .= '<th>'.(int)$v['id'].'</th>';
        $html_header_coef     .= '<th>'.(int)$v['coef'].'</th>';
        $ids_question[]        = (int)$v['id'];
    }
     
    // ajout des compteurs
    $html_header_question .= '<th rowspan=2>Points totaux</th><th rowspan=2>Bonnes réponses</th>';
    $html_header_coef     .= '<th></th><th></th>'; // 2 cellules vides dessous pour le rowspan
     
    // fonction d'échappement des caractères dangereux
    $hsc = function($p) { return htmlspecialchars($p, ENT_QUOTES, 'utf-8'); };
     
    // résultats du questionnaire
    $sql = <<<'sql'
    SELECT username, inscription_id, titre_id, point_total
      FROM reponses r
           INNER JOIN inscriptions i ON i.id = r.inscription_id
           INNER JOIN coeffi       c ON c.id = r.titre_id
    ORDER BY username, titre_id
    sql;
     
    $last_user_id = '';
    $answers      = [];
    $row_model    = array_fill_keys($ids_question, '&nbsp;');
    // vu qu'il n'y a aucun paramèrtre, la préparation de la requête est inutile
    foreach ($connection->query($sql, PDO::FETCH_ASSOC) as $v) {
        // gestion des nouveaux noms
        if ($last_user_id !== (int)$v['inscription_id']) {
            $answers[$v['inscription_id']]             = $row_model;
            $answers[$v['inscription_id']]['username'] = $v['username'];        
            $last_user_id                              = (int)$v['inscription_id'];
        }
        $answers[$last_user_id][(int)$v['titre_id']] = (int)$v['point_total'];  
    }
     
    foreach ($answers as $user_id => $v) {
        $html_body .= '<tr><td>'.$hsc(array_pop($v)).'</td>';       // username
        $html_body .= '<td>'.implode('</td><td>', $v).'</td>';      // score
        $html_body .= '<td>'.array_sum($v).'</td>';                 // total points
        $html_body .= '<td>'.count(array_filter($v, 'intval')).'</td></tr>';  // nb bonnes réponses
    }
    ?>
    <!DOCTYPE html>
    <html>
    <head>
    <title>Résultats</title>
    <meta charset="utf-8" /><!--Pour obtenir les bons caractères-->
    <body>
    <table>
        <thead>
            <tr><th>Question n°</th><?= $html_header_question ?></tr>
            <tr><th>Coefficient</th><?= $html_header_coef ?></tr>
        </thead>
        <tbody>
            <?= $html_body ?>
        </tbody>
    </table>
    </body>
    </html>
    y a très peu de modifs à vrai dire.
    Va falloir quand même s'y mettre

  5. #5
    Membre du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    Novembre 2013
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Electronicien
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 99
    Points : 51
    Points
    51
    Par défaut
    Merci rawsrc de bien vouloir vous y remettre.

    Effectivement c'est presque ça!


    Voici le résultat:
    Nom : 2017-09-13_19h05_47.jpg
Affichages : 96
Taille : 14,9 Ko

    Les additions de la colonne Points totaux pour chacune des lignes sont bonnes.
    Par contre si on additionne les bonnes réponses dans la colonne Bonnes réponses, ce n'est pas tout à fait juste comme vous pouvez le constater.

    A demain où je pense que je pourrai placer une nouvelle fois ce nouveau sujet comme résolu.
    No stress.
    Bonne soirée.

    ************************************************************************************

    Merci Cinephil pour votre réponse à laquelle j' accorde la plus grande attention!
    L' ignorance, toujours mène à la servitude.

  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
    Ouaip, j'ai juste oublié un petit bout de code ligne 52
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $html_body .= '<td>'.count(array_filter($v, 'intval')).'</td></tr>';  // nb bonnes réponses

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

Discussions similaires

  1. Tableau avec résultat SQL d'une BDD Access
    Par Courgette17 dans le forum JDBC
    Réponses: 4
    Dernier message: 24/04/2007, 11h24
  2. Réponses: 1
    Dernier message: 05/11/2006, 09h24
  3. Réponses: 11
    Dernier message: 31/07/2006, 16h22
  4. Réponses: 3
    Dernier message: 24/04/2006, 16h32
  5. Réponses: 9
    Dernier message: 17/02/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