Ankündigung

Einklappen
Keine Ankündigung bisher.

Updaten mehrerer Datensätz gleichzeitig,

Einklappen

Neue Werbung 2019

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

  • Updaten mehrerer Datensätz gleichzeitig,

    Hallo liebe PHPler,

    im Rahmen einer Projektarbeit (Auftragserfassung und Darstellung) und als PHP-Anfänger habe ich folgendes Problem:

    Ich lassen mir mehrere Datensätze in einer Tabelle anzeigen und kann sie dort ändern.
    Die geänderten Datensätze werden mit post an ein weiteres PHP-Script übergeben und sollen dann in der Datenbank (xampp) geupdatet werden.
    Leider wird nur der letzte Datensatz geupdatet, der Rest bleibt wie er ist.
    Natürlich habe ich schon im Netz recherchiert und bin auf "foreach-Schleifen" gestoßen, allerdings hapert es bei mir mit der Umsetzung und wäre für jede Hilfe dankbar.

    Hier der PHP-Code, der die Datenbank updaten soll:

    PHP-Code:
    <?php
        $con 
    mysqli_connect("""root""""bde_sigma");
        
    $res mysqli_query($con"SELECT * FROM auftrag WHERE auftrag_fertig='o' ORDER BY auftrag_id ASC");
        
    $sql "UPDATE auftrag SET "

         
    " liefertermin ='" $_POST["liefertermin"] . "',"
         
    " daten = '" $_POST["daten"] . "',"
         
    " daten_vorlage = '" $_POST["daten_vorlage"] . "',"
         
    " freigabe ='" $_POST["freigabe"] . "',"
         
    " platten ='" $_POST["platten"] . "',"
         
    " papier ='" $_POST["papier"] . "',"
         
    " 440_dm = '" $_POST["440_dm"] . "',"
         
    " 440_fertig = '" $_POST["440_fertig"] . "',"
         
    " 529_dm = '" $_POST["529_dm"] . "',"
         
    " 529_fertig = '" $_POST["529_fertig"] . "',"
         
    " 229_dm = '" $_POST["229_dm"] . "',"
         
    " 229_fertig = '" $_POST["229_fertig"] . "',"
         
    " gto_dm = '" $_POST["gto_dm"] . "',"
         
    " gto_fertig = '" $_POST["gto_fertig"] . "',"
         
    " status = '" $_POST["status"] . "',"
         
    " ohz = '" $_POST["ohz"] . "',"
         
    " hubstanze = '" $_POST["hubstanze"] . "',"
         
    " falzen = '" $_POST["falzen"] . "',"
         
    " sammelhefter = '" $_POST["sammelhefter"] . "',"
         
    " fremdarbeit = '" $_POST["fremdarbeit"] . "',"
         
    " konfektionieren = '" $_POST["konfektionieren"] . "',"
         
    " bemerkung_auftrag = '" $_POST["bemerkung_auftrag"] . "'"
         
    " WHERE auftrag_id = " $_POST["oripn"];


       
    mysqli_query($con$sql);
            echo 
    $sql'<br> <br>';
       
    $num mysqli_affected_rows($con);
            if(
    $num 0) echo "
                    <nav>
                        <img src='images/logo_sigma_druck_400x123.png' width='400' height='123' alt='Sigma Druck'/>
                            <ul>
                                <li><a href='index.html'>
    $num Datensatz geändert - Startseite</a></li>
                            </ul>
                    </nav>"
    ;
       else         
       echo 
    "

                    <nav>
                        <img src='images/logo_sigma_druck_400x123.png' width='400' height='123' alt='Sigma Druck'/>
                            <ul>
                                <li><a href='index.html'>Keine Änderung - Startseite</a></li>
                            </ul>
                    </nav>"
    ;

       
    mysqli_close($con);
    ?>
    Vielen Dank und Grüße!


  • #2
    Post ja irgendwie escapen, bevor man das in sql jagt.
    https://mariadb.com/kb/en/library/in...te-key-update/

    Kommentar


    • #3
      Das aktualisiert dir einen Datensatz mit der Id aus dem Feld origin.
      PHP-Code:
      ...WHERE auftrag_id " . $_POST["oripn"] 
      Das übernehmen der Parameter ohne Validierung/Maskierung sollte man zudem niemals machen, da es eine Sicherheitslücke ist.
      Wenn du mehrere Datensätze hasst, die du in einem Formular ausfüllst und überträgst, dann hast du auch mehrere Ids.

      Zeige mal das entsprechende Formular dazu, wenn man dir den Weg weisen soll, denn so kann man dazu keine weitere Aussage machen.

      Kommentar


      • #4
        Zitat von protestix Beitrag anzeigen
        Das aktualisiert dir einen Datensatz mit der Id aus dem Feld origin.
        PHP-Code:
        ...WHERE auftrag_id " . $_POST["oripn"] 
        Das übernehmen der Parameter ohne Validierung/Maskierung sollte man zudem niemals machen, da es eine Sicherheitslücke ist.
        Wenn du mehrere Datensätze hasst, die du in einem Formular ausfüllst und überträgst, dann hast du auch mehrere Ids.

        Zeige mal das entsprechende Formular dazu, wenn man dir den Weg weisen soll, denn so kann man dazu keine weitere Aussage machen.
        Vielen Dank für deinen Ratschlag...
        Hier das Formular:

        PHP-Code:
        <?php

        $con 
        mysqli_connect("""root""""bde_sigma");
        mysqli_query($con"SET * 'utf8'");
        $res mysqli_query($con"SELECT * FROM auftrag WHERE auftrag_fertig='o' ORDER BY auftrag_id ASC");

        echo 
        "<table class='m30'>
                <thead>
                    <tr class='zebra'>
                        <th>Nr.</th>
                        <th>Kunde</th>
                        <th>Bezeichung</th>
                        <th>Auflage</th>
                        <th>Termin</th>
                        <th>SB</th>
                        <th>Vorstufe</th>
                        <th>✓</th>
                        <th>P</th>
                        <th>Druck</th>
                        <th></th>
                        <th>✓</th>
                        <th>FO</th>
                        <th>FA</th>
                        <th>Zeit</th>
                        <th>Status</th>
                        <th>ZY</th>
                        <th>HS</th>
                        <th>FM</th>
                        <th>SH</th>
                        <th>FA</th>
                        <th>KF</th>
                        <th>Bemerkung</th>
                    </tr>
                </thead>"
        ;

             while (
        $zeile mysqli_fetch_assoc($res))

           {
                foreach (
        $zeile as $k=>$v){
                if  (
        $zeile[$k] == "x"   ){
                    
        $zeile[$k] = "checked";
                    }            }

                echo 
        "<form action = 'aenderung_auftragsuebersicht.php' method = 'post'>";
                echo 
        "<tr class='zebra'>";
                echo 
        "<td>".$zeile["auftrag_id"] . "</td>";
                echo 
        "<td>"$zeile["kunde"] . "</td>";
                echo 
        "<td>"$zeile["bezeichnung"] . "</td>";
                echo 
        "<td>"$zeile["auflage"] . "</td>";
                echo 
        "<td>"."<input type='text' name='liefertermin' value='".date("d.m.Y",strtotime($zeile['liefertermin']))."'></td>";
                echo 
        "<td>"$zeile["sachbearbeiter"] . "</td>";
                echo 
        "<td>Daten<br>Vorlage<br>Freigabe<br>Platten</td>";
                echo 
        "<td>" ."<input type ='hidden' name='daten' value='o' " $zeile["daten"] . "><input type='checkbox' name='daten'  value='x' " $zeile["daten"] . ">""<br>" ."<input type ='hidden' name='daten_vorlage' value='o' " $zeile["daten_vorlage"] . "><input type='checkbox' name='daten_vorlage'  value='x' " $zeile["daten_vorlage"] . ">""<br>" ."<input type ='hidden' name='freigabe' value='o' " $zeile["freigabe"] . "><input type='checkbox' name='freigabe'  value='x' " $zeile["freigabe"] . ">""<br>" ."<input type ='hidden' name='platten' value='o' " $zeile["platten"] . "><input type='checkbox' name='platten'  value='x' " $zeile["platten"] . ">""</td>";
                echo 
        "<td>"."<input type ='hidden' name='papier' value='o' " $zeile["papier"] . "><input type='checkbox' name='papier'  value='x' " $zeile["papier"] . ">"."</td>";
                echo 
        "<td>440<br>529<br>229<br>GTO</td>";
                echo 
        "<td>" ."<input type ='hidden' name='440_dm' value='o' " $zeile["440_dm"] . "><input type='checkbox' name='440_dm'  value='x' " $zeile["440_dm"] . ">""<br>"."<input type ='hidden' name='529_dm' value='o' " $zeile["529_dm"] . "><input type ='checkbox' name='529_dm' value='x' " $zeile["529_dm"] . ">""<br>"."<input type ='hidden' name='229_dm' value='o' " $zeile["229_dm"] . "><input type ='checkbox' name='229_dm' value='x' " $zeile["229_dm"] . ">""<br>"."<input type ='hidden' name='gto_dm' value='o' " $zeile["gto_dm"] . "><input type ='checkbox' name='gto_dm' value='x' " $zeile["gto_dm"] . ">""</td>";
                echo 
        "<td>" ."<input type ='hidden' name='440_fertig' value='o' " $zeile["440_fertig"] . "><input type='checkbox' name='440_fertig'  value='x' " $zeile["440_fertig"] . ">""<br>"."<input type ='hidden' name='529_fertig' value='o' " $zeile["529_fertig"] . "><input type='checkbox' name='529_fertig'  value='x' " $zeile["529_fertig"] . ">""<br>"."<input type ='hidden' name='229_fertig' value='o' " $zeile["229_fertig"] . "><input type='checkbox' name='229_fertig'  value='x' " $zeile["229_fertig"] . ">""<br>"."<input type ='hidden' name='gto_fertig' value='o' " $zeile["gto_fertig"] . "><input type='checkbox' name='gto_fertig'  value='x' " $zeile["gto_fertig"] . ">""</td>";
                echo 
        "<td>"$zeile["440_formen"] . "<br>"$zeile["529_formen"] . "<br>"$zeile["229_formen"] . "<br>"$zeile["gto_formen"] . "</td>";
                echo 
        "<td>"$zeile["440_farbe"] . "<br>"$zeile["529_farbe"] . "<br>"$zeile["229_farbe"] . "<br>"$zeile["gto_farbe"] . "</td>";
                echo 
        "<td>".date("H:i",strtotime($zeile['440_zeit'])) . "<br>" .date("H:i",strtotime($zeile['529_zeit'])) . "<br>".date("H:i",strtotime($zeile['229_zeit'])) . "<br>" .date("H:i",strtotime($zeile['gto_zeit'])) . "</td>";
                echo 
        "<td>"."<input type='text' name='status' value='" $zeile["status"] . "'></td>";
                echo 
        "<td>"."<input type ='hidden' name='ohz' value='o' " $zeile["ohz"] . "><input type='checkbox' name='ohz' value='x' " $zeile["ohz"] . ">".""."<input type ='hidden' name='ohz_fertig' value='o' " $zeile["ohz_fertig"] . "><input type='checkbox' name='ohz_fertig' value='x' " $zeile["ohz_fertig"] . ">"."</td>";

                echo 
        "<td>"."<input type ='hidden' name='hubstanze' value='o' " $zeile["hubstanze"] . "><input type='checkbox' name='hubstanze' value='x' " $zeile["hubstanze"] . ">".""."<input type ='hidden' name='hubstanze_fertig' value='o' " $zeile["hubstanze_fertig"] . "><input type='checkbox' name='hubstanze_fertig' value='x' " $zeile["hubstanze_fertig"] . ">"."</td>";

                echo 
        "<td>"."<input type ='hidden' name='falzen' value='o' " $zeile["falzen"] . "><input type='checkbox' name='falzen' value='x' " $zeile["falzen"] . ">".""."<input type ='hidden' name='falzen_fertig' value='o' " $zeile["falzen_fertig"] . "><input type='checkbox' name='falzen_fertig' value='x' " $zeile["falzen_fertig"] . ">"."</td>";

                echo 
        "<td>"."<input type ='hidden' name='sammelhefter' value='o' " $zeile["sammelhefter"] . "><input type='checkbox' name='sammelhefter' value='x' " $zeile["sammelhefter"] . ">".""."<input type ='hidden' name='sammelhefter_fertig' value='o' " $zeile["sammelhefter_fertig"] . "><input type='checkbox' name='sammelhefter_fertig' value='x' " $zeile["sammelhefter_fertig"] . ">"."</td>";
                echo 
        "<td>"."<input type ='hidden' name='fremdarbeit' value='o' " $zeile["fremdarbeit"] . "><input type='checkbox' name='fremdarbeit' value='x' " $zeile["fremdarbeit"] . ">".""."<input type ='hidden' name='fremdarbeit_fertig' value='o' " $zeile["fremdarbeit_fertig"] . "><input type='checkbox' name='fremdarbeit_fertig' value='x' " $zeile["fremdarbeit_fertig"] . ">"."</td>";
                echo 
        "<td>"."<input type ='hidden' name='konfektionieren' value='o' " $zeile["konfektionieren"] . "><input type='checkbox' name='konfektionieren' value='x' " $zeile["konfektionieren"] . ">".""."<input type ='hidden' name='konfektionieren_fertig' value='o' " $zeile["konfektionieren_fertig"] . "><input type='checkbox' name='konfektionieren_fertig' value='x' " $zeile["konfektionieren_fertig"] . ">"."</td>";
                echo 
        "<td>"."<input type='text' name='bemerkung_auftrag' value='" $zeile["bemerkung_auftrag"] . "'></td>
                </tr>"
        ;
                 echo 
        "<input type='hidden' name='oripn' value='" $zeile["auftrag_id"] . "'>";
            }
            echo 
        "</table>";


                    echo 
        "<p><input type='submit' value='Änderung speichern'>";
                    echo 
        "</p>";
            
        mysqli_close($con);
            
        ?>

        Kommentar


        • #5
          Hier hast du dein foreach
          PHP-Code:
           foreach ($zeile as $k=>$v){ 
          Damit gibst du mehrere Datensätze aus und so musst du auch die Datensätze aktualisieren.

          Du machst da aber einen Fehler
          PHP-Code:
          "<input type='hidden' name='oripn' value='" $zeile["auftrag_id"] . "'>"
          Übertragen werden die Parameter mit Wertepaaren Schlüssel´=>Wert. Der Name des Schlüssels ist name, hier beispielsweise origin.
          Da du aber mehrere Datensitze hast musst dieser Schlüssel kein einzelner Wert sein sondern mehrere, also nimmt man ein Array.
          Ein Array macht man daraus in dem man im HTML eckige Klammern dahinter setzt.
          name='origin[]', hier wird die Feldnummer des Arrays vom Browser automatisch vergeben.
          oder
          name='origin[1]', hier ist die Feldnummer des Arrays hardcodiert und damit festgelegt.

          Im PHP Script stehen diese Daten dann als Array in der Variablen $_POST['origin'].

          Siehe auch:
          http://php.net/manual/de/faq.html.php#faq.html.arrays
          https://www.askingbox.de/tipp/php-fo...kript-schicken

          Kommentar


          • #6
            Hallo protestix,

            erst einmal vielen Dank für deine Hilfe. Leider bin ich noch nicht ganz erfolgreich gewesen.
            Sobald ich die Werte in einem Array übergebe, erhalte ich folgeden Meldung: "Array to string conversion in"
            Mittels var_dump($_POST['oripn']) und echo $sql lasse ich mir die Arrays und die SQL-Anweisung ausgeben, dass sieht dann so aus:

            array(13) { [0]=> string(6) "180001" [1]=> string(6) "180002" [2]=> string(6) "180003" [3]=> string(6) "180006" [4]=> string(6) "180007" [5]=> string(6) "180008" [6]=> string(6) "180009" [7]=> string(6) "180010" [8]=> string(6) "180011" [9]=> string(6) "180012" [10]=> string(6) "180013" [11]=> string(6) "180014" [12]=> string(6) "181511" }

            UPDATE auftrag SET liefertermin ='2018-11-20', daten = 'x', daten_vorlage = 'x', freigabe ='x', platten ='x', papier ='x', 440_dm = 'x', 440_fertig = 'x', 529_dm = 'x', 529_fertig = 'x', 229_dm = 'o', 229_fertig = 'o', gto_dm = 'o', gto_fertig = 'o', status = '', ohz = 'o', hubstanze = 'o', falzen = 'x', sammelhefter = 'x', fremdarbeit = 'x', konfektionieren = 'x', bemerkung_auftrag = '' WHERE auftrag_id = Array

            So wie es aussieht würde doch jetzt jedes Array die gleichen Daten übergeben bekommen (wenn es funktionieren würde), oder? Muss ich also jede Variable als Array übergeben?





            Kommentar


            • #7
              WHERE auftrag_id = Array
              Das geht so natürlich nicht.
              Id erwartet eine Zahl und übergibst ein Array.
              Du musst also das Array Feld für Feld durchgehen und dir die Werte rausziehen. Übelicherweise macht man das mit foreach
              PHP-Code:
              $id_array = array("180001""180002""180003""180006");

              foreach (
              $id_array as $key=>$value) {
                  
              $sql "UPDATE auftrag SET liefertermin ='2018-11-20', ... , bemerkung_auftrag = '' WHERE auftrag_id = $value";

              Jetzt hast du nur 2 Probleme zusätzlich. Zum Einen bekommt hier jeder Datensatz die gleichen Werte zugewiesen, also hier zum Beispiel alle den Liefertermin auf 2018-11-20 gesetzt, auch wenn du im Formular diesen geändert hast.
              Zum Anderen brauchst du für jede Aktualisierung den vollen Durchlauf zur DB, was langsam ist.
              Bei solchen Konstrukten ist man mit prepared statements besser bedient, zumal dann auch keine SQL Sicherheitslücke entsteht.

              Du brauchst aber in jedem Fall zu allen Werten im Formular ein Array.

              Kommentar

              Lädt...
              X