Ordre d'une requete [Résolu]

Signaler
Messages postés
57
Date d'inscription
samedi 30 avril 2005
Statut
Membre
Dernière intervention
12 septembre 2009
-
Messages postés
57
Date d'inscription
samedi 30 avril 2005
Statut
Membre
Dernière intervention
12 septembre 2009
-
bonsoir,

voilà je cherche un moyen de modifier l'ordre des enregistrements dans une requete par un bouton haut ou bas selon le cas

voici un exemple de requete

$requete = mysql_query( "SELECT nom,ordre FROM matable ORDER BY ordre ASC") ;
while( $result = mysql_fetch_array( $requete ) ){
echo $result['nom'];
echo '[... up][... down]';
}

Je souhaiterais par ce lien "up" ou "down" ordonner mes enregistrements les uns par rapport aux autres sachant que dans ma table mysql j'ai un champs ordre qui récupère un numéro de classement 1,2,3,...
Mon problème est que je ne sais pas trop comment faire pour mettre à jour l'ordre?

Quelqu'un aurait il une idée?
merci d'avance

15 réponses

Messages postés
57
Date d'inscription
samedi 30 avril 2005
Statut
Membre
Dernière intervention
12 septembre 2009

bonsoir ,

enfin j'ai réussi sans le champs supplémentaire et seulement avec les champs existant càd le champs ordre ici.
3 requetes suffisent .
je passe par la valeur négative pour éviter l'écrasement

if($_GET){
$ordre=$_GET['ordre'];//2
$img=$_GET['img'];//table
$lang=$_GET['lang'];//table
}
if($_GET['mod'] == 'plus') {
$ordre1=$ordre+1;//3
$ordre2=$ordre;//2
$ordre1neg=(0-$ordre1);
mysql_query("UPDATE $img SET ordre_page ='$ordre1neg' WHERE ordre_page='$ordre2'");//a=-3 where a=2
mysql_query("UPDATE $img SET ordre_page='$ordre2' WHERE ordre_page='$ordre1'");//b=2 where b=3
mysql_query("UPDATE $img SET ordre_page='$ordre1' WHERE ordre_page='$ordre1neg'");//a=3 where a=-3
}


if($_GET['mod'] == 'moins') {
$ordre1=$ordre-1;//2
$ordre2=$ordre;//3
$ordre1neg=(0-$ordre1);
//ordre=3
//a=3 b=2
mysql_query("UPDATE $img SET ordre_page ='$ordre1neg' WHERE ordre_page='$ordre2'");//a=-2 where a=3
mysql_query("UPDATE $img SET ordre_page='$ordre2' WHERE ordre_page='$ordre1'");//b=3 where b=2
mysql_query("UPDATE $img SET ordre_page='$ordre1' WHERE ordre_page='$ordre1neg'");//a=2 where a=-2


}
//redirection
header("Location: ../index.php?lang=$lang&adm=menu&img=$img") ;

voilà cela pourra surement aidé quelques personnes
Encore merci à tous le mond epour leur aide
A bientot
Messages postés
1216
Date d'inscription
mardi 20 décembre 2005
Statut
Membre
Dernière intervention
18 octobre 2012
4
a premiere vue il faut lancer

une requete update quelque part ...



tu peux preciser un peu?
Messages postés
1216
Date d'inscription
mardi 20 décembre 2005
Statut
Membre
Dernière intervention
18 octobre 2012
4
de toutes façons, si tu as dans la base

les rangs 1,2 et 3

comment faire passer le 3 en 2

ça ne parait pas simple
Messages postés
1216
Date d'inscription
mardi 20 décembre 2005
Statut
Membre
Dernière intervention
18 octobre 2012
4
peut être avec javascript



tu charges ta table (si pas trop volumineuse)

dans un tableau js que tu mets à jour (provisoirement)

via un form

avec deux boutons up et down

+ un bouton de valid pour mettre à jour la base

bonjour l'algo...



en tous cas bon courage
Messages postés
57
Date d'inscription
samedi 30 avril 2005
Statut
Membre
Dernière intervention
12 septembre 2009

bonsoir ,

oui en effet il s'agit surement d'un update mais la difficulté est de faire passer le 3 avant le 2 (par exemple).

Un update (-1 ou +1)qui modifierait en même temps les autre enregistrement pour qu'il ssuivent aussi

je l' ai déjà vue quelque part mais j'arrive pas à me rappeler où.
je suis sur qu'il y a moyen de positionner mais je cherche encore comment créer mon code.la nuit porte conseil j'y arriverai!!

merci pour ton aide
à bientôt si je trouve je te prévient car ce code est interressant pour ordonner rapidement un menu , des pages,...
Messages postés
1216
Date d'inscription
mardi 20 décembre 2005
Statut
Membre
Dernière intervention
18 octobre 2012
4
je reste convaincu qu'il faut passer par un tableau à un moment ou à un autre
Messages postés
57
Date d'inscription
samedi 30 avril 2005
Statut
Membre
Dernière intervention
12 septembre 2009

