Menüanordnung ändern

Kracky

Mitglied
Hallo zusammen,

ich weiß nicht ob es schon ein Thema gibt und in google habe ich jetzt auch nicht wirklich etwas gefunden was mir weitergeholen hat. Allerdings weiß ich auch nicht so genau wonach ich da suchen soll.

Es geht darum dass das menü meiner website aus einer MySQL Tabelle ausgelesen wird. Eine Schleife läuft einmal durch und stellt dann die Inhalte auf der Seite dar.
Das klappt auch alles soweit sehr gut nur wird die Liste quasi immer nach der Reihenfolge aufgelistet wie sie auch in der Tabelle sind.
Wenn ich jetzt aber eine neue Seite hinzufügen möchte und diese z.B. als 2. im Menü anzeigen lassen will bekomme ich probleme :D

Ich habe es zuerst so versucht das ich die ID auslese und dann halt immer plus oder minus 1 nehme. Das bringt natürlich das Problem das die ID dann doppelt vorkommen kann oder wenn man ID 6 und als nächstes 10 hat wird sie auf 9 gesenkt und ist trozdem noch über der 6.
Das ganze Funktioniert zwar aber das ist natürlich keine schöne Lösung.

Daher meine Frage an euch: Wie kriege ich es hin das ich die Reihenfolge sauber ändern kann? :o
 
Füge der Tabelle ein Feld mit dem Namen my_sort als nteger hinzu. Dort kannst du dann selber eine Zahl eintragen an welcher Position der Eintrag sein soll.

Wennd u dann die Daten ausliest, kannst du über ORDER BY im SQL nach my_sort sortieren

SQL:
SELECT *
FROM my_nav_table
ORDER BY my_sort

Natürlich musst du beim EInfügen eines neuen Eintrages an Psoition 2 alle anderen IDs um eins erhöhen
SQL:
-- Alle ab my_sort=2 nach hinten rutschen
UPDATE my_nav_table
SET my_sort = my_sort 
WHEREmy_sort <= 2;

-- und dann die neue Position 2 einfügen
INSERT INTO ( ...., my_sort)
VALUES(...., 2);
 
Zuletzt bearbeitet von einem Moderator:
Yaslaw, bist du dir da sicher, dass es so funktioniert, wie du beschrieben hast?
SQL:
-- Alle ab my_sort=2 nach hinten rutschen
UPDATE my_nav_table
SET my_sort = my_sort+1
WHERE my_sort >= 2;
Das muss vor dem Einfügen des neuen Eintrags ausgeführt werden.
 
Und du hast die WHERE-Klausel ebenfalls falsch rum. Bei dir werden alle Einträge unter/bis 2 geändert, ergibt auch keinen Sinn. Aber kein Problem.
 
Okay, danke erstmal soweit :) Das bringt mich der Lösung schonmal einen Schritt weiter.

Jetzt habe ich im ACP die Auflistung der Links und am ende steht ein Pfeil der nach oben und einer der nach unten zeigt. Wenn ich jetzt z.B. beim 3. Link den Pfeil nach oben drücke soll dieser an 2. Position gerückt werden und der Link der vorher an 2. Position war auf die 3. Position kommen.

Im Prinzip weist mir die while schleife ja schonmal zu jedem Link die richtige my_sort nummer zu.

Jetzt müsste ich quasi den Link den ich verschieben will um -1 verringern und den der da drüber ist um +1 erhöhen damit die quasi ihre Reihenfolge tauschen.

Den Link direkt anzusprechen ist ja soweit noch einfach aber wie spreche ich den Link dadrüber an?

Mit $row->my_sort-1 scheint es jedenfalls nicht zu gehen ^^ Da wird ja quasi nur der Wert direkt um eins verringert aber nicht der nötige Link angesprochen. Ich kann sie auch nicht direkt über IDs oder Namen ansprechen da diese sich ja jedesmal ändern können und das einfach zu unflexibel ist und nicht mehr funktionieren würde.
 
Das Problem ist glaub ich eher, dass wenn du zuerst einen der beiden Einträge änderst, dass du dann z.B. zwei mal die 2 hast. Willst du nun den alten in die 3 ändern, ändert er natürlich beide, was nicht so gewollt ist.
Die Lösung des Rätsels: Nicht über die my_sort Spalte gehen, sondern die Eintrags-ID nehmen.

Dazu änderst du zuerst den alten Eintrag, wessen ID du nicht hast und danach den aktuellen Eintrag, von dem du die ID hast.

SQL:
UPDATE my_nav_table
SET my_sort = my_sort+1
WHERE my_sort = {$aktueller_sort_eintrag}-1;
Und danach noch folgende Query
SQL:
UPDATE my_nav_table
SET my_sort = my_sort-1
WHERE id = {$aktuelle_id};

Edit:
Yaslaw kennt sicher noch eine elegantere Lösung, aber die dürfte wieder zu komplex sein.
 
Sehr gut,

alles funktioniert soweit aber er gibt mir trozdem noch
Code:
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in
mit auf den Weg.

Im Beispiel sieht das derzeit so aus:

PHP:
$seite_rauf = mysql_query("UPDATE seiten SET my_sort = my_sort+1 WHERE my_sort = '$my_sort'-1");
$seite_rauf2 = mysql_query("UPDATE seiten SET my_sort = my_sort-1 WHERE id = '$seitenid'");
$rauf1 = mysql_fetch_object($seite_rauf);
$rauf2 = mysql_fetch_object($seite_rauf2);

Funktion ist vorhanden aber ich glaube ich habs noch nicht so mit der Formatierung :)
 
Zurück