Ron: reihenfolge der einträge in datenbank verändern.

hallo zusammen,

habe folgendes problem, und finde einfach den fehler nicht.
ich habe artikel die auf einer seite ausgegeben werden.
die artikel befinden sich in der datenbank.
die artikel werden anhand der spalte 'sortnummer' sortiert.

jetzt soll man über den browser die reihenfolge der ausgabe verändern können.

neben jedem artikel gibt es einen link für hoch und einen für runter.
klickt man auf den link wird folgendes mitgegeben:

dieseite.php?sortnummer="50"&move="runter"

jetzt habe ich ne funktion die wenn 'runter'
geklickt wurde alle kleineren 'sortnummer'n sucht, limitiert auf 1
und die zahl in eine variable 'sortnummer2' schreibt.

1.
die variable wird genommen um sie in die 'sortnummer' spalte des nach unten zu verschiebenden artikels zu schreiben.

2.
dann benutze ich die variable 'sortnummer' und schreibe sie in die spalte 'sortnummer' des artikels aus dem ich die 'sortnummer2' habe.

doch genau bei punkt 2 hagt es. der wert wird nicht überschrieben.
nach ein paar mal artikel verschieben habe ich überall in sortnummer die gleiche zahl stehen.

hier die mysql-funktion in meiner php-datei:

if($move=="runter") {

$link = mysql_connect($sqlhost,$sqluser,$sqlpass) or die ("verbindung nicht möglich");
 mysql_select_db($database) or die ("datenbankanfrage nicht möglich!");

$sql_down = "SELECT sortnummer from $sys_pan_tbl WHERE sortnummer < '$sortnummer' LIMIT 1";
 $res_down = mysql_query($sql_down);
 while ($row_down = mysql_fetch_row ($res_down))
 {
  $sortnummer2 = $row_down[0];
  mysql_query("UPDATE $sys_pan_tbl SET sortnummer='$sortnummer' WHERE sortnummer='$sortnummer2'");
  mysql_query("UPDATE $sys_pan_tbl SET sortnummer='$sortnummer2' WHERE sortnummer='$sortnummer'");

}
}

hoffe das war verständlich,
freue mich über hilfe