bonsoir,

oui en effet il s'agit surement d'un update mais je dois trouver le moyen de faire passer les valeurs d'un enregistrement à l'autre.
Peut être en incrémentant de +1 ou -1 pour faire avancer l'enregistrement dans l'affichage de la requete?
c'est un manipulation un peu long pour faire avance ou reculer l'enregistrement dans le classement mais il me semble être le plus raisonnable à adapter.
J'ai déjà vu cette manipulation quelque part mais je ne sais plus où ?
Mais pour le moment je vois pas trop comment faire suivre les autres enregistrements.
La nuit porte conseil j'y arriverai surement!!

Ce code pourra être interessant pour ordonner un menu dynamique , des pages ,...

Merci pour ton aide
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
UPDATE ta_table SET xx = xx + 1;
UPDATE ta_table SET yy = yy - 1;

Tu bouges pas tout ton classement avec ca !

Du +1 / -1 y'a rien de plus simple.
Et tu peux le faire en une requète !UPDATE ta_table SET xx xx + 1, yy yy - 1;

Et zoup, c'est reglé !
Messages postés
57
Date d'inscription
samedi 30 avril 2005
Statut
Membre
Dernière intervention
12 septembre 2009

bonjour,

merci pour votre aide
j'ai essayer cette méthode :
//celui qui monte UPDATE `matable` SET ordre=3 WHERE ordre= 2
mysql_query("UPDATE $matable SET ordre =(".$_GET['ordre']."+1) WHERE ordre=".$_GET['ordre']);
//celui qui descend UPDATE `matable` SET ordre=2 WHERE ordre= 3
mysql_query("UPDATE $matable SET ordre=".$_GET['ordre']." WHERE ordre=(".$_GET['ordre']."+1)");

