Ankündigung

Einklappen
Keine Ankündigung bisher.

UPDATE mit selben Namensbezeichnung der Felder

Einklappen

Neue Werbung 2019

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

  • UPDATE mit selben Namensbezeichnung der Felder

    Hallo zusammen,

    ich lasse mir über folgenden Code meine DB Felder ausgeben:

    PHP-Code:
    echo '<form action="" method="post">';


    while(
    $fetch mysqli_fetch_assoc($result)) {

        
    $id $fetch["ID"];
        
    $component_group $fetch["component_group"];
        
    $component_subgroup $fetch["component_subgroup"];
        
    $description $fetch["description"];
        
    $dimension $fetch["dimension"];
        
    $color $fetch["color"];
        
    $material $fetch["material"];
        
    $surface $fetch["surface"];
        
    $feature $fetch["feature"];



        echo 
    '<input type="hidden" name="ID" value="'.$id.'" />';

        echo 
    '<div class="col-md-1">';
                echo 
    '<div class="frmSearch col-md-1"><input type="text" name="componentgroup" class="component-group" readonly value="'.$component_group.'" /><div class="component-group-suggestion-box"></div></div>';
        echo 
    '</div>';

         echo 
    '<div class="col-md-1">';
                echo 
    '<div class="frmSearch col-md-1"><input type="text" name="componentsubgroup" class="component-subgroup" readonly value="'.$component_subgroup.'" /><div class="component-subgroup-suggestion-box"></div></div>';
        echo 
    '</div>';

        echo 
    '<div class="col-md-2">';
                echo 
    '<textarea>'.$description.'</textarea>';
        echo 
    '</div>';

        echo 
    '<div class="col-md-2">';
                echo 
    '<textarea>'.$dimension.'</textarea>';
        echo 
    '</div>';

        echo 
    '<div class="col-md-1">';
                echo 
    '<input value="'.$color.'"">';
        echo 
    '</div>';

        echo 
    '<div class="col-md-1">';
                echo 
    '<input value="'.$material.'"">';
        echo 
    '</div>';

        echo 
    '<div class="col-md-1">';
                echo 
    '<input value="'.$surface.'"">';
        echo 
    '</div>';

        echo 
    '<div class="col-md-1">';
                echo 
    '<input value="'.$feature.'"">';
        echo 
    '</div><div style="clear:both"></div><br><br>';


    }


        echo 
    '<input type="submit" name="submit" value="Speichern"></form>'
    Insgesamt sind es zwei Datensätze, die diese Abfrage ausspuckt. Meine Datensätze haben nun natürlich beim input feld identische "name" Attribute, etwa "componentgroup".

    Meine erste Frage bzw. Vermutung ist: Ich brauche wohl unterschiedliche "name" Attribute, um eine Änderung in dem Feld wieder korrekt in die DB zu schreiben?

    Wahrscheinlich ergibt sich hier nun auch das Folgeproblem: Wie update ich dynamisch nur die IDs an, die ausgegeben werden? Wenn ich nämlich das WHERE ID = ? in meinem UPDATE query weg lasse, aktualisiert es mir alle Felder in der Datenbank. Ich möchte aber natürlich nur die IDs aktualisiert haben, die hier auch ausgegeben werden.

    Mein UPDATE Query lautet übrigens:

    PHP-Code:
        if(isset($_POST['submit'])) {
            
    $valueone $_POST['componentgroup'];
            
    $valuethree $_POST['ID'];

            
    $absenden $conn->prepare("UPDATE bicycle_parts SET component_group_fk = ?");
            
    $absenden->bind_param('s'$valueone);
            
    $absenden->execute();

        } 
    Vielen Dank schon einmal!

  • #2
    Durch das anhängen von "[]" an das "name" Attribut deines Inputs erhälst du ein Array, Bspl: name="ID[]". Einfach mal per var_dump($_POST) ausgeben lassen. Das Update musst du dann entsprechend für jeden gelieferten Datensatz durchlaufen (1x prepare, x-Mal bind/execute).
    [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

    Kommentar


    • #3
      Wenn man HTML-Code außerhalb der PHP-Tags schreibt, spart man sich übrigens so eine echo-Orgie und der Code wird deutlich lesbarer.

      Außerdem sollten Werte nie direkt in HTML-Code eingefügt werden, sondern immer mit htmlspecialchars() escaped werden.

      Kommentar


      • #4
        Zitat von invers.square Beitrag anzeigen

        Meine erste Frage bzw. Vermutung ist: Ich brauche wohl unterschiedliche "name" Attribute, um eine Änderung in dem Feld wieder korrekt in die DB zu schreiben?
        Auf jeden Fall. Ich versuche möglichst durchgehend mit Arrays zu arbeiten und dabei gleiche Namen für die Formularelemente (input) und die Datenbankfelder zu verwenden. Oder anders gesagt, ein auftrödeln in Einzelvariablen a.la.
        PHP-Code:
            $material $fetch["material"];
            
        $surface $fetch["surface"];
            
        $feature $fetch["feature"]; 
        zu vermeiden.
        Was da im $_POST reinkommt, sollte PHP-seitig validiert werden. Dafür nutze ich eine Klasse, welche prüft und filtert. Mittels Array wird festgelegt, welche Komponenten gefiltert werden (Schlüssel) und wie die einzelnen Komponenten geprüft werden sollen (Values):
        PHP-Code:
        $filter = array(
          
        'material' => 'meterialcheck',
          
        'surface' => "NOT_EMPTY_STRING"

        }
        $newValues $validator->validateArray($_POST$filter); 
        Wenn alle Prüfungen ok sind, ist in $newValues ein Array mit den Schlüsseln aus $filter das im Idealfall schon direkt für eine Aktualisierung der Datenbank per PDO genutzt werden kann.
        Schlägt die Prüfung fehl, liefert die Klasse entsprechende Fehlermeldungen. Das Formular wird dann mit der Fehlermeldung noch einmal ausgegeben und damit der Nutzer nicht alles nochmal neu eintippeln muss, werden die Felder mit den letzten Eingaben versorgt. Dafür verwende ich ein kleine Templateklasse. Dort haben die Platzhalter für die values wieder die selben Namen wie der Element-Name.
        HTML-Code:
        <input type="text" id="material" name="material" value="{{material}}"  />
        Beim Erstaufruf wird dann einfach der assign-Methode das Resultarray der Datenbankabfrage übergeben, nach Eingabefehlern das Post-Array (Das wichtige escapen wird automatisch von der Klasse erledigt).

        Nun, das soll keine Anleitung für ein "Best practice" sein. Andere Wege führen auch nach Rom.
        Nimm nur soviel mit, möglichst viel mit Arrays zu arbeiten.

        LG jspit



        Kommentar


        • #5
          Die Sache ist allerdings die, dass ich am Ende nicht weiß, wie viele Datensätze ausgegeben werden - das ist unterschiedlich. x-Mail bind/execute wäre ja nicht dynamisch. Oder verstehe ich Dich grade falsch?

          Kommentar


          • #6
            Wenn komplett eine DB-Tabelle angezeigt + editiert werden soll, dann mache ich das meist 2-Stufig.
            1. Formular : Anzeige als Tabelle mit Auswahlmöglichkeit des Datensatzes zum Bearbeiten. Danach hab ich eine id des Datensatzes. Die muss ich für die weitere Bearbeitung mitschleppen.
            2. Formular : Anzeige aller Felder des Datensatzes mit Möglichkeit der Bearbeitung (darauf beziehe ich mich in #4).

            Kommentar


            • #7
              Lustigerweise hatte ich zuerst das öffnende und schließende <form> tag sowie den submit button in der while Schleife drinnen. Dementsprechend würde dann für jeden Datensatz ein Speicherbutton erscheinen - dass würde dann so ähnlich funktionieren, ohne dass der UPDATE Query dann zu wild wird. Ich glaube fast, so werde ichs machen. Bin noch Anfänger und das scheint mir gerade die produktivste Lösung zu sein.

              Kommentar


              • #8
                Jetzt hätte ich aber doch noch eine Frage zum UPDATE Query: da die values der input Felder natürlich Strings sind, möchte ich aber nur den Fremschlüssel des Strings in die Tabelle schreiben.
                Wie forumuliere ich denn da das Query? Ich weiß, dass ich wieder JOINS anwenden muss, mir ist aber nicht ganz klar, in welchem Teil ich component_group_fk mit der Tabelle component_group joine.
                Hier nochmal das Query:
                PHP-Code:
                UPDATE bicycle_parts SET component_group_fk = ? WHERE ID = ? 

                Kommentar


                • #9
                  Warum bekommst du den Fremdschlüssel nicht über das Formular?
                  [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

                  Kommentar


                  • #10
                    Das verstehe ich jetzt leider nicht ganz? Habe in meinem SELECT Query die Tabellen so gejoint, dass im Formular natürlich die Strings angezeigt werden und nicht die Fremdschlüssel...

                    Kommentar


                    • #11
                      Ja, aber warum? Wenn du die Fremdschlüssel haben willst, dann nimm halt die. Das hält dich ja nicht davon ab, ZUSÄTZLICH die Strings mit auszugeben.
                      [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

                      Kommentar

                      Lädt...
                      X