Trier un tableau php dynamiquement

Résolu

Bonjour,

j'affiche dans une page des clients rentrés dans ma BDD par ordre de date de contact. 

Je souhaiterai pouvoir mettre un lien sur les entête de mon tableau, afin que l'utilisateur, puisse trier par la colonne qu'il veut.

mon affichage : 

<table class="table table-striped">
      <thead>
            <tr>
                  <th>ID</th>
                  <th>NOM</th>
                  <th>PRENOM</th>
                  <th>DATE</th>
                  <th>ACTIVITE</th>
                  <th>SOCIETE</th>
                  <th>EMAIL</th>
                  <th>CP</th>
                  <th>DEPARTEMENT</th>
                  <th>TELEPHONE</th>
                  <th>MESSAGE</th>
            </tr>
      </thead>
      <tbody>
            <?php foreach ($orders as $order) : ?>
                  <tr>
                        <td><?= $order["ID"] ?></td>
                        <td><?= $order["Nom"] ?></td>
                        <td><?= $order["Prénom"] ?></td>
                        <td><?= $order["dateinscription"] ?></td>
                        <td><?= $order["Travaux"] ?></td>
                        <td><?= $order["Provenance"] ?></td>
                        <td><?= $order["Email"] ?></td>
                        <td><?= $order["CodePostal"] ?></td>
                        <td><?= $order["Departement"] ?></td>
                        <td><?= $order["Téléphone"] ?></td>
                        <td><?= substr($order["Message"] ,0, 250)?></td>
                  </tr>
            <?php endforeach ?>
      </tbody>
</table>

mon code de requête d'affichage : 

<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

error_reporting(-1);
require 'fonctionsovh-2024.php';
$db = getConnection();

