MySQL Order-ID

Frage:

Ich habe jetzt im Beispiel Überschriften in einer Datenbank gespeichert und mit einer Spalte Ordnung versehen. Bei der Ausgabe wird nach Ordnung sortiert - wie lässt sich Ordnung per PHP Script ändern? (aus dem SelfHTML Forum)

Lösung:

Nachfolgend zwei PHP Funktionen aus meiner PHPPictureGallery (will ich irgenwann mal noch veröffentlichen *g*).
Die Funktionen mysql_orderid_up() erhöht eine Order-ID, z.B. von 3 auf 2, die Funktion mysql_orderid_down() erniedert eine Order-ID, z.B. von 2 auf 3 (höhere Zahlen haben geringeren Wert, kommen bei der Ausgabe weiter hinten).

Voraussetzungen: Alle Datensätze müssen über eine ID verfügen, die Spalte mit der ID muss id heißen und Primärschlüssel sein. Die Spalte mit der Order-ID muss order_id heißen, beide Spalten sollten vom Typ int sein.
Zum Zeitpunkt des Funktionsaufrufes, muss bereits eine MySQL Verbindung hergestellt worden sein, sowie eine Datenbank mit mysql_select_db() ausgewählt sein.

Anwendung: Als ersten Paramter übergibt man den Funktionen die ID des zu bearbeitenden Datensatzes, Parameter Nr. 2 ist der Name der MySQL Tabelle. Der dritte Parameter wird nur dann benötigt, wenn man ein zweistufiges Order-ID System aufbauen will.

function mysql_orderid_up($dataID, $table, $gallery = false)
{
  $sql = "SELECT 
            order_id\n";
  if($gallery)
    $sql .= ", gallery\n";
  $sql .= "FROM
            $table
          WHERE
            id = '$dataID'";
  $return = mysql_query($sql) OR die(mysql_error());
  if(!mysql_num_rows($return))
    return false; // Datensatz existiert nicht
  $data = mysql_fetch_assoc($return);
  $sql = "SELECT 
            id,
            order_id
          FROM
            $table
          WHERE
            order_id < '{$data['order_id']}'\n";
  if($gallery)
    $sql .= "AND gallery = '{$data['gallery']}'\n";
  $sql .= "ORDER BY
            order_id DESC
          LIMIT 1";
  $return = mysql_query($sql) OR die(mysql_error());
  if(!mysql_num_rows($return))
    return false; // Datensatz ist bereits am Anfang
  $beforedata = mysql_fetch_assoc($return);
  $sql = "UPDATE
            $table
          SET
            order_id = 0
          WHERE
            id = '{$beforedata['id']}'";
  mysql_query($sql) OR die(mysql_error());
  $sql = "UPDATE
            $table
          SET
            order_id = '{$beforedata['order_id']}'
          WHERE
            id = '$dataID'";
  $return = mysql_query($sql) OR die(mysql_error());
  $sql = "UPDATE
            $table
          SET
            order_id = '{$data['order_id']}'
          WHERE
            id = '{$beforedata['id']}'";
  $return = mysql_query($sql) OR die(mysql_error());
  return true;
}

function mysql_orderid_down($dataID, $table, $gallery = false)
{
  $sql = "SELECT 
            order_id\n";
  if($gallery)
    $sql .= ", gallery\n";
  $sql .= "FROM
            $table
          WHERE
            id = '$dataID'";
  $return = mysql_query($sql) OR die(mysql_error());
  if(!mysql_num_rows($return))
    return false; // Datensatz existiert nicht
  $data = mysql_fetch_assoc($return);
  $sql = "SELECT 
            id,
            order_id
          FROM
            $table
          WHERE
            order_id > '{$data['order_id']}'\n";
  if($gallery)
    $sql .= "AND gallery = '{$data['gallery']}'\n";
  $sql .= "ORDER BY
            order_id ASC
          LIMIT 1";
  $return = mysql_query($sql) OR die(mysql_error());
  if(!mysql_num_rows($return))
    return false; // Datensatz ist bereits am Ende
  $afterdata = mysql_fetch_assoc($return);
  $sql = "UPDATE
            $table
          SET
            order_id = 0
          WHERE
            id = '{$beforedata['id']}'";
  mysql_query($sql) OR die(mysql_error());
  $sql = "UPDATE
            $table
          SET
            order_id = '{$afterdata['order_id']}'
          WHERE
            id = '$dataID'";
  $return = mysql_query($sql) OR die(mysql_error());
  $sql = "UPDATE
            $table
          SET
            order_id = '{$data['order_id']}'
          WHERE
            id = '{$afterdata['id']}'";
  $return = mysql_query($sql) OR die(mysql_error());
  return true;
}

© 2006, Dennis Riehle.