Affichage résultat et tri alphanumérique

Petit nouveau ! | 4 Messages

20 août 2008, 15:56

Hello!

Ça fait maintenant plusieurs heures que je fais des recherches sur le Ouaibe pour trouver une solution à mon problème, mais que ni-ni... :(

Je m'explique :

J'ai un formulaire avec une liste de choix de références récupérées dans une base de données (voir code ci-dessous). Ces références sont sous la forme "R123", "R1234", "R456", "R4567"... et mon problème vient du fait qu'elles s'affichent comme ceci :
- R123
- R1234
- R456
- R4567
- ...

au lieu de comme cela :
- R123
- R456
- R1234
- R4567
- ...

Avez-vous une petite idée ?

Code : Tout sélectionner

<?php if ($refSelected != '0') { $link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error()); mysql_select_db($database) or die ('Erreur :'.mysql_error()); $select = "SELECT * FROM references ORDER BY '$refSelected'"; $result = mysql_query($select,$link) or die ('Erreur :'.mysql_error()); $total = mysql_num_rows($result); if ($total) { while ($val = mysql_fetch_array($result)) { $refList = $val[$refSelected]; if (!empty($refList)) { ... } } } ?>
Merci d'avance pour vos réponses.

@+

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

20 août 2008, 16:21

Bonjour,

Une idée qui me passe par la tête:
$select = "SELECT * FROM references ORDER BY SUBSTRING('".$refSelected."',2)";
La fonction MySQL SUBSTRING permet dans mon exemple d'ignorer le premier caractère de ta référence et donc devrait permettre un tri plus logique...
http://dev.mysql.com/doc/refman/5.0/fr/ ... #id2943793
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 4 Messages

20 août 2008, 17:57

Merci pour ta réponse rapide !

Excellente idée ! Mais malheureusement, j'ai également une série de référence qui commencent par deux lettres (RX1234). :roll:

Par contre, après diverses (heures de) lectures, je me demande si il serait possible de placer mes résultats de requête dans un "array" et ensuite d'utiliser la fonction "sort()"... Cependant, je ne sais pas, mais alors pas du tout comment faire !

To be continued...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

20 août 2008, 18:20

Autre idée à la con alors:
$select = "SELECT * FROM references ORDER BY REPLACE(REPLACE('".$refSelected."','RX',''),'R','')";
Bon c'est pas très propre, peut être pas très optimisé non plus mais bon ça devrait fonctionner...


Sinon avec sort():
<?php
   if ($refSelected != '0') {
      $link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error());
      mysql_select_db($database) or die ('Erreur :'.mysql_error());
      $select = "SELECT * FROM references ORDER BY '$refSelected'";
      $result = mysql_query($select,$link) or die ('Erreur :'.mysql_error());
      $total = mysql_num_rows($result);
      if ($total) {
        $tablo_ref=array();
         while ($val = mysql_fetch_array($result)) {
         $refList = $val[$refSelected];
         // On construit un tableau qui contient toutes les références
         $tablo_ref[] = $refList;
         if (!empty($refList)) {
         ...
         }
      }
   }

// On trie le tableau de références
sort($tablo_ref);

// On affiche toutes les références => là il faudra ajouter la mise en page HTML pour ta liste déroulante
foreach($tablo_ref as $ref) {
     print $ref;
}

?> 
La meilleure solution, est probablement la deuxième car elle est évolutive si un jour tu as d'autres références que R ou RX.
Au niveau performance, honnêtement je n'en sais rien. D'expérience, ce sont souvent les serveurs MySQL qui sont le plus chargés donc il vaudrait mieux éviter de leur faire faire le REPLACE mais bon, ça reste à vérifier si l'optimisation est un critère important dans ton projet. :)
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 4 Messages

20 août 2008, 20:04

Ca marche nickel !!!

Je viens de t'élever au rang de demi-Dieu et j'érigerais un temple qui portera ton nom !!! :lol:

Tu me fais gagner un temps précieux !

Encore merci.

@+