[PHP5] Rang Funktion

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

  • [PHP5] Rang Funktion

    Hallo,

    Ich hab mir etwas zusammen geschustert was nicht wirklich funktioniert. Habe die Schleife auch durch ein exit; gestoppt damit der mir die Ausgabe liefert.

    Hier erstmal das Script was durch ein Button ausgeführt wird.

    PHP-Code:
    if (isset($_POST['hoch'])){
    $kat=$_POST['kat'];
    $id=$_POST['id'];
    $rang=$_POST['rang'];
    $rangtmp "$rang";
    // Mysql connect     
        
    $sql2 "SELECT * FROM download";
           
    $result2 mysql_query($sql2) OR die(mysql_error());
        while(
    $row2 mysql_fetch_assoc($result2)) 
        {
        
    $id2 $row2['id'];
        
    $rang2 $row2['rang'];
        
    $rangtmp-1;
        if (
    $rangtmp == "$rang2"){
        echo 
    "stimmt";
        echo 
    "<br>";
        echo 
    "Aktueller Rang.$rang";
        echo 
    "<br>";
        echo 
    "Aktuell gezählter Rang.$rangtmp";
        echo 
    "<br>";
        echo 
    "Rang der ersetzt wird.$rang2";
        exit;
        
    mysql_query ("UPDATE download SET rang='$rang' WHERE id='$id2'");
        
    mysql_query ("UPDATE download SET rang='$rang2' WHERE id='$id'");
        }

    was in meinen Kopf nicht rein will ist das "$rangtmp-1;" nicht eins weniger zählt. denn wenn er das macht würde er sich nicht immer gleich selbst finden.

    Oder ist das Script fürn ...... ^^
    Wie kann ich das sonst realisieren das ich ein rang austauschen kann?

    mfg
    Ashton

  • #2
    $rangtmp-1; ist Blödsinn.

    $rangtmp = $rangtmp-1; muss es heißen. Das gehört zu den Grundlagen der Sprache!

    Ebenso ist es immer falsch, wenn man "$rang" schreibt. $rang ist eine Variable, es hat keinen Sinn, sie in einen String zu packen um sie zu vergleichen oder zuzuweisen.

    Kommentar


    • #3
      Original geschrieben von onemorenerd
      keinen Sinn, sie in einen String zu packen um sie zu vergleichen oder zuzuweisen.
      Ausser es geht um eine Zuweisung als Teil eines Strings.
      PHP-Code:
      echo "Aktueller Rang.$rang"
      ist das allerdings auch nicht
      PHP-Code:
      // entweder
      echo "Aktueller Rang" $rang;
      // oder
      echo "Aktueller Rang $rang"
      Gruss
      H2O

      Kommentar


      • #4
        Hallo,

        oki ^^ nun geht schon mehr als vorher. Aber es funktioniert nur wenn der rang um 1 bei einenander liegt. also ränge gibt es zur zeit nur 15, 14 und 1. von 15 auf 14 gehts ohne weiteres nur von 14 auf 1 gehts nicht als würde die Schleife nicht weiter arbeiten.

        PHP-Code:
        if (isset($_POST['hoch'])){
        $kat=$_POST['kat'];
        $id=$_POST['id'];
        $rang=$_POST['rang'];
        $rangtmp "$rang";
        $rangtmp $rangtmp-1;
        // Mysql connect    
            
        $t=0
            
        $sql2 "SELECT * FROM download";
               
        $result2 mysql_query($sql2) OR die(mysql_error());
            
        $anzahl mysql_num_rows($result2);
            while(
        $row2 mysql_fetch_assoc($result2)) 
            {
            
        $t++;
            if(
        $t == $anzahl){
            
        $rangtmp $rangtmp-1;
            
        $t=0;
            }
            
        $id2 $row2['id'];
            
        $rang2 $row2['rang'];
            if (
        $rangtmp == $rang2){
            
        mysql_query ("UPDATE download SET rang='$rang' WHERE id='$id2'");
            
        mysql_query ("UPDATE download SET rang='$rang2' WHERE id='$id'");
            }

        Die Ausgabe hatte ich vorher noch drin habe ich entfernt
        Habe durch mysql_num_rows die anzahl datensätze rausgefunden und diese lasse ich durch $t vergleichen funktioniert auch aber leider läuft die while schleife nicht weiter. oder macht auf jeden fall kein vergleich mehr ^^.

        mfg
        Ashton

        Kommentar


        • #5
          $rangtmp = $rangtmp-1;
          Oder gleich
          PHP-Code:
          $rangtmp--; 
          Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

          [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
          Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

          Kommentar


          • #6
            Hoppla^^

            PHP-Code:
            if (isset($_POST['hoch'])){
            $kat=$_POST['kat'];
            $id=$_POST['id'];
            $rang=$_POST['rang'];
            $rangtmp "$rang";
            $rangtmp--;
            // Mysql connect    
                
            $t=0
                
            $sql2 "SELECT * FROM download";
                   
            $result2 mysql_query($sql2) OR die(mysql_error());
                
            $anzahl mysql_num_rows($result2);
                while(
            $row2 mysql_fetch_assoc($result2)) 
                {
                if(
            $t == $anzahl){
                
            $rangtmp--;
                
            $t=0;
                }
                
            $id2 $row2['id'];
                
            $rang2 $row2['rang'];
                if (
            $rangtmp == $rang2){
                echo 
            "stimmt";
                echo 
            "<br>";
                echo 
            "Aktueller Rang".$rang;
                echo 
            "<br>";
                echo 
            "Aktuell gezählter Rang".$rangtmp;
                echo 
            "<br>";
                echo 
            "Rang der ersetzt wird".$rang2;
                exit;
                
            mysql_query ("UPDATE download SET rang='$rang' WHERE id='$id2'");
                
            mysql_query ("UPDATE download SET rang='$rang2' WHERE id='$id'");
                }
                
            $t++;

            Das $t++; sollte auch am ende der schleife stehen sonst vergisst der ja etwas ^^

            naja leider funktioniert die schleife bei grösseren sprüngen wie von rang 14 auf 1 nicht. bei rang 15 auf 14 geht des ohne weiteres.

            Kann mir einer sagen wodran das liegen kann?

            Kommentar


            • #7
              Wieso ist rang in deiner Tabelle ein Stringtyp? Informiere dich mal über SQL-Injections. Und erkläre bitte, was das eigentlich werden soll. Ich vermute, dass das auch mit WHERE in der SELECT-Query und ohne Schleife machbar ist.

              Kommentar


              • #8
                Original geschrieben von onemorenerd
                Wieso ist rang in deiner Tabelle ein Stringtyp? Informiere dich mal über SQL-Injections. Und erkläre bitte, was das eigentlich werden soll. Ich vermute, dass das auch mit WHERE in der SELECT-Query und ohne Schleife machbar ist.
                Über SQL-Injections werde ich mich jetzt erkundigen.

                Worum es geht ist folgendes ich habe eine Download Bank und nun möchte ich die Kategorien ordnen. Dies soll mit einer Art Rang System gemacht werdeb.

                DB hat id, Kategorie und rang als felder.

                diese werde angelegt und sollen wenn nötig geordnet werden. das geschieht über einen Button der das auslöst. (Hoch und Runter)

                auf Knopf Druck Hoch soll der rang abgesucht welcher der nächst niedrigere ist.

                rang 15, 14 und 1 existieren. Dazwischen die habe ich gelöscht.

                von rang 15 auf 14 gehts ohne weiteres aber wenn ich von rang 14 auf 1 möchte das klappt dies nicht wie ich denke müsste das an der while Schleife liegen sehe aber das Problem nicht.

                edit: Laut http://de.wikipedia.org/wiki/SQL-Injektion und einigen Foren Einträgen soll verhindert werden das die Seite fehlermeldungen ausspruckt die für den User nicht erkennbar machen soll wo die Lücke ist. Oder habe ich das falsch verstanden?

                Also soll ich in der SQL Connection bei or die ( 'Meine Persöhnliche Fehlermeldung reinschreiben' ); gleiche bei ftp funktionen etc.? also wo eine Verbindung aufgebaut wird?

                Weiss einer wie ich das Script zum laufen bekomme?

                mfg
                Ashton
                Zuletzt geändert von Ashton; 30.04.2008, 14:53.

                Kommentar


                • #9
                  So schwer ist es doch nicht ...

                  Wenn der Button "hoch" gedrückt wurde, ist die Verschiebung "-1", wenn es "runter" war, dann "+1". Andere Buttons gibt es nicht.

                  PHP-Code:
                  if (isset($_POST['hoch'])) {
                      
                  $offset = -1;
                  } elseif (isset(
                  $_POST['runter'])) {
                      
                  $offset = +1;
                  } else die(
                  'Fehler!'); 
                  Nun wird das Element um $offset verschoben. Dabei können folgende Fälle eintreten:
                  1) Die neue Position ist durch ein anderes Element belegt. Die beiden tauschen also die Plätze.
                  2) Die neue Position ist kleiner als 0.
                  3) Die neue Position ist größer als die Anzahl der Elemente.

                  Beachte: Es kann nicht passieren, dass die neue Position unbelegt ist, da ich von einer lückenlosen Liste ausgehe.

                  Die beiden letzten Fälle könnte man mit einem Fehler quittieren, da man ein Element an erster/letzter Position nicht noch weiter nach oben/unten verschieben kann. Idealerweise gibt es gar keine Buttons dafür.
                  Falls du das nicht möchtest, gibt es nur eine Alternative: Wenn das erste/letzte Element nach oben/unten verschoben wird, setzt du es ganz an den Anfang bzw. ganz ans Ende. Darauf gehe ich jetzt aber mal nicht weiter ein. Ich halte das ohnehin nicht für besonders benutzerfreundlich.

                  Bleibt also nur Fall 1 und der ist denkbar einfach.
                  Sei $id = intval($_POST['id']) und $offset wie oben beschrieben.

                  UPDATE download SET rang = rang + ($offset) WHERE id = $id
                  schiebt das Element nach oben oder unten. Jetzt befinden sich zwei Elemente an der selben Position. Das zweite, welches vorher schon dort war, schiebst du nun auf den alten Platz des gerade eben verschobenen Elements. Klingt kompliziert, die Query ist aber ganz einfach:
                  UPDATE download SET rang = rang - ($offset)
                  WHERE rang IN (SELECT rang + ($offset) FROM download WHERE id = $id) AND id != $id

                  Der SELECT-Teil in Klammern besorgt lediglich den Wert von rang, den gerade beide Elemente haben. Mit id != $id wird sichergestellt, dass von den beiden das richtige Element ausgewählt wird.


                  Alle Angaben ohne Gewähr. Ich habe das gerade einfach so runtergeschrieben. Gewöhnlich vertue ich mich dabei bei den Offsets. Aber das wirst du ja merken.


                  SQL-Injection hast du noch nicht richtig kapiert. Es geht darum, dass man niemals unegprüft Benutzereingaben in SQL-Queries einbauen sollte. Der Benutzer könnte nämlich Dinge eingeben, die den Sinn der Query verändern. Google noch ein bisschen und lies noch ein paar Artikel dazu.
                  Tipp: Numerische Werte kann man mit intval() putzen, Strings mit mysql_real_escape_string().
                  Übrigens bin ich oben davon ausgegangen, dass die Spalte rang numerisch ist. Das ist bei dir im Moment noch nicht so, solltest du aber dahingehend ändern.
                  Zuletzt geändert von onemorenerd; 30.04.2008, 16:24.

                  Kommentar

                  Lädt...
                  X