nested sets "Ersatz". Denkfehler?!

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • nested sets "Ersatz". Denkfehler?!

    Guten Morgen *gäääähn*
    Kann sein, dass ich mal wieder übermüdet bin (wie fast immer), aber ich stelle trotzdem mein Problem vor:

    Also, ich code momentan sowas wie 'n Forum. Natürlich nicht professionelles (eher zur übung), denn ich scheiter ja schon an so kleinen sachen:

    so in etwa siehts im admin bereich aus, wo man die position der foren ändern kann.

    forum1 +/- (pos = 1)
    forum2 +/- (pos = 2)
    forum3 +/- (...)
    forum4 +/-
    forum5 +/-

    wenn man jetzt zb forum 1 und 2 vertauschen will, also man zb bei forum2 auf das "+" klickt sollte es so aussehen:

    forum2 +/- (pos = 1)
    forum1 +/- (pos = 2)
    forum3 +/- (...)
    forum4 +/-
    forum5 +/-

    es wird also nur das feld "pos" verändert - theoretisch.
    aber irgendwie bin ich grad zu blöd.

    hab das so gemacht:
    beim erstellen des forums, wird mysql_num_rows "gemacht" und einfach "pos" des neuen forums auf mysql_num_rows++ gesetzt.
    das ist aber verdammt kacke...

    der "+-link":
    PHP-Code:
    <a href='index.php?s=forum&do=pos2&move=up&pos=$d[pos]'>+</a
    das was passiert:
    PHP-Code:
            case "pos2":
                
    $pos $_GET['pos'];
                
    $move $_GET['move'];
                
                if(
    $move == "up") {
                    
    $oben $pos 1;
                    
    $a mysql_query("UPDATE $tabelle SET pos='$oben' WHERE pos='$pos'");
                    
    $a2 mysql_query("UPDATE $tabelle SET pos='$pos' WHERE pos='$oben'");

    das tolle an der sachees klappt nicht 
                    
    if(($a) AND ($a2)) echo "funzt";
                    else echo 
    mysql_error();
                } 


    Würd mich über ein paar Anregungen freuen!
    Werde jetzt pennen gehen und von den Antworten träumen, danke!

    Nacht!
    Lasst euch nicht lumpen, hoch den Humpen!

  • #2
    Hier ist ein Denkfehler drin.

    PHP-Code:
    $a mysql_query("UPDATE $tabelle SET pos='$oben' WHERE pos='$pos'");
    $a2 mysql_query("UPDATE $tabelle SET pos='$pos' WHERE pos='$oben'"); 
    Wenn Du die einzelnen Datensätze über ihre Position identifizierst, dann musst Du auch sichergehen, dass das Feld Unique ist. Nach Deiner ersten Update Query (a) gibt es aber zwei Datensätze, die in der WHERE Abfrage gefunden werden. Du kannst das mal anhand von mysql_affected_rows() nachvollziehen.

    Also enweder Du identifizierst die Datensätze über ihre Id, was sicherlich die beste Lösung ist oder Du machtst das mit einer temporären Position (-1) oder so.

    PHP-Code:
    $a0 mysql_query("UPDATE $tabelle SET pos='-1' WHERE pos='$oben'");
    $a1 mysql_query("UPDATE $tabelle SET pos='$oben' WHERE pos='$pos'");
    $a2 mysql_query("UPDATE $tabelle SET pos='$pos' WHERE pos='-1'"); 
    Noch ein zwei Dinge:

    Ist pos ein Text Feld? Warum? Eine Position ist doch eine Zahl, also nimm auch ein Integer Feld.

    Diese Idee mit mysql_num_rows++ ist nicht gut. Damit musst Du immer Sorge tragen, dass die Positionen Deiner Foren ein stetiges Interval bilden. Bei Änderungen wie dem Löschen eines Forums musst Du dann einen Haufen Datensätze ändern.

    Gruß,

    Felix
    --
    ...with www.zeec.de, the addictive mobile media blog by:

    EYETRIBE GmbH i.Gr.
    http://www.eyetribe.com

    Kommentar


    • #3
      Genau das ist mein Problem!
      Wie würdest du/ihr da vor gehen?
      Ich muss ihm irgendwie sagen, dass er beim klick aufs "+" zum nächst Höheren springen soll und nicht einfach +1/-1 ... oder?
      Nur wie mach ich das?
      Lasst euch nicht lumpen, hoch den Humpen!

      Kommentar


      • #4
        PHP-Code:
        +1:

        $sql "SELECT pos FROM $tabelle WHERE pos > $pos ORDER BY pos ASC LIMIT 0,1";
        $result mysql_query($sql);
        if (
        $result && $row mysql_fetch_assoc($result))
        {
            
        $oben $row['pos'];
            
            
        $a0 mysql_query("UPDATE $tabelle SET pos='-1' WHERE pos='$oben'");
            
        $a1 mysql_query("UPDATE $tabelle SET pos='$oben' WHERE pos='$pos'");
            
        $a2 mysql_query("UPDATE $tabelle SET pos='$pos' WHERE pos='-1'");
        }

        -
        1:

        $sql "SELECT pos FROM $tabelle WHERE pos < $pos ORDER BY pos DESC LIMIT 0,1";
        $result mysql_query($sql);
        if (
        $result && $row mysql_fetch_assoc($result))
        {
            
        $unten $row['pos'];
            
            
        $a0 mysql_query("UPDATE $tabelle SET pos='-1' WHERE pos='$unten'");
            
        $a1 mysql_query("UPDATE $tabelle SET pos='$unten' WHERE pos='$pos'");
            
        $a2 mysql_query("UPDATE $tabelle SET pos='$pos' WHERE pos='-1'");

        --
        ...with www.zeec.de, the addictive mobile media blog by:

        EYETRIBE GmbH i.Gr.
        http://www.eyetribe.com

        Kommentar


        • #5
          Danke! Genau das ist es! Uhhhhhhhhh weeeeeeeeee
          Zuletzt geändert von carapau; 12.04.2006, 01:37.
          Lasst euch nicht lumpen, hoch den Humpen!

          Kommentar


          • #6
            Klar geht das. Allerdings hängt das davon ab, welchen Datentyp Du für "pos" gewählt hast.
            --
            ...with www.zeec.de, the addictive mobile media blog by:

            EYETRIBE GmbH i.Gr.
            http://www.eyetribe.com

            Kommentar


            • #7
              Man bist du schnell Hatte Beitrag doch eben erst editiert ..
              Ich Idiot hab per Copy&Past deinen Teil eingefügt und vergessen die var $tabelle anzupassen. *an kopf klatsch*

              Hast mir echt geholfen - danke nochmal!
              Lasst euch nicht lumpen, hoch den Humpen!

              Kommentar


              • #8
                De rien
                --
                ...with www.zeec.de, the addictive mobile media blog by:

                EYETRIBE GmbH i.Gr.
                http://www.eyetribe.com

                Kommentar

                Lädt...
                X