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

Langage PHP Discussion :

Tri d'un tableau avec plusieurs colonnes


Sujet :

Langage PHP

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut Tri d'un tableau avec plusieurs colonnes
    Salut tout le monde,

    J'ai un tableau sous cette forme :

    Une checkbox qui est nommé comme l'ID (c'est important pour le tri)
    ID 01
    Matricule 123456
    Nom Dupont
    Prénom Tintin
    ...
    Le tableau en question est créé grâce à une requête générique 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
    <?php
    for($i=0;$i<mysql_num_fields($query);$i++)
    		{
    		//afin de ne pas afficher l'ID dans les pages de consultations, je dis que si le nom du champ actuel est 'ID', je l'ignore
    		if(mysql_field_name($query,$i) != 'ID')
    			{
    		echo '<th>'.mysql_field_name($query,$i).'</th>';
    			}
    		}
    ?>
    </tr>
    <?php 
    $nligne = 0;
    $nbColonnes = 0;
    while($row = mysql_fetch_array($query,MYSQL_ASSOC)) 
    {
    	echo '<tr><td><input name="sup['.$row['ID'].']" type="checkbox" value="'.$row['ID'].'" /></td>';
    	foreach($row as $NomCol => $Valeur)
    	{
    		//si le nom de la colonne vaut 'ID', je l'ignore afin de ne pas afficher l'ID
    		if($NomCol != 'ID'){
    		echo '<td><input name="new[' . $row['ID'] . '][' . $NomCol . ']" value="'.$Valeur.'"></td>';	}
    	}
    	echo '</tr>';
    }
     
    echo '</tr>';
     
     
    ?>
    Ce que j'aurais aimé (mais je ne sais pas ci cela est possible) c'est que le nom des champs du tableau soient cliquable et que lorsque je clic sur un champ, le tri ascendant se fasse.

    L'important, est de continuer avec les requêtes génériques.

    Donc si je veux trier par nom, on passe par exemple Nom dans la fonction de tri.

    Est-ce que cela peut se faire du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT *
    FROM $latable ORDER BY NomDuChamp ASC
    et ensuite une redirection du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header("Location: EntreeDeDonnees.php?select_Nom_Tables=".$_SESSION['LaTable']);
    Je ne sais pas du tout si cela est la bonne méthode ou si il est mieux d'utiliser les fonctions de tri de PHP ?

    Merci d'avance pour votre aide très appréciée.

    beegees

  2. #2
    Membre averti Avatar de mdr_cedrick
    Profil pro
    Développeur multimédia
    Inscrit en
    Janvier 2008
    Messages
    374
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Janvier 2008
    Messages : 374
    Points : 336
    Points
    336
    Par défaut
    voici la méthode que j'utilise, elle est un peu sur le principe de ce que tu proposes mais sans le header
    admettons que j'ai une page qui s'appelle tableau.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //tri des colonnes
    if (isset($_GET["tri"]))
       $tri = $_GET["tri"]
    else
       $tri	= 'nom';
     
    $maRequete = "SELECT ... FROM maTable ORDER BY ".$tri;
    et ensuite je fais des liens sur mes entêtes de colonne : tableau.php?tri=ville, tableau.php?tri=nom, etc.
    Pour voir qu'il fait noir, on n'a pas besoin d'être une lumière

  3. #3
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par mdr_cedrick Voir le message
    voici la méthode que j'utilise, elle est un peu sur le principe de ce que tu proposes mais sans le header
    admettons que j'ai une page qui s'appelle tableau.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //tri des colonnes
    if (isset($_GET["tri"]))
       $tri = $_GET["tri"]
    else
       $tri	= 'nom';
     
    $maRequete = "SELECT ... FROM maTable ORDER BY ".$tri;
    et ensuite je fais des liens sur mes entêtes de colonne : tableau.php?tri=ville, tableau.php?tri=nom, etc.
    Salut,

    Merci pour ta réponse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //++++++++++++++++++++++++affichage des noms de colonnes +++++++++++++++++++++++++++++++++
    for($i=0;$i<mysql_num_fields($query);$i++)
    		{
    		//afin de ne pas afficher l'ID dans les pages de consultations, je dis que si le nom du champ actuel est 'ID', je l'ignore
    		if(mysql_field_name($query,$i) != 'ID')
    			{
    echo '<td style="cursor:pointer" onclick="self.location.href=\'EntreeDeDonnees.php?Sort='.mysql_field_name($query,$i).'&Table='.$select_Nom_Table.'\'">'.mysql_field_name($query,$i).'</td>';
     
    		}
    		}
    ?>
    Je pointe vers ma propre page et je mets des liens sur mes entêtes de colonne.

    Quand je clics sur un lien (entête) j'obtiens ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://localhost/EntreeDeDonnees.php?Sort=NOM_ET&Table=etudiants
    ça passe donc bien, maintenant je vais essayer de terminer la dernière étape.

    Merci encore.

    beegees

  4. #4
    Membre averti Avatar de mdr_cedrick
    Profil pro
    Développeur multimédia
    Inscrit en
    Janvier 2008
    Messages
    374
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Janvier 2008
    Messages : 374
    Points : 336
    Points
    336
    Par défaut
    et si tu veux contrôler ta variable $tri pour ne pas que des gens mettes n'importe quoi tu peux toujours faire un switch
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    switch($_GET["tri"])
    {
       case 'nom' : $tri = 'nom'; break;
       ...
    }
    Pour voir qu'il fait noir, on n'a pas besoin d'être une lumière

  5. #5
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Merci beaucoup pour ta réponse mdr_Cedrick,

    Tout fonctionne sauf le tri

    J'obtiens bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM etudiants ORDER BY NOM_ET
    mais le tri ne se fait pas.

    Merci pour ton conseil pour la sécurité.

    beegees

  6. #6
    Membre expérimenté
    Avatar de Jumano
    Profil pro
    Inscrit en
    Février 2007
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 1 163
    Points : 1 595
    Points
    1 595
    Par défaut
    Bonsoir,
    Il faut peut être rajouter à la fin de ta requête dans quel sens tu veux le tri soit "ASC" soit "DESC" ...

  7. #7
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par jumano Voir le message
    Bonsoir,
    Il faut peut être rajouter à la fin de ta requête dans quel sens tu veux le tri soit "ASC" soit "DESC" ...
    Bonsoir jumano,

    Merci pour ta réponse.

    En effet, c'est quelque chose que je n'ai pas encore fait.

    Mais je pense plutôt que je dois appeler une page qui contient le code avec la chaine SQL et qui redirige ensuite vers le site.

    Ce que je pense que je dois faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo '<td style="cursor:pointer" onclick="self.location.href=\'EntreeDeDonnees.php?Sort='.mysql_field_name($query,$i).'&Table='.$table.'\'">'.mysql_field_name($query,$i).'</td>';
    Pointer sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function Tri()
    {
    	document.forms['frmSaisie'].action ='Scripts/Tri.php';
    }
    ce script contient :

    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
    <?php
    $dbname = 'deliberations';
    $link = mysql_connect('localhost', 'root', 'mdp');
    if(!$link)	  
    {
    echo 'Impossible de se connecter à MySQL';
    exit;
    }
     
    // Rendre la base de données deliberation, la base courante
    $db_selected = mysql_select_db($dbname, $link);
    if (!$db_selected) 
    {
    die ('Impossible de sélectionner la base de données : ' . mysql_error());		}
     
    //initialize the session
    if (!isset($_SESSION)) {
      session_start();
    }
     
     
    echo $_GET['Sort']; 
    $sql = "SELECT * FROM ". $table." ORDER BY ".$_GET['Sort'];
    $execution=mysql_query($sql, $link)or die($query . " - " . mysql_error());
     
    header("Location: ../EntreeDeDonnees.php?select_Nom_Tables=".$_SESSION['LaTable']); 
    ?>
     
    <script language="javascript" type="text/javascript">
    	alert('');
    </script>
    Qu'en penses-tu ?

    beegees

  8. #8
    Membre expérimenté
    Avatar de Jumano
    Profil pro
    Inscrit en
    Février 2007
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 1 163
    Points : 1 595
    Points
    1 595
    Par défaut
    Re, Le fait de ne pas afficher la colonne correspondant aux ID ne te décale pas les autres colonnes ?

  9. #9
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par jumano Voir le message
    Re, Le fait de ne pas afficher la colonne correspondant aux ID ne te décale pas les autres colonnes ?
    Re,

    Non aucun problème de décalage.

    J'ai fait en sorte qu'il n'y ait pas de décalage :

    J'ignore la colonne Id (uniquement pour l'affichage) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(mysql_field_name($query,$i) != 'ID')
    Et ici j'ignore les valeurs (à nouveau uniquement pour l'affichage) :

    Sais-tu comment je peux appeler un script javascript qui se trouve dans la même page (Changer_de_Table) via ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo '<td style="cursor:pointer" onclick="self.location.href=\'EntreeDeDonnees.php?Sort='.mysql_field_name($query,$i).'&Table='.$table.'\'">'.mysql_field_name($query,$i).'</td>';
    Merci pour tout.

    beegees

  10. #10
    Membre expérimenté
    Avatar de Jumano
    Profil pro
    Inscrit en
    Février 2007
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 1 163
    Points : 1 595
    Points
    1 595
    Par défaut
    Re,
    Tu n'as pas à créer une nouvelle page, modifie ta page Changer_De_Table.php avec ce code :
    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
    if(isset($_GET['select_Nom_Tables'])) {
    $table = $_GET['select_Nom_Tables'];
    } else {
    $table = $_SESSION['LaTable'];
    }
    $_SESSION['LaTable'] = $table;
     
    if(isset($_GET['Sort'])) {
    $tri = "ORDER BY ".$_GET['Sort'];
    } else {
    $tri = "";
    }
     
    $query = mysql_query("SELECT * FROM ".$table." ".$tri."") or exit(mysql_error());
    $num_rows = mysql_num_rows($query) or exit(mysql_error());
    EDIT : Je n'avais pas lu tout le code que tu avais donné au début c'est pour cela que j'avais un décalage ...

  11. #11
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Re,

    Incroyable

    Avec peu de code, tu arrives au résultat attendu.

    Je suis franchement impressionné par tes connaissances

    Merci, ça à l'air de fonctionne vraiment très bien et c'est (presque) tout simple.

    Tu es vraiment un bon programmeur

    Merci encore.

    beegees

  12. #12
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    EDIT : Je n'avais pas lu tout le code que tu avais donné au début c'est pour cela que j'avais un décalage ... [/QUOTE]

    Je m'en doutais

    @ très bientôt et bonne soirée à toi.

    beegees

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

Discussions similaires

  1. Tri d'un tableau de plusieurs colonnes + cellule vide
    Par Neophyte27 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/11/2010, 23h57
  2. [E-07] tri d'un TCD avec plusieurs colonnes
    Par phoenix75 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/02/2009, 13h47
  3. [MySQL] Réaliser un tableau avec plusieurs colonnes
    Par Julianinho dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 02/02/2009, 14h17
  4. Réponses: 7
    Dernier message: 10/03/2006, 19h09
  5. tableau avec 1 colonne sur 3 sans cadre
    Par brasco06 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 21/04/2005, 17h44

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