Problème avec le tri dans les colonnes

Problème avec le tri dans les colonnes - PHP - Programmation

Marsh Posté le 12-06-2006 à 00:14:40    

Bonjour,
 
J'ai un formulaire avec 4 champs (Nom, Hobby, Pays, Date).
 
Pour "Hobby" il y a 2 possibilités à choix :
- hobby (liste déroulante)
- hobby_autre (champ texte permettant d'insérer un hobby, s'il n'est pas dans la liste déroulante
Mais on ne peut en choisir qu'un, soit dans la liste déroulante, soit en entrer un dans le champ texte.
 
Pour les afficher dans ma page de résultats, j'ai mis :

Code :
  1. <?php echo $row['hobby']; ?><?php echo $row['hobby_autre']; ?>


Je ne suis pas sûre que ce soit très correct, mais ça marche.
 
Par contre j'ai un problème, car j'aimerais pouvoir les trier par colonnes, mais comme la colonne "Hobby" fait référence à 2 champs différents (hobby + hobby_autre), mon tri ne fonctionne pas correctement.
 
Voici ce que j'ai mis pour l'instant :
 

Code :
  1. <td><a href="index.php?go=all&amp;sort=nom">Nom</a></td>
  2. <td><a href="index.php?go=all&amp;sort=hobby">Hobby</a></td>
  3. <td><a href="index.php?go=all&amp;sort=pays">Pays</a></td>


Pour info, j'ai déjà la query suivante sur la page :

Code :
  1. <?php
  2. if ( !isset($_GET['sort']) ) { $sort='date DESC'; } else { $sort=$_GET['sort']; }
  3. $result=db_query("SELECT * FROM hobby ORDER BY $sort" );
  4. $i=db_num_rows($result);
  5. ?>

Reply

Marsh Posté le 12-06-2006 à 00:14:40   

Reply

Marsh Posté le 12-06-2006 à 00:24:29    

Là, comme ça, on voit pas vraiment le rapport entre la première partie de ton message et la deuxième. Pas plus qu'on ne voit de question d'ailleurs, machin fonctionne pas correctement, j'ai envie de dire qu'on s'en doute, tu  ne serais pas là dans le cas contraire.
 
Bref, tu peux préciser un peu ta question ? :)

Reply

Marsh Posté le 12-06-2006 à 00:25:49    

Tu peut changer la requête suivante selon que ton champs est NULL ou vide lorsqu'il est non renseigné:
SELECT
  IF(hobby_autre IS NULL OR LENGTH(hobby_autre)==0,
    hobby, hobby_autre) AS hobby
  FROM hobby;
 
PS: je suppose que tu utilise MySQL.


Message édité par nargy le 12-06-2006 à 00:29:37
Reply

Marsh Posté le 12-06-2006 à 00:28:35    

Ça c'est dangereux:

Code :
  1. $sort=$_GET['sort'];
  2. ... ORDER BY $sort"


faille de sécurité, l'utilisateur peut changer à sa guise le paramètre <<sort>> et s'amuser avec ta BDD.

Reply

Marsh Posté le 12-06-2006 à 11:00:02    

naceroth a écrit :

Là, comme ça, on voit pas vraiment le rapport entre la première partie de ton message et la deuxième. Pas plus qu'on ne voit de question d'ailleurs, machin fonctionne pas correctement, j'ai envie de dire qu'on s'en doute, tu  ne serais pas là dans le cas contraire.
 
Bref, tu peux préciser un peu ta question ? :)


 
Pour répondre à naceroth :
1) Tout d'abord j'ai un formulaire à compléter (les données sont enregistrées dans une BDD MySQL) - pas de problème à ce niveau
2) J'ai une page qui permets de voir toutes les entrées et sur cette page, je souhaite pouvoir faire des tris par colonnes. Là, j'ai juste un problème pour trier la colonne hobby, puisqu'elle fait référence à 2 champs (hobby et hobby_autre). Par défaut les données sont triées par date. Mais j'aimerais donner la possibilité de trier les données par hobby en cliquant sur un lien, comme je l'ai déjà fait pour nom et pays.
Merci

Reply

Marsh Posté le 12-06-2006 à 11:45:44    

Et ça, ne va pas?
SELECT
  IF(hobby_autre IS NULL OR LENGTH(hobby_autre)==0,
    hobby, hobby_autre) AS hobby2
  FROM hobby
  ORDER BY hobby2;