gruß ron

  1. Das wurdert mich nicht...

    genau das untige Script tut das, was Du gar nicht möchtest. deswegen werden die Zeile überschrieben.

    Wenn Du jedoch nur dei Anzeigenrehinfolge Ändern möchtest, dann schau doch mal in einem SQL Buch nach dem Thema order  bzw de order Befhel. der beschreibt serh genau wie Du die Datensätze sortieren kannst.

    mysql_query("UPDATE $sys_pan_tbl SET sortnummer='$sortnummer' WHERE sortnummer='$sortnummer2'");
      mysql_query("UPDATE $sys_pan_tbl SET sortnummer='$sortnummer2' WHERE sortnummer='$sortnummer'");

    Gruss Matze

    1. Hab grad selber nachgesehen.

      Folgendes Beispiel:

      Select field1 form table order by field1 ASc.

      asc haiesst aufsteigend desc heisst absteigend sortieren. Du kannst auch auf mehrre Spalten sortieren.... order by field1 asc, field2 desc als Beispiel.

      Gruss matze

      PS. wenn es nur um die sortierung geht mach bite keine Änderugnen in der Db schon allein aus performance gründen weniger zu empfehlen.

    2. hallo matze,

      genau das untige Script tut das, was Du gar nicht möchtest. deswegen werden die Zeile überschrieben.

      das ist ja das was ich daran nicht verstehe. ich verstehe nicht was mein script da macht.
      nach meiner logik sollte das eigentlich funktionieren.

      mit dem order-befehl komme ich da nicht weiter...
      der macht das ja immer in abhänigkeit von etwas was ich vorher festlegen muß.

      mit order sortiere ich bei der ausgabe die 'sortnummer'.

      trotzdem danke...

      gruß ron

      1. Naja die sortierung musst Du immer vorher festlegen....
        Du musst nur je nachdem wie der Benutzer reagiert das SQL Script das dem ws Du mächtest ausführen.

        Schematisch sieht das so aus...

        if (userentry = "aufsteigend sortieren")

        orderanweisung = "asc";
        else

        oerdeanweisung = "desc"

        sql_query = "select field1 from table where.... order by field2" + oereranweisung.

        Du musst das jetzt im code umsetzten und dann kannst Du dei abfrage genau so zusammenbauen wie es der Benutzer möchte.

        Gruss Matze

        Ps in einem der anderen Postings wurde schon das Problem detailiert erklärt.

        1. Halihallo Matze

          Ps in einem der anderen Postings wurde schon das Problem detailiert erklärt.

          Ja, ihr habt meinen Auftritt ja kräftig versaut!

          *SCNR*

          Viele Grüsse

          Philipp

          --
          RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
          Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
          1. Deine erklärung war doch so gut, dass ich dazu nicht`s merh sagen musste.....
            Warum also versaut?

            1. Halihallo Matze

              Deine erklärung war doch so gut, dass ich dazu nicht`s merh sagen musste.....
              Warum also versaut?

              War doch nicht so gemeint, Matze (=>*SCNR*). Ich wollte eigentlich "versalzen" sagen.

              Ich schreibe da unmassen von Text und guten Erklärungen und ihr seid schneller; all meine
              schönen Ausführungen mit Analogien etc. sind einfach so - hm. nicht mehr nötig :-))

              Viele Grüsse

              Philipp

              --
              RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
              Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
              1. Servus Philipp,

                vieleicht wäre es nicht mehr notig gewesen aber ich habe mit hochgenuss gelesen, wie du das umschrieben hast.

                Hab mich natürlich insgemein darüber gefreut, dass Du Dir unnötiger weise so viel mühe gegebn hast. ;-)

                1. Halihallo Matze

                  Hab mich natürlich insgemein darüber gefreut, dass Du Dir unnötiger weise so viel mühe gegebn hast. ;-)

                  Ja, ja, dieses Gefühl kenne ich auch :-)

                  Viele Grüsse und einen schönen Abend allerseits

                  Philipp

                  --
                  RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
                  Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
        2. hi matze,

          der ansatz hat ja auch etwas. kann ich bestimmt auch noch gebrauchen...

          gruß ron

          1. Hi ron,

            du musst es selber wissen wie du es löst.... nimms nicht persönlich, aber Deine Lösung ist aus sicht der Programmierung eine 5-6.

            Gruss matze

            1. Hi matze,

              5-6? so wird man also wieder auf den boden der tatsachen geholt...
              o.k. hast mich erwischt,
              mysql ist doch ziemlich neu für mich....

              gruß ron

              Hi ron,

              du musst es selber wissen wie du es löst.... nimms nicht persönlich, aber Deine Lösung ist aus sicht der Programmierung eine 5-6.

              Gruss matze

              1. Hi,

                naja vieleicht ist es auch eine 4-5 mein Studium liegt schon etwas zurück *grns

                Spass bei seite Deine Lösung ist auf jeden Fall, wenn auch nur einmalig, deutlich umständlicher als die Abfrage anzufassen deswegen die schlechte note. Mach dir nichts draus den Fehler h abe ich auch mal gemacht damals als ich noch keine ahnung von Datenbanken hatte.

                Gruss Matze

  2. Hi,

    $sql_down = "SELECT sortnummer from $sys_pan_tbl WHERE sortnummer < '$sortnummer' LIMIT 1";
    $res_down = mysql_query($sql_down);
    while ($row_down = mysql_fetch_row ($res_down))
    {
      $sortnummer2 = $row_down[0];
      mysql_query("UPDATE $sys_pan_tbl SET sortnummer='$sortnummer' WHERE sortnummer='$sortnummer2'");

    Jetzt hat der Datensatz, der bisher sortnummer2 hatte, sortnummer.

    mysql_query("UPDATE $sys_pan_tbl SET sortnummer='$sortnummer2' WHERE sortnummer='$sortnummer'");

    Jetzt haben alle Datensätze, die bisher sortnummer hatten - also insbesondere auch der, der bis vor kurzem (2 mysql_queries vorher) noch sortnummer2 hatte, sortnummer2...

    Abhilfe: identifiziere die beiden betroffenen Datensätze, nachdem Du sie über das Sortierkriterium rausgesucht hast, an etwas anderem als an diesem Sortierkriterium.
    Es bietet sich der Primary Key der Tabelle an...

    cu,
    Andreas

    --
    Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
    http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
  3. Halihallo Ron

    habe folgendes problem, und finde einfach den fehler nicht.
    ich habe artikel die auf einer seite ausgegeben werden.
    die artikel befinden sich in der datenbank.
    die artikel werden anhand der spalte 'sortnummer' sortiert.

    Muss das sein? - Die Frage ist ernst gemeint: tu das nur, wenn es wirklich notwendig
    ist!

    jetzt soll man über den browser die reihenfolge der ausgabe verändern können.

    Ich hoffe, dass du dies nur für den Admin brauchst, wenn Clienten dies ändern können
    wird die ganze Geschichte höchst ineffizient.

    --

    Ich versuche es mit einem Beispiel:

    artikel_id    sortnummer
        1             5
        2             7
        3             9
        4             11
        5             15

    nun soll artikel_id=3 um eins nach _oben_ verschoben werden:

    a) alle artikel_id kleiner _2_ (also 3-1)  bleiben dieselben
    b) alle artikel_id grösser 3 gleiben dieselben
    c) => nur 3 und 2 ändern sich, werden ausgetauscht.

    OK, soweit hast du es, aber:

    $sql_down = "SELECT sortnummer from $sys_pan_tbl WHERE sortnummer < '$sortnummer' LIMIT 1";

    liefert dir _irgendeinen_ Datensatz, wo sortnummer < $sortnummer ist. Folglich fehlt hier
    ein ORDER BY sortnummer DESC, sodass LIMIT 1 den grössten sortnummer Datensatz, wo
    sortnummer<$sortnummer noch gilt zurückgibt (in meinem Beispiel also 2).

    Dann ein zweiter Fehler:

    1. mysql_query("UPDATE $sys_pan_tbl SET sortnummer='$sortnummer' WHERE
         sortnummer='$sortnummer2'");
    2. mysql_query("UPDATE $sys_pan_tbl SET sortnummer='$sortnummer2' WHERE
         sortnummer='$sortnummer'");

    In Query 1 änderst du sortnummer auf $sortnummer2, aber nach genau dieser selektierst
    du im Query 2 und setzt es wieder auf $sortnummer... Das erinnert mich an das Problem
    wie man die Werte zweier Variablen austauscht:

    a=5
    b=7

    nun soll a=7 und b=5 sein. Wie löst du es?

    a=b
    b=a

    ? - Nein. Dann hast du in a sowie b 7 stehen und genau das hast du in deiner Datenbank
    bemerkt. Bei dem letzten Beispiel verwendet man oft eine temporäre Variable:

    a=5
    b=7

    c=a
    a=b
    b=c

    so tauscht man die Variablen aus. Nun was ist diese temporäre Variable in deiner
    Datenbank? - Ganz einfach: der Primary Key referenziert sie bereits...

    Ich schätze mal du kommst jetzt selber darauf und sonst fragst du einfach nochmal :-)

    Viele Grüsse

    Philipp

    --
    RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
    Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
    1. hi phillip,

      supergeile antwort, schön erklärt.
      hatte mir schon fast gedacht das es sowas in der art sein muß.

      Muss das sein? - Die Frage ist ernst gemeint: tu das nur, wenn es
      wirklich notwendig ist!

      warum?
      aus performancegründen?

      ist aber eh nur intern für wenige mitarbeiter um eine todo-liste im netzt miteinander führen zu können...

      gruß ron

      1. Halihallo ron

        supergeile antwort, schön erklärt.

        Danke :-)

        hatte mir schon fast gedacht das es sowas in der art sein muß.

        Es lebe die Analogie...

        Muss das sein? - Die Frage ist ernst gemeint: tu das nur, wenn es
        wirklich notwendig ist!
        warum?

        Das sortieren sollte im Optimalfall auf staatischen Daten basieren (Erstelldatum, id,
        ...) oder auf dynamischen, die sowieso geändert werden (letzte Änderung, Priorität).
        Alles andere ist ein Performanceverlust (auch wenn er _sehr_ gering sein kann), da
        die Umsortierung wie du sie illustrierst ja einige Queries braucht. Die Sortierung
        im Optimalfall wiederum sollte nur einen Query brauchen (nämlich ein UPDATE oder INSERT).
        Zudem brauchst du für die Sortierung einen eigenen Algorithmus, um die Order festzulegen,
        im Optimalfass wiederum sollte dies die Datenbank übernehmen...

        blablabla... Es ist egal, wenn es in der Aufgabenstellung so gewünscht wird, ist (fast)
        nichts einzuwenden :-)

        aus performancegründen?

        u.a. ich nenne es einfach "Stil". Der "Reihenfolgedefinitionsalgorithmus" sollte wenn
        möglich genauso der Datenbank überlassen werden, wie das Sortieren selber.

        ist aber eh nur intern für wenige mitarbeiter um eine todo-liste im netzt miteinander führen zu können...

        Eben, kein Problem :-)

        Viele Grüsse

        Philipp

        --
        RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
        Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
        1. hi phillip,

          macht jedenfalls sinn was du sagst, und ist somit menthal verarbeitet...

          schönen abend noch an dich und die anderen

          gru0ß ron

  4. hi,

    klickt man auf den link wird folgendes mitgegeben:
    dieseite.php?sortnummer="50"&move="runter"

    welchen sinn haben die anführungszeichen?

    btw, du hast das doch nicht etwa _so_ in den link geschrieben?
    <a href="dieseite.php?sortnummer="50"&move="runter"">...</a>

    dann wär's ja kein wunder, wenn es nicht so klappt wie du's dir vorstellst ...

    gruss,
    wahsaga

    1. ne da hab ich mich bloss verschrieben...

      btw, du hast das doch nicht etwa _so_ in den link geschrieben?
      <a href="dieseite.php?sortnummer="50"&move="runter"">...</a>

      gruß