$query = $db->prepare("
SELECT ID, Nom, Prénom, dateinscription, Travaux, Provenance, Email, CodePostal, Departement, Téléphone, Message
FROM `Contact2024` 
ORDER BY dateinscription
");

$query->execute();

$orders = $query->fetchAll();


$reponse = $db->prepare("
SELECT COUNT(*) AS nbClients 
FROM `Contact2024` 
");
$reponse->execute();
$donnees1 = $reponse->fetch();

$reponsea = $db->prepare("
SELECT COUNT(*) AS janvier 
FROM `Contact2024` 
WHERE (dateinscription BETWEEN '2024-01-01' AND '2024-02-01')
");
$reponsea->execute();
$donnees2 = $reponsea->fetch();

$reponseb = $db->prepare("
SELECT COUNT(*) AS fevrier 
FROM `Contact2024` 
WHERE (dateinscription BETWEEN '2024-02-01' AND '2024-03-01')
");
$reponseb->execute();
$donnees3 = $reponseb->fetch();

$reponsec = $db->prepare("
SELECT COUNT(*) AS mars 
FROM `Contact2024` 
WHERE (dateinscription BETWEEN '2024-03-01' AND '2024-04-01')
");
$reponsec->execute();
$donnees4 = $reponsec->fetch();

$reponsed = $db->prepare("
SELECT COUNT(*) AS avril 
FROM `Contact2024` 
WHERE (dateinscription BETWEEN '2024-04-01' AND '2024-05-01')
");
$reponsed->execute();
$donnees5 = $reponsed->fetch();

$reponsee = $db->prepare("
SELECT COUNT(*) AS mai 
FROM `Contact2024` 
WHERE (dateinscription BETWEEN '2024-05-01' AND '2024-06-01')
");
$reponsee->execute();
$donnees6 = $reponsee->fetch();

$reponsef = $db->prepare("
SELECT COUNT(*) AS juin 
FROM `Contact2024` 
WHERE (dateinscription BETWEEN '2024-06-01' AND '2024-07-01')
");
$reponsef->execute();
$donnees7 = $reponsef->fetch();

$reponseg = $db->prepare("
SELECT COUNT(*) AS juillet 
FROM `Contact2024` 
WHERE (dateinscription BETWEEN '2024-07-01' AND '2024-08-01')
");
$reponseg->execute();
$donnees8 = $reponseg->fetch();

$reponseh = $db->prepare("
SELECT COUNT(*) AS aout 
FROM `Contact2024` 
WHERE (dateinscription BETWEEN '2024-08-01' AND '2024-09-01')
");
$reponseh->execute();
$donnees9 = $reponseh->fetch();

$reponsei = $db->prepare("
SELECT COUNT(*) AS septembre 
FROM `Contact2024` 
WHERE (dateinscription BETWEEN '2024-09-01' AND '2024-10-01')
");
$reponsei->execute();
$donnees10 = $reponsei->fetch();

$reponsej = $db->prepare("
SELECT COUNT(*) AS octobre 
FROM `Contact2024` 
WHERE (dateinscription BETWEEN '2024-10-01' AND '2024-11-01')
");
$reponsej->execute();
$donnees11 = $reponsej->fetch();

$reponsek = $db->prepare("
SELECT COUNT(*) AS novembre 
FROM `Contact2024` 
WHERE (dateinscription BETWEEN '2024-11-01' AND '2024-12-01')
");
$reponsek->execute();
$donnees12 = $reponsek->fetch();

$reponsel = $db->prepare("
SELECT COUNT(*) AS decembre 
FROM `Contact2024` 
WHERE (dateinscription BETWEEN '2024-12-01' AND '2025-01-01')
");
$reponsel->execute();
$donnees13 = $reponsel->fetch();

?>

les requetes reponsea .... sont pour l'affichage dans un autre tableau du nombre de contacts par mois .

Pourriez vous me dire comment trier sur la colonne travaux par ex?

merci d'avance.

J
Windows / Chrome 120.0.0.0

7 réponses

  1. Modérateur

    bonjour

    t'embrasse pas à le coder.... utilises plutôt le plugin datatables (javascript)


    1. Modérateur

      au passage, tu n'es pas obligé de faire 50 x la même requête juste pour sélectionner un mois... , il  te suffit d' utiliser le group by...


      1. Effectivement,

        mais je n'aurais pas pu les afficher dans un tableau où les mois sont séparés ? non?

        <table width="100%" border="1" cellspacing="1" cellpadding="5">
              <thead>
                    <tr>
                          <th>Janvier</th>
                          <th>Février</th>
                          <th>Mars</th>
                          <th>Avril</th>
                          <th>Mai</th>
                          <th>Juin</th>
                          <th>Juillet</th>
                          <th>Août</th>
                          <th>Septembre</th>
                          <th>Octobre</th>
                          <th>Novembre</th>
                          <th>Décembre</th>
                          <th>Total</th>
                    </tr>
              </thead>
              <tbody>
                    <tr>
                          <td><?= $donnees2["janvier"] ?></td>
                          <td><?= $donnees3["fevrier"] ?></td>
                          <td><?= $donnees4["mars"] ?></td>
                          <td><?= $donnees5["avril"] ?></td>
                          <td><?= $donnees6["mai"] ?></td>
                          <td><?= $donnees7["juin"] ?></td>
                          <td><?= $donnees8["juillet"] ?></td>
                          <td><?= $donnees9["aout"] ?></td>
                          <td><?= $donnees10["septembre"] ?></td>
                          <td><?= $donnees11["octobre"] ?></td>
                          <td><?= $donnees12["novembre"] ?></td>
                          <td><?= $donnees13["decembre"] ?></td>
                          <td><?= $donnees1["nbClients"] ?></td>
                    </tr>
              </tbody>
        
        </table>

        .

    2. Bonjour ,

      je ne connais pas cette solution, je regarde.

      Est ce que le javascript ne va pas alourdir mes pages ? 

      Je regarde cette solution .

      Merci 

      J

      1. ,

        bon je crois qu'il va falloir que je passe mon doctorat en php pour comprendre comment fonctionne le plugin datatables.

        j'ai bien compris qu'il fallait télécharger les options  + j'ai mis dans le head les deux lignes:

        <link rel="stylesheet" href="https://cdn.datatables.net/1.13.7/css/jquery.dataTables.css" />
        
        <script src="https://cdn.datatables.net/1.13.7/js/jquery.dataTables.js"></script>

        je ne sais pas où mettre 

        $(document).ready( function () {
            $('#myTable').DataTable();
        } );

        j'ai mis dans filezilla les fichiers .js et .css.

        Après je ne sais plus quoi faire.

        Merci 

        J

        1. Modérateur

          Tu dois, de préférence, placer ce bout de code js à la fin de ton body ( avant le </body> )  entre balise script

          
          <script>
          $(document).ready( function () {
              $('#myTable').DataTable();
          } );
          </script>
          
          </body>

          Il faudra penser à ajouter un ID à ton tableau

          <table id="myTable" width="100%" border="1" cellspacing="1" cellpadding="5" >
      2. ,

        du coup j'ai bien mis le script en fin de body,

        rajouter dans le head l'appel vers les fichiers css et js.

        <link rel="stylesheet" href="https://cdn.datatables.net/1.13.7/css/jquery.dataTables.css" />
        <script src="https://cdn.datatables.net/1.13.7/js/jquery.dataTables.js"></script>
        <link href="datatables.min.css" rel="stylesheet" />
        <link href="datatables.css" rel="stylesheet" />
        <script src="datatables.js"></script>
        <script src="datatables.min.js"></script>

        ma table à un id et une classe 

        <table id='myTable'class="table table-striped display dataTable">

        et c'est good !! j'arrive à trier les colonnes .

        j'ai vu une fonction qui permettrait d'exporter en excel , je vais essayer de l'implanter.

        Encore merci !

        juste une dernière question : 

        lorsque j'ai pris les options que je voulais dans datatable, cela m'a mis plein de fichiers js et css dans des dossiers.

        il faut que je fasse un liens vers chaque fichiers ??

        merci

        Bonne après midi

        Jennifer