Reply

Marsh Posté le 12-06-2006 à 12:24:28    

nargy a écrit :

Et ça, ne va pas?
SELECT
  IF(hobby_autre IS NULL OR LENGTH(hobby_autre)==0,
    hobby, hobby_autre) AS hobby2
  FROM hobby
  ORDER BY hobby2;


Merci Nargy,  
Mais non, cela ne marche pas... Il me dit qu'il n'y a aucune entrée dans la BDD, alors qu'il y en a.
Mais si ça se trouve, c'est moi qui n'ai pas mis correctement le code… Voici ce que j'ai mis :
 

Code :
  1. <?php
  2. if ( !isset($_GET['sort']) ) { $sort='date DESC'; } else { $sort=$_GET['sort']; }
  3. $result=db_query("SELECT
  4.   IF(hobby_autre IS NULL OR LENGTH(hobby_autre)==0,
  5.     hobby, hobby_autre) AS hobby2
  6.   FROM hobby
  7.   ORDER BY hobby2" );
  8. $i=db_num_rows($result);
  9. ?>

Reply

Marsh Posté le 12-06-2006 à 14:43:13    

Qu'est-ce que tes fonctions db_* ? c'est bien sur du mysql, hein?
 
Je ne voie pas tout à fait la structure de ta BDD.
 
Simplement, utilise les fonctions SQL suivantes:
IF( condition, valeur_vrai, valeur_faux)
champs IS NULL
LENGTH(champs)==0
...pour construire le champs hobby2 à partir de hobby et hobby_autre.

Reply

Marsh Posté le 12-06-2006 à 15:54:55    

oui, j'ai bien une base mysql. Voici la structure de ma table :

Code :
  1. DROP TABLE IF EXISTS hobby;
  2. CREATE TABLE hobby (
  3.    id int(6) NOT NULL auto_increment,
  4.    nom varchar(255) NOT NULL,
  5.    hobby varchar(255) NOT NULL,
  6.    hobby_autre varchar(255) NOT NULL,
  7.    date date NOT NULL default '0000-00-00',
  8.    PRIMARY KEY (id)
  9. );

Reply

Marsh Posté le 12-06-2006 à 18:22:36    

Ok, erreur de syntaxe de ma part, un seul  ``=``:
LENGTH(hobby_autre)=0

Code :
  1. SELECT
  2.      IF(hobby_autre IS NULL OR LENGTH(hobby_autre)=0,
  3.        hobby, hobby_autre) AS hobby2
  4.      FROM hobby
  5.      ORDER BY hobby2


Exemple:


mysql> insert into hobby (hobby) values ('planche à voile');
Query OK, 1 row affected (0.07 sec)
 
mysql> insert into hobby (hobby) values ('surf');
Query OK, 1 row affected (0.00 sec)
 
mysql> insert into hobby (hobby_autre) values ('base de données');
Query OK, 1 row affected (0.00 sec)
 
mysql> SELECT IF(hobby_autre IS NULL OR LENGTH(hobby_autre)=0, hobby, hobby_autre) AS hobby2 FROM hobby ORDER BY hobby2;
+-----------------+
| hobby2          |
+-----------------+
| base de données |
| planche à voile |
| surf            |
+-----------------+
3 rows in set (0.00 sec)


Message édité par nargy le 12-06-2006 à 18:23:10
Reply

Marsh Posté le 12-06-2006 à 18:22:36   

Reply

Marsh Posté le 13-06-2006 à 02:19:48    

Merci !
 
Ca marche tip top dans MySQL ;), mais maintenant j'essaie de l'intégrer dans ma page PHP et je n'arrive pas à y faire fonctionner... :(  
 
J'essaie encore...

Reply

Marsh Posté le 13-06-2006 à 06:44:03    

olala faut tout te faire... remplace la ligne 3 du tout premier code par:

Code :
  1. if($sort!="nom" || $sort!="hobby" || $sort!="pays" )
  2.   $sort="nom";
  3. if($sort=="hobby" )
  4.   $sort="hobby2";
  5. $result=db_query("SELECT
  6.         IF(hobby_autre IS NULL OR LENGTH(hobby_autre)=0,
  7.           hobby, hobby_autre) AS hobby2,
  8.         nom, pays
  9.         FROM hobby
  10.         ORDER BY $sort" );


Jespère au moins que tu as compris comment ça marche.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed