1. #1
    Membre du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    novembre 2013
    Messages
    91
    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 : 91
    Points : 43
    Points
    43

    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 : 27
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 : 25
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
    91
    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 : 91
    Points : 43
    Points
    43

    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
    14 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    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 : 14 885
    Points : 28 591
    Points
    28 591
    Billets dans le blog
    1

    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 blog sur la conception des BDD, le langage SQL, le PHP...
    « 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
    Modérateur
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    mars 2004
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 4 298
    Points : 10 543
    Points
    10 543

    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
    # Dans la Création, tout est permis mais tout n'est pas utile...

  5. #5
    Membre du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    novembre 2013
    Messages
    91
    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 : 91
    Points : 43
    Points
    43

    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 : 19
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
    Modérateur
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    mars 2004
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 4 298
    Points : 10 543
    Points
    10 543

    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
    # Dans la Création, tout est permis mais tout n'est pas utile...

  7. #7
    Membre du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    novembre 2013
    Messages
    91
    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 : 91
    Points : 43
    Points
    43

    Par défaut

    Bonjour.

    Merci.

    Et maintenant voici une exemple de résultats avec un peu de CSS3 sous Firefox (fonctionne aussi sous internet explorer):

    Nom : 2017-09-14_08h34_06.jpg
Affichages : 15
Taille : 43,5 Ko

    Si j' osai me permettre une question?
    Pourriez vous m'indiquer en ce qui concerne ce script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $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;
    ce que signifie <<<'sql' et sql;
    Car je ne connais pas la réelle utilité de ces codes pour n'avoir jamais eu l'occasion de les apprendre.
    Néanmoins je les ai rencontré assez souvent dans différentes lectures.

    Merci pour votre grande serviabilité pour m'avoir beaucoup aidé à la création de ce tableau désormais totalement terminé.

    Au revoir.
    L' ignorance, toujours mène à la servitude.

  8. #8
    Modérateur
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    mars 2004
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 4 298
    Points : 10 543
    Points
    10 543

    Par défaut

    Salut,

    PHP te permet d'écrire des chaines de caractères sous des tas de formes afin de rendre le code le plus lisible possible.
    Tiens un peu de lecture : Notation nowdoc et plus généralement chaines de caractères en PHP

    Les notations nowdoc et heredoc t'évitent l'enfer des guillemets (simples et doubles) et te permettent de mettre en forme ton code (super important, la mise en forme du code surtout quand tu y reviens dessus des mois après).
    Un IDE comme PHPStorm reconnait le contenu de ces notations (SQL, HTML, JS, XML) et adapte l'auto completion en fonction, c'est super pratique.
    # Dans la Création, tout est permis mais tout n'est pas utile...

  9. #9
    Membre du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    novembre 2013
    Messages
    91
    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 : 91
    Points : 43
    Points
    43

    Par défaut

    Il me semblait bien que c'était quelque chose de ce genre.
    Un peu comme <<<OEF pour supprimer les antislashes.

    Je vais lire les documentations que tu nous présentes et tenter de les comprendre afin de les retenir.
    Pour faciliter les choses, j' écris toujours un résumé condensé pour toujours retrouver l'essentiel.
    Une sorte de filtre SQL en quelques sorte.

    Enfin, tout cela est précieux pour toutes les personnes voulant s'améliorer en la matière si elles en ont besoin.
    Merci pour tout.

    Et sans doute à plus tard pour une prochaine "aventure".
    L' ignorance, toujours mène à la servitude.

+ 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. [Tableaux] fonction pour afficher un tableau de résultat
    Par PAYASS59 dans le forum Fonctions
    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