Reihenfolge v. MySQL Datensätzen ändern. Was bei Doppelbelegung?

suntrop

Erfahrenes Mitglied
Hi zusammen.

Ich habe jetzt so einiges gelesen, wie ich mit PHP und MySQL Datensätze in der Rheinfolge andren kann (z.B. die Seitenreihenfolge eines CMS oder die Positionen von Links in einem Menü).
Zusätzliche Spalte (order) anlegen und dort die Position abspeichern.

Aber ein Licht geht noch nicht auf. Zum Beispiel lasse ich den User über ein Drop-down-Feld entscheiden, welche Position ein Eintrag haben soll. Was ist, falls der User zweimal die selbe Position (irrtümlich) angibt? In einer Liste mit 10, 20 und mehr Einträgen kann das ja mal passieren.

Ich könnte vor der Speicherung prüfen, ob die neue Reihenfolge nur unterschiedliche Nummern hat. Falls nein, dann nichts speichern und eine Fehlermeldung ausgeben. Das wäre eine Lösung.
Aber gibt es eine andere Möglichkeit? Eine Fallback-Lösung, die dann einfach den nächsthöheren Wert speichert? Ich kenne ähnliches aus Offline-Software.

Hoffe ich habe mich nicht zu kompliziert ausgedrückt :-)

Gruß
suntrop
 
Hoffe ich habe mich nicht zu kompliziert ausgedrückt
Doch ein bisschen schon.

Du hast 10 bis 20 Felder nach denen du die Daten sortieren willst? Wie sieht den die Seite zum Sortieren aus bzw. wie ist die Liste/sind die Lsiten aufgebaut?

Zeig mal ein bisschen mehr dann kann man sich auch was darunter vorstellen.
 
Wenn du eh ein neues Feld in der Tabelle erstellst, kannst du dort einen UNIQUE-INDEX drauf setzen. Dann geht das doppelte speichern schon gar nicht.

Oder du überprüfst halt die Usereingabe gegen die DB. Wenn der Wert schon vorhanden ist, rechne +1 und prüfe nochmals. Das ganze solange bis du auf einen freien Wert kommst. Diesen kannst du dann speichern
 
Ich habe nicht 20 Felder nach denen sortiert werden soll, sondern 20 Datensätze die sortiert werden sollen.
Den Unique-Index kann ich zur Absicherung setzen, hilft mir aber nur indirekt, dass ich ja doch einen Fehler produziere. Ich will den aber umgehen, sodass immer eine neue Sortierung gespeichert wird.

Ich würde gerne mehr herzeigen – aber es besteht bislang nur ein bissel was auf Papier und viel in meinem Kopf :)

Also Ziel ist, dass wenn der User auf "Speichern" klickt und zwei Datensätze den selben Wert für die Position (Feld 'order') haben, dann soll keine Fehlermeldung erscheinen und nichts gespeichert werden, sondern es soll einfach "anders" gespeichert werden.

Beispielsweise:

Vorher:
1 | A
2 | B
3 | C
4 | D
5 | E

User wählt aus:
1 | A
2 | B
3 | C
3 | E
5 | D

Jetzt sollte aber nicht "Sorry, Fehler aufgetreten, nochmal probieren" erscheinen.
Sondern vielleicht …
1 | A
2 | B
3 | C
4 | E
5 | D

… gespeichert werden.
Hier ist es jetzt noch relativ einfach, da die Position 4 noch frei ist und nach 5 kommt nichts mehr.
Aber wenn 4 auch belegt wäre und es gebe noch 7 weitere Datensätze, dann wird's (für mich zu kompliziert) :)

Was ich suche ist also eine Art Best Practice für ein solchen Fall.

Sorry, wenn's kompliziert ausgedrückt ist.

Danke an euch für eure Antworten.
 
Hi,

Yaslaw hat die Sache doch schon ganz transparent erklärt.

Vielleicht nochmal anders herum:
Annahme: Der User tauscht D mit E.

1. Lesen der alten Postion von D ==> oldPos = 4
2. update tabellenname set pos=pos + 1 where pos<=:oldPos ==> danach hast du die Lücke
3. Einfügen von E in die Lücke / oder update
 
Wenn das UPDATE oder INSERT INTO fehlschlägt wegen Doppelbelegung kann man es denke mit mysql_affected_rows() "abfangen"
Und dann eben yaslaws oder harrymans Update/INSERT INTO feuern.

So hätte der User immer freie Wahl und bei einen Fehler würde dann automatisch die freie Position belegt werden.
 
Danke euch für die Hilfe.

Ich werde in den nächsten Tagen die Grundstruktur beginnen und dann probiere ich den Weg mal aus.

Hundertprozentig versteht ich es noch nicht ... aber das kommt sicherlich bei der Arbeit :)

Dank und Gruß
- suntrop -
 
Zurück