Zweidimensionales Array vor Speicherung auf veränderte Datensätze überprüfen

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

  • Zweidimensionales Array vor Speicherung auf veränderte Datensätze überprüfen

    Hallo Boardies,

    mein erstes Posting hier und gleich ein dickes sorry(!) aber ich komme nicht weiter...

    Ich will überprüfen, ob Daten im Felder geändert wurden, wenn nicht sollen Sie nicht gespeichert werden.

    Wie kann ich überprüfen, ob etwas eingetragen wurde bzw. verändert wurde,
    d.h. es wurde beispielsweise nur etwas in deuNoteHalb[34] eingetragen, dann brauche ich ja nur diesen Satz zu speichern. Mit empty() könnte ich die leeren löschen, aber wie nur diese herausfiltern und was ist mit denen geänderten?

    Zweidimensionales Array (alles verkürzt auf zwei Dummivariablen, eigentlich 10-30)
    Formular - SQL Einlesen
    Code:
    $sql ="SELECT name, vorname, id FROM students WHERE klasse='$klasse' ORDER BY name";
    Formular - Felder
    Code:
    while ($row = mysql_fetch_assoc($result)) 
        { 
        echo "<tr><td>$nr</td>"; // jeweils Zeile eroeffnen
        foreach ($row as $key => $value) 
          {
          switch ($key) 
            {      
            case 'name':
            echo "<td><input type='text' name='name[]' value='$value' size='30' readonly='readonly'></td>\n"; break;
            case 'vorname':
            echo "<td><input type='text' name='vorname[]' value='$value' size='20' readonly='readonly'></td>\n"; break;
            case 'deuNoteHalb':
            echo "<td><input type='text' style='background-color:#d2d2d2' name='deuNoteHalb[]' value='$value' size='1'></td>\n"; break;
            
            }
          }
        $nr++;
        echo "</tr>"; // jeweils Zeile schliessen
        }
    vardump (verkürzte Ausgabe vom Formular):
    Code:
    array(6) { 
      ["name"]=> array(34) { [0]=> string(6) "ABANDO" [1]=> string(6) } 
      ["vorname"]=> array(34) { [0]=> string(5) "IÑIGO" [1]=> string(7) } 
      ["id"]=> array(34) { [0]=> string(3) "176"} 
    ["sqlAuswahlFach"]=> string(7) "Deutsch" }
    SQL-Satz
    Code:
     $sql = "UPDATE `students` SET `deuNoteHalb` = '".$_POST["deuNoteHalb"][$i]."'  WHERE `id` = '".$_POST["id"][$i]."';";
    Hoffe dass das übersichtlich ist.

    Gruß Tim

  • #2
    Fuege in das Formular noch fuer jeden Wert ein Hidden Field ein, gebe ihm den Namen "var_alt" und dann den entsprechenden Wert.

    Spaeter kannst du dann mit einer if Abfrage die Werte Gruppenweise vergleichen, und das Update eben nur dann ausfuheren wenn mindestens ein Wer geaendert wurde.

    Kommentar


    • #3
      Das einfachste ist nach meiner Meinung, alle zu ändern. Was macht es schon aus, wenn du einen Wert auf sich selber "updatest".
      Andernfalls gäbe es zwei Möglichkeiten:
      Einerseits könntest du alle änderbaren Variablen im Formular zusätzlich noch in einem "Hidden Field" speichern, nach dem Abschicken dann alle diese mit den Input-Feldern vergleichen und die geänderten Daten speichern.
      Die andere Möglichkeit ist, nach dem Abschicken die Daten jeweils nochmals aus der DB zu holen und diese dann mit den Input-Daten zu vergleichen.
      Ich gehe aber davon aus, dass beide Versionen nicht nur aufwändiger in der Programmierung sind, sondern vermutlich auch performance-mässig schlechter.
      Gruss
      H2O

      Kommentar


      • #4
        Original geschrieben von H2O
        alle zu ändern. Was macht es schon aus, wenn du einen Wert auf sich selber "updatest".
        Problem Zugriff von mehren Usern und Änderung gerade geänderter Daten (was mein zweites aber kleines Problem ist)!

        Einerseits könntest du alle änderbaren Variablen im Formular zusätzlich noch in einem "Hidden Field" speichern, nach dem Abschicken dann alle diese mit den Input-Feldern vergleichen und die geänderten Daten speichern.
        Das klingt interesant. Mit einer for-Schleife oder hast Du ein Bsp.?

        Die andere Möglichkeit ist, nach dem Abschicken die Daten jeweils nochmals aus der DB zu holen und diese dann mit den Input-Daten zu vergleichen.
        Auch hier wieder eine Schleife, die mich beim mehrdimensionalen Array echt umbringt!

        performance-mässig schlechter.
        Kein Problem, da Intranet-Anwendung.

        Kommentar


        • #5
          Original geschrieben von Timbob
          Problem Zugriff von mehren Usern und Änderung gerade geänderter Daten (was mein zweites aber kleines Problem ist)!
          Dann muesstest du sogar drei Werte vergleichen um sicher zu sein:

          Den alten Wert (der im Hidden field steht), den neuen im Formular geaenderten Wert und der Wert in der DB. Das ist aber im Grunde eher ein Problem von Zugriffsrechten.


          Das klingt interesant. Mit einer for-Schleife oder hast Du ein Bsp.?
          PHP-Code:
          for ($i$i count($_POST['name']; $i++)
          {
           if (
               
          $_POST['name[' $i ']'] != $_POST['name_alt[' $i ']'] ||
               
          $_POST['vorname[' $i ']'] != $_POST['vorname_alt[' $i ']'] ||
               
          $_POST['deuNoteHalb[' $i ']'] != $_POST['deuNoteHalb_alt[' $i ']']
               )
             {
                 
          // Update Anweisung
             
          }

          Kommentar


          • #6
            Original geschrieben von Timbob
            Problem Zugriff von mehren Usern und Änderung gerade geänderter Daten
            Dann bleibt wirklich nur die Lösung mit den Hidden-Fields. Die andere Version löst das auch nicht, da du dann bereits geänderte Daten aus der DB holst.
            Um dir aber detailierter helfen zu können, musst du schon etwas genauer sagen, was du willst. Geht es um mehrere Noten für einen Studenten, um einen Note für eine Studentin, oder um n Noten zu n StudentInnen? Kürzen finde ich immer gut, aber dein Beispiel mit nur einer veränderbaren Variablen ist vielleicht doch etwas zu kurz. Wie sieht deine DB-Struktur aus? Ich bin mir nicht einmal ganz sicher, ob du überhaupt einen mehrdimensionalen Array brauchst. ...
            Gruss
            H2O

            Kommentar


            • #7
              Original geschrieben von H2O
              Lösung...Hidden-Fields... Um dir aber detailierter helfen zu können, musst du schon etwas genauer sagen, was du willst.[/QUOTE]

              Formular
              // Zeilen des Formulars dynamisch erzeugen
              $nr=1;
              while ($row = mysql_fetch_assoc($result))
              {
              echo "<tr><td>$nr</td>"; // jeweils Zeile eroeffnen
              foreach ($row as $key => $value)
              {
              switch ($key)
              {
              case 'name':
              echo "<td><input type='text' name='name[]' value='$value' size='30' readonly='readonly'></td>\n"; break;
              case 'vorname':
              echo "<td><input type='text' name='vorname[]' value='$value' size='20' readonly='readonly'></td>\n"; break;

              case 'deuNoteHalb':
              echo "<td><input type='text' style='background-color:#d2d2d2' name='deuNoteHalb[]' value='$value' size='1'></td>\n"; break;
              case 'deuNoteHalbMuend':
              echo "<td><input type='text' name='deuNoteHalbMuend[]' value='$value' size='1'></td>\n"; break;
              case 'deuNoteHalbLesen':
              echo "<td><input type='text' style='background-color:#d2d2d2' name='deuNoteHalbLesen[]' value='$value' size='1'></td>\n"; break;
              case 'deuNoteHalbSchrei':
              echo "<td><input type='text' name='deuNoteHalbSchrei[]' value='$value' size='1'></td>\n"; break;
              case 'deuNoteHalbRechts':
              echo "<td><input type='text' style='background-color:#d2d2d2' name='deuNoteHalbRechts[]' value='$value' size='1'></td>\n"; break;
              case 'deuNoteHalbHand':
              echo "<td><input type='text' name='deuNoteHalbHand[]' value='$value' size='1'></td>\n"; break;

              case 'deuNoteEnd':
              echo "<td><input type='text' style='background-color:#d2d2d2' name='deuNoteEnd[]' value='$value' size='1'></td>\n"; break;
              case 'deuNoteMuend':
              echo "<td><input type='text' name='deuNoteMuend[]' value='$value' size='1'></td>\n"; break;
              case 'deuNoteLesen':
              echo "<td><input type='text' style='background-color:#d2d2d2' name='deuNoteLesen[]' value='$value' size='1'></td>\n"; break;
              case 'deuNoteSchrei':
              echo "<td><input type='text' name='deuNoteSchrei[]' value='$value' size='1'></td>\n"; break;
              case 'deuNoteRechts':
              echo "<td><input type='text' style='background-color:#d2d2d2' name='deuNoteRechts[]' value='$value' size='1'></td>\n"; break;
              case 'deuNoteHand':
              echo "<td><input type='text' name='deuNoteHand[]' value='$value' size='1'></td>\n"; break;

              case 'id':
              echo "<td><input type='hidden' name='id[]' value='$value'></td>\n"; break; // ID hidden; nicht sichtbar aber verarbeitbar

              }
              }
              $nr++;
              echo "</tr>"; // jeweils Zeile schliessen
              }
              }
              Der Code (18 Möglichkeiten):
              [QUOTE]switch ($_POST["sqlAuswahlFach"])
              {
              case 'Deutsch':
              for ($i = 0; $i < count($_POST["id"]); $i++)
              {
              $sql = "UPDATE `students` SET `deuNoteHalb` = '".$_POST["deuNoteHalb"][$i]."', `deuNoteHalbMuend` = '".$_POST["deuNoteHalbMuend"][$i]."', `deuNoteHalbLesen` = '".$_POST["deuNoteHalbLesen"][$i]."', `deuNoteHalbSchrei` = '".$_POST["deuNoteHalbSchrei"][$i]."', `deuNoteHalbRechts` = '".$_POST["deuNoteHalbRechts"][$i]."', `deuNoteHalbHand` = '".$_POST["deuNoteHalbHand"][$i]."', `deuNoteEnd` = '".$_POST["deuNoteEnd"][$i]."', `deuNoteMuend` = '".$_POST["deuNoteMuend"][$i]."', `deuNoteLesen` = '".$_POST["deuNoteLesen"][$i]."', `deuNoteSchrei` = '".$_POST["deuNoteSchrei"][$i]."', `deuNoteRechts` = '".$_POST["deuNoteRechts"][$i]."', `deuNoteHand` = '".$_POST["deuNoteHand"][$i]."' WHERE `id` = '".$_POST["id"][$i]."';";
              $result = mysql_query($sql) OR die(mysql_error());
              }
              echo "Die Daten wurden erfolgreich &uuml;bernommen.";
              mysql_close();
              break;[/CODE]


              mehrere Noten für einen Studenten, um einen Note für eine Studentin, oder um n Noten zu n StudentInnen? Kürzen finde ich immer gut, aber dein Beispiel mit nur einer veränderbaren Variablen ist vielleicht doch etwas zu kurz. Wie sieht deine DB-Struktur aus? Ich bin mir nicht einmal ganz sicher, ob du überhaupt einen mehrdimensionalen Array brauchst. ...
              mehre Noten und Bemerkungen (>40), mehrere Studenten (~500)


              Wie sieht deine DB-Struktur aus?
              eine Tabelle (bitte nicht hauen, aber das ist so übersichtlich...)
              482 Zeilen bei ca. 200 Feldern

              Gleichzeitiger Zugriff von max. 8 Usern also keine Performance Probleme :-)

              Danke für jeden Codetipp Tim

              Kommentar


              • #8
                Original geschrieben von Timbob
                eine Tabelle (bitte nicht hauen, aber das ist so übersichtlich...)
                482 Zeilen bei ca. 200 Feldern[/B]
                Zum hauen bist du wahrscheinlich zu weit weg. Eine Tabelle mit 200 Attributen! Das ist der pure Wahnsinn und keine Spur übersichtlich, da wahrscheinlich voller Redundanzen. Darum schilderst du wahrscheinlich auch die Struktur nicht. Ich wage zu behaupten, dass Jede tabell mit mehr als 10, vielleicht 15 Attributen, nicht normalisiert ist. Und ich mache jede Wette, dass du schon sehr bald wieder mit einem genau von dieser Unstruktur hervorgehenden Problem hier stehst. Aber was solls.
                Aber noch etwas anderes: Benutzer bitte PHP-Tags für deinen Code und rücke ihn anständig ein
                Un hier mal ein Vorschlag für die Formularseite, wenn schon dynamisch, dann aber ganz:
                PHP-Code:
                if(isset($_POST['go'])){
                    ....
                }
                else{
                    echo 
                "<table>";
                    echo 
                "<form method='post' action='" $_SERVER['PHP_SELF'] . "'>";
                    
                $res mysql_query($sql) || die(mysql_error());
                // Zeilen des Formulars dynamisch erzeugen
                    
                $nr 1;
                    while (
                $row mysql_fetch_assoc($result)){
                        echo 
                "<tr>" $nr++ . "</td>"// jeweils Zeile eroeffnen
                        
                foreach ($row as $key => $value){
                             echo 
                "<td><input name='{$key}[]' value='$value' size='30' />\n";
                             echo 
                "<input type='hidden' name='{$key}_alt[]' value='$value' /></td>\n";
                        }
                        echo 
                "<td><input type='hidden' name='id[]' value='" $row['id'] . "'></tr>"// jeweils Zeile schliessen
                    
                }
                    echo 
                "<tr><td colspan='20'><input type='submit' name='go' value='Speichern' /></td></tr>\n";
                }
                echo 
                "</form></table>"
                Zuletzt geändert von H2O; 15.01.2008, 14:52.
                Gruss
                H2O

                Kommentar


                • #9
                  Und hier, wie versprochen, noch die andere Hälfte:
                  PHP-Code:
                  if(isset($_POST['go'])){
                      
                  $keys array_keys($_POST);
                      
                  array_splice($keysarray_search('go'$keys), 1);  // Key von submit-Button löschen
                      
                  array_splice($keysarray_search('id'$keys), 1);  // Key von ID-Feldern löschen
                      
                  for ($i 0;$i count($_POST['id']);$i ++){
                          
                  $upd_ar = array();
                          foreach (
                  $keys as $key){
                              if (
                  preg_match('/_alt$/i'$key)) {continue;} // Vergleichswerte überspringen
                              
                  $idx $key "_alt";
                              
                  $v_neu $_POST[$key][$i];
                              
                  $v_alt $_POST[$idx][$i];
                              if (
                  $v_alt != $v_neu){
                                  
                  $upd_ar[] = "$key = '$v_neu'";
                              }
                          }
                          if (
                  count($upd_ar) > 0){
                              
                  $upd_str "UPDATE tabelle SET " implode(', '$upd_ar) . " WHERE id = " $_POST['id'][$i];
                              
                  mysql_query($upd_str) || die(mysql_error());
                          }
                      }
                  }
                  else{
                      
                  // Formular

                  Da sind sicher noch Fehler drin. Aber einfach so als Anhaltspunkt
                  Gruss
                  H2O

                  Kommentar

                  Lädt...
                  X