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 :

Colonnes de dates dynamiques [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 30
    Points : 21
    Points
    21
    Par défaut Colonnes de dates dynamiques
    Bonjour,

    J'ai un petit problème concernant une programmation PHP avec le SGBD MySQL.
    J'aimerais savoir si quelqu'un aurait une solution.

    Voilà, je veux que pour une ligne d'élèves je puisse voir grâce à des colonnes de dates, les notes obtenues.

    Par exemple :

    ---------------------------------------------------------------------
    Eleves / Dates 17/02/2017 18/02/2017 25/02/2017

    Adrian 11 15 16
    Albert 9 8 10
    Jerome 10 10 10
    Guillaumme 20 19 20
    ....
    ---------------------------------------------------------------------

    J'ai créé une requête qui fonctionne bien :


    ---------------------------------------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT l.student, s.name, s.firstname,
     
    GROUP_CONCAT(CASE when t.date='2017-02-17' then l.niveauG end) as '2017-02-17',
    GROUP_CONCAT(CASE when t.date='2017-02-18' then l.niveauG end) as '2017-02-18'
     
    FROM testline l, test t, student s
     
    WHERE l.test=t.code AND l.student=s.code
     
    GROUP BY l.student
    ---------------------------------------------------------------------

    Mais les colonnes ne sont pas dynamiques, c'est à dire qu'elles n'apparaissent pas automatiquement à l'ajout d'un test.

    Alors j'ai essayé cela :

    ---------------------------------------------------------------------
    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
    <?php
    $sql=mysql_query("SELECT date from test ");
    $sq2l=mysql_query("SELECT l.student, s.name, s.firstname".
     
    while ($row = mysql_fetch_array($sql))
          {
    	  $date = $row['date'];
    	  echo ", GROUP_CONCAT(CASE when t.date='".$date."' then l.niveauG end) as '".$date."'";
    	  }
     
    ." FROM testline l, test t, student s
    
    WHERE l.test=t.code AND l.student=s.code
    
    GROUP BY l.student");
     
     
    echo' <table width="80%" border="2" align="center">';
     
     
          echo '<tr>
          <th>Elèves</th>
          <b>'.$date.'</b>
          </tr>'; 
     
    	  while ($row2 = mysql_fetch_array($sql2))
              {
               echo '<tr> <td>'.$studentname.'&nbsp;'.$studentfirstname.'</td>';
     
    		  }
     
    ?>
     </table>
    ---------------------------------------------------------------------

    Mais rien à faire le While n'est pas accepté :

    Parse error: syntax error, unexpected 'while' (T_WHILE) in C:\Program Files (x86)
    \EasyPHP-DevServer-13.1VC9\data\localweb\School\gradecourse.php on line 266

    Auriez-vous une meilleure idée ?

    Merci
    ---

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    SQL ne doit pas servir à presenter les données.
    Récolte les données brutes en SQL et fait le formatage "horizontal" en PHP.

    C'est un sujet qui a été traité plein de fois sur le forum, il doit bien être possible de retrouver un code d'exemple de planning.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Voici un exemple que j'ai posté hier sur un forum italien.

    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
     
    <?php
    define('DB_HOST', '127.0.0.1');
    define('DB_NAME', 'tests');
    define('DB_USER', 'root');
    define('DB_PWD' , '');
    $bdd       = new PDO('mysql:host='.DB_HOST.'; dbname='.DB_NAME,DB_USER,DB_PWD, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    $query     = "SELECT `data`, `nome`,count(*) as conta FROM `tab` group by `data`,`nome` order by `data`, `nome`";
    $prepared     = $bdd->prepare($query);
    $prepared->execute();
    $result       = $prepared->fetchAll();
    $arrDate = array();
    $arrNomi = array();
    $arrFina = array();
    foreach($result as $subArray) {
     if (!in_array($subArray['data'],$arrDate)) {$arrDate[] = $subArray['data'];}
     if (!in_array($subArray['nome'],$arrNomi)) {$arrNomi[] = $subArray['nome'];}
     $arrFina[$subArray['data']][$subArray['nome']] = $subArray['conta'];
    }
    ?>
    <table border="1px">
     <tr align='center' >
      <td>
      </td><?php
      foreach($arrDate as $key => $value) {?>
       <td><?php print $value;?></td><?php
      } ?>
     </tr>
    <?php
     foreach($arrNomi as $keyNomi => $valNomi) {?>
     <tr align='center' style="border:1px solid black">  
      <td><?php print $valNomi;?></td><?php
       foreach($arrDate as $keyDate => $valDate) {?>
        <td><?php print (isset($arrFina[$valDate][$valNomi]) ? $arrFina[$valDate][$valNomi] : "");?></td><?php
       }?>
     </tr><?php
     }?>
    </table>
    Les données
    Nom : 170219-001.JPG
Affichages : 107
Taille : 20,2 Ko

    Le résultat
    Nom : 170219-002.JPG
Affichages : 106
Taille : 24,2 Ko
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Ho merci beaucoup. c'est super sympa.
    Je n'avais pas les mots clefs pour faire mes recherches sur le net "tableau horizontal" et merci aussi badaze pour ta réponse complète.
    Entre temps, j'ai trouvé une solution qui semble fonctionner. Je la poste car j'ai galéré pour trouver une solution :

    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
    <?php
    	$sql = "SELECT t.date, CONCAT(s.firstname,' ', s.name) as student, l.niveauE as niveauE FROM test t, testline l, student s WHERE t.code=l.test AND l.student=s.code AND t.year='".addslashes($_POST['c1'])."' AND t.semester='".addslashes($_POST['c2'])."' AND t.classe = '".addslashes($_POST['c3'])."' AND t.course= '".addslashes($_POST['c4'])."'";
    	$result=mysql_query($sql);
     
    	$dates = array();
        $niveauEs = array();
     
    	$result=mysql_query($sql);
     
    $data = array();
    $dates = array();
     
    while ($row=mysql_fetch_array($result)) 
    { // fetching result
        if(!isset($data[$row['student']])) 
    	{
            $data[$row['student']] = array();
        }     
     
        if(!isset($data[$row['student']][$row['date']])) 
    	{
            $data[$row['student']][$row['date']] = array();
        }    
     
        if(!in_array($row['date'], $dates)) 
    	{
            $dates[] = $row['date'];
        }
     
        $data[$row['student']][$row['date']] = $row['niveauE'];
    }
    ?>
     
    <table width="80%" border="2" align="center">
    <thead>
        <th>&nbspElèves</th>
     
        <?php foreach($dates AS $date) : ?>
            <th>&nbsp;<?=$date?>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
        <?php endforeach; ?>
    </thead>
    <tbody>
     
        <?php foreach($data AS $student => $entries) : ?>
        <tr>
            <td>&nbsp<?=$student?>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
     
            <?php foreach($dates AS $date) : ?>
                <td>&nbsp<?=(isset($data[$student][$date])?$data[$student][$date]:'')?></td>
            <?php endforeach; ?>
        </tr>
        <?php endforeach; ?>
     
    </tbody>
    </table>

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

Discussions similaires

  1. comparer deux dates dynamiques via struts
    Par rherrad dans le forum Struts 1
    Réponses: 8
    Dernier message: 05/09/2007, 10h32
  2. [Dates] get date dynamique
    Par sadkill dans le forum Langage
    Réponses: 3
    Dernier message: 07/05/2007, 14h46
  3. [sql2k] colonne type date
    Par Hydre dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 01/03/2007, 09h52
  4. Trier une colonne par date
    Par foobar42 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 11/07/2006, 17h46
  5. [JTable] Changer les colonnes de manière dynamique
    Par gg2laba dans le forum Composants
    Réponses: 3
    Dernier message: 03/10/2005, 23h39

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