Jörch: DB-Einträge mit Sortierreihenfolge bewegen ?

Hallo, ich hab da mal ne Frage und zwar, kann man auf elegante Art und Weise Einträge in einer Spalte (MySQL-DB) mit einer Sortierreihenfolge versehen und diese Positionen dann verschieben ?

Konkretes Beispiel :

Eintrag | Sortierung
--------------------
Bla     | 4
Blubb   | 3
Fupp    | 2
Foo     | 5
Bar     | 1
Dings   | 6

dann gibt mir
SELECT Eintrag FROM tabelle ORDER BY Sortierung
aus : Bar, Fupp, Blubb, Bla, Foo, Dings

Jetzt möchte ich mit einer dazugehörigen UI, mit Links und Pfeilen die Einträge hoch- und runterschieben können (<a href="bla.php?eintrag='.$eintrag.'&move='.$_up_oder_down.'">)

Ich habe da schonmal einen Protoypen gebaut mit Dreieckstausch, der aber sehr schwerfällig ist, viel Code und vor allem viele UPDATE-Statements enthält. Ich poste ihn mal nicht, weil ich denke , mein Ansatz geht in die falsche Richtung und schränkt die Kreativität ein ;-)

oder ok, ein Stückchen daraus :

...

$domains = array();

$position = 0;

while( $row = mysql_fetch_assoc( $result_getDomainPositions ) ){

$domains[$position] = $row['webcode_id'];

if ( $row['webcode_id'] == $_GET['webcode_id'] ){
                $current_position = $position;
            }
            $position++;

}

switch ( $_GET['move'] ) {

case 'up':

$element_before = $domains[$current_position - 1];
                $element_current = $domains[$current_position];
                $domains[$current_position - 1] = $element_current;
                $domains[$current_position] = $element_before;

$sql1 = "UPDATE webcodes SET sort='".( $current_position - 1 )."' WHERE webcodes.id='".$element_current."';";
                $sql2 = "UPDATE webcodes SET sort='".$current_position."' WHERE webcodes.id='".$element_before."';";

break;

case 'down':

$element_after = $domains[$current_position + 1];
                $element_current = $domains[$current_position];
                $domains[$current_position + 1] = $element_current;
                $domains[$current_position] = $element_after;

$sql1 = "UPDATE webcodes SET sort='".( $current_position + 1 )."' WHERE webcodes.id='".$element_current."';";
                $sql2 = "UPDATE webcodes SET sort='".$current_position."' WHERE webcodes.id='".$element_after."';";

break;

default:
            break;
        }

$result_setDomainPositions1 = Util::dbQuery( $sql1 );
        $result_setDomainPositions2 = Util::dbQuery( $sql2 );

Also, falls jemand einen Tipp hat, wie man so etwas eleganter lösen kann, wäre ich sehr dankbar, das Problem dürft nicht so selten sein, oder ?

Danke schonmal und Gruß

  1. Guten Tag,

    Hallo, ich hab da mal ne Frage und zwar, kann man auf elegante Art und Weise Einträge in einer Spalte (MySQL-DB) mit einer Sortierreihenfolge versehen und diese Positionen dann verschieben ?

    Du kannst. Bitte suche mal im Archiv nach den Lösungsvorschlägen.
    Wichtig zu beachten: Der Vorgang muss atomar kekapselt werden.

    Gesundheit!
    Dr. Bit

  2. Hallo

    da habe ich doch glatt etwas gefunden, mit allem drum und dran.
    change.sort.php

    m.b.G. Rolf

    1. Eija, Supergeil !

      Ich wusste das das sexier geht, als mit meinem Gefrickel.
      Vielen Dank !!!

      change.sort.php

      m.b.G. Rolf

    2. Guten Tag Rolf,

      da habe ich doch glatt etwas gefunden, mit allem drum und dran.
      change.sort.php

      Das Script ist ungesund für die Konsistenz der Spalte sort, weil Du zwei getrennte Updates benutzt für das Tauschen der Datensätze.

      Ich habe hier im Forum schon bessere Lösungen gesehen, die das in einem Aufwasch schaffen und damit meine Race Condition wirksam werden lassen.

      Gesundheit!
      Dr. Bit

  3. DIe Lösung :

    Leute vergesst nicht die Eingaben zu validieren/abzusichern !

    public function moveEntry(){

    $max = query("SELECT COUNT(*) FROM webcodes WHERE domain ='".$_GET['domain_id']."'");

    if ( ( $_GET['move'] == 'up' ) && ( $_GET['position'] > 0 ) ) {
                  $moving_operator = '-';
            }

    if ( ( $_GET['move'] == 'down' ) && ( $_GET['position'] < $max ) ) {
                $moving_operator = '+';
            }

    query("UPDATE tabelle SET sort = ( $_GET['position']  ) WHERE sort = ( $_GET['position'] $moving_operator 1 )");
            query("UPDATE tabelle SET sort = ( $_GET['position'] $moving_operator 1 ) WHERE eintrag = '$_GET['id']'");

    header('Location : selbeseite.php');

    }

    Auf Basis des Beispiels change.sort.php