mais à chaque fois la première requete ne fait pas de mise à jour la seconde oui (même en modifiant l'ordre des requetes )

je ne vois pas pourquoi ma première requete est ignorer?
il faut arriver à inverser les 2 valeurs il me semble

quelqu'un voit il l'erreur ?merci d'avance pour votre aide
Messages postés
1216
Date d'inscription
mardi 20 décembre 2005
Statut
Membre
Dernière intervention
18 octobre 2012
4
je passerais par des variables

$up="UPDATE $matable
SET ordre =' ".$_GET['ordre']+1." ' WHERE ordre=' ".$_GET['ordre']." ' ";

mysql_query($up);
Messages postés
57
Date d'inscription
samedi 30 avril 2005
Statut
Membre
Dernière intervention
12 septembre 2009

bonsoir;

j'ai déjà essayer par une variable mais j'ai toujours le même problème
la premiere requete n'est pas exécuter mais la deuxième oui
Ce problème me rappelle un écrasement de variable mais je vois pas ou et je ne c pas si c le cas ici?
j'ai chercher sur google comment inverser 2 lignes d'une table et j'ai pas trouver non plus

merci pour votre aide
Messages postés
1216
Date d'inscription
mardi 20 décembre 2005
Statut
Membre
Dernière intervention
18 octobre 2012
4
mysql_query("UPDATE $matable SET ordre =(".$_GET['ordre']."+1) WHERE ordre=".$_GET['ordre']);



justement dans la premiere on se perd un peu dans les ( et les "

si tu passes par une variable , tu peux au moins faire un echo de la requete



moi je ne l'ecrirais pas comme ça mais

essaie quand même avec ta methode

$up("UPDATE $matable SET ordre(".$_GET['ordre']."+1) WHERE ordre=".$_GET['ordre']);



echo $up;



à mon avis c'est dans la construction de la requête que ça coince
Messages postés
57
Date d'inscription
samedi 30 avril 2005
Statut
Membre
Dernière intervention
12 septembre 2009

bonsoir,

oui en effet d'après l'echo de la requete il est claire j'ecrase la valeur alors comment faire ?mais j'y suis presque

j'ai une solution mais qui est peut-être lourde mais elle à l'air de marché:
j'ai crée un nouveaux champs ordretemp(temporaire)pour conserver la valeur avant la modification puis je màj le champs temp
voici le script plus explicatif:
dis moi ce que tu en pense?tu as peut être un autre méthode pour garder en mémoire la valeur de l'ordre pour l'update?

if($_GET['mod'] == 'plus') {
//celui qui monte UPDATE `tickets` SET ordre=3 WHERE ordre= 2
$ordre=$_GET['ordre'];//2
$ordre1=$ordre+1;//3
$ordre2=$ordre;//2


$sql="UPDATE $matable SET ordre ='$ordre1' WHERE ordretemp='$ordre'";
mysql_query($sql);
echo $sql;
echo "
";
//celui qui descend UPDATE `tickets` SET ordre=2 WHERE ordre= 3
$sql="UPDATE $matable SET ordre='$ordre' WHERE ordretemp='$ordre1'";
mysql_query($sql);
echo $sql;


$requete= mysql_query('SELECT `ordre` FROM `tickets`');
while($result = mysql_fetch_array($requete))
{
$ordre = $result['ordre'];
$sql=mysql_query("UPDATE `tickets` SET ordretemp ='$ordre' WHERE ordre='$ordre'");
}


}

En tout cas un grand merci pour ton aide
Messages postés
1216
Date d'inscription
mardi 20 décembre 2005
Statut
Membre
Dernière intervention
18 octobre 2012
4
je ne comprends pas tout mais il n'y a pas de else pour le 'down'



ni init de $ordre-1 (qui correspondrait au down)



et la boucle while je ne suis pas, tu veux tout remettre dans l'ordre ?

(ce serait plutot set ordre=ordretemp) je m'emmêle un peu

et tu n'as fait qu'une mise à jour alors pourquoi un while ?

explique...
Messages postés
57
Date d'inscription
samedi 30 avril 2005
Statut
Membre
Dernière intervention
12 septembre 2009

bonsoir,

voici le script
<?php

//connexion au serveur

//recupère le dernier id
$requete = mysql_query("SELECT id FROM tickets ORDER BY id DESC LIMIT 0,1");
$result = mysql_fetch_array($requete);
$id_der=$result["id"];


//affichage du "menu" ou ce que l'on veux
$requete = mysql_query("SELECT id,nom,ordre FROM tickets ORDER BY ordre");
while( $result = mysql_fetch_array( $requete ) ){
$ordre=$result['ordre'];
echo $result['nom'];

//lien descendre si besoin
if($ordre<$id_der){
echo '[ordre.php?mod=plus&id='.$id.'&ordre='.$ordre.' ]';
}else{
echo'';
}

//lien monter si besoin
if($ordre>1){
echo '[ordre.php?mod=moins&id='.$id.'&ordre='.$ordre.' ]';
}
echo '
';
}

//script pour descendre

if($_GET['mod'] == 'plus') {

//recupère la variable ordre du lien
$ordre=$_GET['ordre'];//2
$ordre1=$ordre+1;//3
$ordre2=$ordre;//2


//màj de l'ordre par rapport à au champs temp (inversion des 2 lignes)

$sql="UPDATE `tickets` SET ordre ='$ordre1' WHERE ordretemp='$ordre'";
mysql_query($sql);

//màj de l'ordre par rapport à au champs temp
$sql="UPDATE `tickets` SET ordre='$ordre' WHERE ordretemp='$ordre1'";
mysql_query($sql);


//màj du champs temp pour qu'il prenne les nouvelles valeurs pour une utilisation futur
$requete= mysql_query('SELECT `ordre` FROM `tickets`');
//je pense qu'il faut un while car il y a 2 champs temp à remettre à jour?
while($result = mysql_fetch_array($requete))
{
$ordre = $result['ordre'];
$sql=mysql_query("UPDATE `tickets` SET ordretemp ='$ordre' WHERE ordre='$ordre'");
}


}


//script pour monter
if($_GET['mod'] == 'moins') {
//celui qui monte UPDATE `tickets` SET ordre=3 WHERE ordre= 2
$ordre=$_GET['ordre'];//2
$ordre1=$ordre-1;//3
$ordre2=$ordre;//2


$sql="UPDATE `tickets` SET ordre ='$ordre1' WHERE ordretemp='$ordre'";
mysql_query($sql);
echo $sql;
echo "
";
//celui qui descend UPDATE `tickets` SET ordre=2 WHERE ordre= 3
$sql="UPDATE `tickets` SET ordre='$ordre' WHERE ordretemp='$ordre1'";
mysql_query($sql);
echo $sql;


$requete= mysql_query('SELECT `ordre` FROM `tickets`');
while($result = mysql_fetch_array($requete))
{
$ordre = $result['ordre'];
$sql=mysql_query("UPDATE `tickets` SET ordretemp ='$ordre' WHERE ordre='$ordre'");
}


}


?>

je m'explique :
Pour éviter d'ecraser la variable je dois conserver l'ordre qu'il avait avant ensuite dès que la maj est fait (càd l'inversion des 2 lignes) je màj le champstemp pour une prochaine utilisation du script
Bon le script n'est pas optimiser (while alors qu'un if suffirait,...)
Voilà chez moi le script à l'air de tourné
(à optimiser surement)!
A mon avis il y a moyen de sauvegarder les valeurs des ordres pour l'inversion par une autre methode
Enfin voilà çà peut p-t t'aider
En tout cas merci pour ton aide
à bientot