Page 1 sur 1

ordonnancement de categorie dans une table sql

Posté : 08 avr. 2007, 14:08
par BeRoots
salut la team :)

j'ai encore du mal avec mysql :?

c'est un problème de methode cette fois car je ne trouve pas de solution convenable :(

mon objectif est d'organiser une liste de categorie dans un ordre defini. Pour ce faire, j'utilise un champ ordre_categorie qui contient un numero (depart à 1) pour chaque categorie definit dans la table.
voila ce que je fait pour le moment:
   // On recupère les valeurs du formulaire
   $categorie_a_deplacer = isset($_POST['categorie_a_deplacer']) ? trim($_POST['categorie_a_deplacer']) : "";
   $ordre_choisi = isset($_POST['ordre_choisi']) ? trim($_POST['ordre_choisi']) : "";

   //connexion au serveur MySQL
   include ("../mysql_connection.php");
   $connexion = mysql_connect($hostdb, $userdb, $passdb) or die('Erreur SQL !<br />'.$connexion.'<br />'.mysql_error());

   //sélection de la BDD
   $db = mysql_select_db($usedb,$connexion) or die('Erreur SQL !<br />'.$db.'<br />'.mysql_error());

   // on remplace par X l'ordre_categorie de la categorie à deplacer
   $sql = "UPDATE `$table` SET ordre_categorie = 'x'  WHERE categorie = '$categorie_a_deplacer';";
   $result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

   // on ajoute 1 à tous les champs superieur ou egal à la valeur choisi
   $sql2 = "UPDATE `$table` SET ordre_categorie = (ordre_categorie+1) WHERE (ordre_categorie >= '$ordre_choisi' && ordre_categorie != 'x')";
   $result2 = mysql_query($sql2) or die('Erreur SQL !<br />'.$sql2.'<br />'.mysql_error());

   // On redefinit enfin la valeur choisi pour la categorie choisi
   $sql3 = "UPDATE `$table` SET ordre_categorie = $ordre_choisi WHERE categorie = '$categorie_a_deplacer';";
   $result3 = mysql_query($sql3) or die('Erreur SQL !<br />'.$sql3.'<br />'.mysql_error());

   // on recupere la liste des ordre_categorie et categorie en db
   $sql4 = "SELECT DISTINCT(`categorie`), ordre_categorie  FROM $table ORDER BY ordre_categorie ASC";
   $result4 = mysql_query($sql4) or die('Erreur SQL !<br />'.$sql4.'<br />'.mysql_error());
   mysql_close();
ça marche bien si je choisi une categorie afin de lui donner un numero plus petit mais si je change de sens et que je defini un numero plus grand, cela ne fonctione plus :?

si quelqu'un à une idée à soumettre afin de definir l'ordre des categories de façon simple ;)

aller, j'y retourne ;)
merci d'avance pour vos conseil ;)

Posté : 09 avr. 2007, 16:40
par Ryle
A mon avis, tu n'as pas besoin de ton update set 'x'. En effet, tu connais l'id de l'enregistrement, il te suffira de le mettre à jour en dernier qu'importe qu'il ait été modifié ou pas, ca te fera toujours gagner un update.

Selon moi la méthode à appliquer est la suivante :
Tout d'abord connaite la position actuelle de l'élément que tu veux déplacer, donc au besoin faire un select pour aller la chercher
$sql = " SELECT position ... FROM ... WHERE ... ";
Puis comparer les positions pour savoir si l'enregistrement monte ou descend :
- lorsque tu déplaces vers le haut (cad que la nouvelle position est supérieur à la position actuelle, ex : de la position 4 vers la 7) il te faut faire un update de tous les élément dont la position est supérieure à 4 et inférieure ou égale à 7 pour leur enlever 1 (cad combler le trou laissé par la position actuelle et libérer la position d'arrivée
- lorsque tu déplaces vers le bas (de 6 vers 1) tu updates tous les enregistrements supérieur ou égaux à 1 et inférieur à 6
if ($positionDepart < $positionArrivee) { // on monte le champ, donc on fait descendre les autres
  $sql = "UPDATE .... SET champ = champ - 1 ... "
    ." WHERE champ > ". $positionDepart 
    ." AND champ <= ". $positionArrivee ;
}
else {// on descend le champ, on monte donc les autres
  $sql = "UPDATE .... SET champ = champ + 1 ... "
    ." WHERE champ < ". $positionDepart 
    ." AND champ >= ". $positionArrivee ;
}
Reste plus qu'à faire l'update du champ que tu veux déplacer en lui spécifiant sa nouvelle position qui aura été libéré ci dessus :)
  $sql = "UPDATE .... SET champ = " . $positionArrivee . " WHERE id = ..."; 
Queqlues remarques...

- sortir les variables php des chaines
- en sql ne pas mettre d'apostrophes autour des nombres
- n'utilise les ` que pour protéger un champ ou une table dont le nom est un mot clé protégé SQL
- n'utilise pas de mot clé protégé SQL pour nommer tes champs ou tes tables ;)

Posté : 09 avr. 2007, 23:09
par BeRoots
merci bien ;)
c'est vrai que ta methode etait quand même plus simple :)

merci encore :P

Posté : 13 avr. 2007, 12:46
par BeRoots
je vient de m'apercevoir d'un petit bug dans la matix :lol:

en faite tout fonctionne à merveille pour ce qui est de la remunerotation de mes ordre de categorie mais une fois entréé 10 categorie dans la table, la numero 10 ce place après la 1 alors qu'elle devrait ce placer apès la 9 :?

ma colonne ordre_categorie est de type varchar et je la numerote à partir de 1...

voici ma requete pour recupèrer touts les numero d'ordre pour les categories de la table:

Code : Tout sélectionner

SELECT DISTINCT(`ordre_categorie`) FROM table_test ORDER BY ordre_categorie ASC
ensuite je fait ainsi pour afficher une list de ces numero recuperés:
<?php
      while ($tabl_sql2 = mysql_fetch_assoc($result2))
      {
         $db_ordre_categorie = $tabl_sql2['ordre_categorie'];
         echo "                    <option>$db_ordre_categorie</option>\n";
      }
?>
pourquoi lorsqu'e je recupere cette liste, mon ordonnancement ce fait mal?
si quelqu'un à une idée ;)

Posté : 13 avr. 2007, 13:36
par ouckileou
C'est à cause de ça :
ma colonne ordre_categorie est de type varchar
Pourquoi utiliser un type texte pour un nombre ??? Ton tri se fait tès bien, mais c'est par ordre alphabétique.

Posté : 13 avr. 2007, 14:27
par BeRoots
je suis passer à un type INT pour la colonne et sa roule :)

Merci ;)

Posté : 13 avr. 2007, 14:37
par BeRoots
dernier petit point à reglé :?

je voulai savoir si il etait judicieux de specifier les attibuts ZEROFILL et UNSIGNED ?

pouvez vous m'expliquer ces deux attribut car la doc n'est pas tres explicite à ce sujet. :?

merci d'avance

Posté : 13 avr. 2007, 14:48
par BeRoots
ok zerofill c'est pour afficher les zero devant et cela force le unsigned apparament

pour unsigned si on le precise un à que des entier positif si je ne m'abuse.


je remet resolut mais si des fois vous voyez quelque chose à rajouter à ceci, n'hesitez pas ;)