Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Dynamisches Formular + arrays

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Dynamisches Formular + arrays

    Hallo,
    ich benötige Eure Hilfe bei folgendem Problem:

    Ich habe ein Formular, dass per js erweitert werden kann.
    In diesem Formular soll der user beliebig viele felder anlegen können.
    Es wird nach dem Namen und per select nach dem typ gefragt.
    Nun sollen diese Felder in der Tabelle gespeichert werden.
    Nur weiß ich nicht, wie ich die beiden formlarfelder, also das inputfeld und das selectfeld übergeben und per foreach speichern soll.

    Hier mal das js-script:

    Code:
    <script type="text/javascript">
    var zeile = 1; // damit die erste nicht ueberschrieben wird..
    function zeileEinfuegen () 
    {
      var TR = document.getElementById("Tabelle").insertRow(zeile);
     
      var TD1 = document.createElement("td"); // erstes Feld
      var classTyp1 = document.createAttribute("class");
      classTyp1.nodeValue = "bestellText";
      TD1.setAttributeNode(classTyp1); // type=file 
      var TD1text = document.createTextNode("Datenfeld "+(zeile+1)+":");
      TD1.appendChild(TD1text);
      
      var TD2 = document.createElement("td"); // zweites Feld
      var TD2InputElement = document.createElement("input");
      var classTyp2 = document.createAttribute("class");
      classTyp2.nodeValue = "textfeldBestellInput";
      var fileTyp1 = document.createAttribute("type");
      fileTyp1.nodeValue = "text";
      var name1 = document.createAttribute("name");
      name1.nodeValue = "upload[]";  
      TD2InputElement.setAttributeNode(classTyp2); // type=file 
      TD2InputElement.setAttributeNode(fileTyp1); // type=file 
      TD2InputElement.setAttributeNode(name1); // name=..
      TD2.appendChild(TD2InputElement);
     
      var TD3 = document.createElement("td"); // drittes Feld
      var TD3SelectElement = document.createElement("select");
      TD3SelectElement.setAttribute('class','textfeldBestellInput');
      TD3SelectElement.setAttribute('name','upload[]');  
      optionarr = new Array ();
      optionarr[0] = new Object ();
      optionarr[0]["text"] = "Text";
      optionarr[0]["datei"] = "Datei";
        
      for (key in optionarr[0])
      {
       option = document.createElement ("option");
       option.setAttribute('class','textfeldBestellInput');
                
       option.value = key;
     
       option.appendChild (document.createTextNode (optionarr[0][key]));
       TD3SelectElement.appendChild (option);
      }
      TD3.appendChild(TD3SelectElement);
      
      TR.appendChild(TD1);
      TR.appendChild(TD2);
      TR.appendChild(TD3);  
      zeile += 1;
    }
    </script>
    Hier das HTML-Formular:
    Code:
    <td><form name="Formular" method="post" action="kundendatenfelder_speichern.php" class="textfeldBestell" style="margin-left:0">
                 <table id="Tabelle">
                  <tr>
                   <td class="bestellText">Datenfeld 1:</td>
                   <td><input type="hidden" name="artikel" value="<?=$artikel?>"><input class=textfeldBestellInput type="text" name="upload[]"></td>
                   <td><select size="1" name="upload[]"><option value="text">Text</option><option value="datei">Datei</option></select></td>
                  </tr>
                 </table>
                <input type="button" value="weitere Datenfelder" onclick="zeileEinfuegen()">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input name="speichern" type="submit" value="Datenfelder speichern">
                </form></td>
    lasse ich mir es ausgeben, erhalte ich folgendes:
    Array ( [artikel] => AÖ001 [upload] => Array ( [0] => Vorname [1] => text [2] => Nachname [3] => text [4] => Bilddatei [5] => datei ) [speichern] => Datenfelder speichern [typ] => datei )

    Ziel ist es bei einer Formlareingabe von z.B.:

    Feldname: Vorname - Typ: text
    Feldname: Nachname - Typ: text
    Feldname: Bilddatei - Typ: datei

    Dies so in die Tabelle zu schreiben:
    Feldname - Feldtyp
    Vorname - text
    Nachname - text
    Bilddatei - datei

    Dazu folgender Code:
    PHP-Code:
    foreach($_POST['upload'] as $felder
     {
      
    $res mysql_db_query($dbase"select feldname from $table where feldname = '$felder'");
      
    $num mysql_num_rows($res);
      for (
    $i=0$i<$num$i++)
       {
        
    $vorhanden mysql_result($res$i"feldname");
       }
      if (
    $vorhanden == '')
      {
          
    $sqlab "INSERT INTO $table ( `feldname` , `feldtyp` ) VALUES ('$felder', '$feldtyp')";
       
    mysql_db_query($dbase$sqlab);
      }
     } 
    Im Code frage ich ab, ob es das übergebene Feld gibt, wenn nicht erzeuge ich es. Das funktioniert auch, wenn ich nur das Inputfeld abfrage, jedoch soll ja das Selectfeld auch mit erzeugt werden. Das müsste, glaube ich, mit mehrdimensionalen Arrays funktionieren, jedoch habe ich keine Ahnung, wie ich dies erzeugen und und einer Schleife auswerten soll.

    Bitte um Hilfe, DANKE.


  • #2
    [...]jedoch habe ich keine Ahnung, wie ich dies erzeugen und und einer Schleife auswerten soll[...]
    Das sind aber eigentlich Grundlagen, die man beherrschen sollte. http://www.php.de/php-einsteiger/489...nsammlung.html

    Kommentar


    • #3
      Ich habe jetzt das Array mit den Inputfeldern "feldname" statt upload genannt, und ein zweites Array mit den Selectfeldern "feldtyp" erzeugt.

      Dann erhalte ich folgende Ausgabe:

      Array ( [feldname] => Array ( [0] => Vorname [1] => Nachname [2] => Bilddatei ) [feldtyp] => Array ( [0] => text [1] => text [2] => datei ) )

      Nun müsste im Code der Speicherung nun diese beiden arrays irgendwie miteinander verknüpft werden. Kann mir jemand dabei bitte helfen, oder habt ihr eine bessere Idee?

      Kommentar


      • #4
        Gleiche Indizes gehören zusammen...

        $_POST['feldname'][0] <=> $_POST['feldtyp'][0]
        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

        Kommentar


        • #5
          Zitat von lstegelitz Beitrag anzeigen
          Gleiche Indizes gehören zusammen...

          $_POST['feldname'][0] <=> $_POST['feldtyp'][0]
          Wenn Du mir jetzt noch sagen würdest, wie ich dies umsetzen soll, wäre ich echt dankbar. Ich weiß ja nicht, wieviel im array steckt.

          Kommentar


          • #6
            Zitat von Leinberger Beitrag anzeigen
            Ich weiß ja nicht, wieviel im array steckt.
            Doch: [MAN]count[/MAN]
            @fschmengler - @fschmengler - @schmengler
            PHP Blog - Magento Entwicklung - CSS Ribbon Generator

            Kommentar


            • #7
              Zitat von Leinberger Beitrag anzeigen
              Wenn Du mir jetzt noch sagen würdest, wie ich dies umsetzen soll, wäre ich echt dankbar. Ich weiß ja nicht, wieviel im array steckt.
              foreach() ist das relativ egal wie viel drin steckt...

              Du durchläufst die Namen und da die Indizes gleich sind kannst du mit dem Schlüssel des Namens den dazugehörigen Typ aus $_POST['feldtyp'] ermitteln.
              "Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".

              Kommentar


              • #8
                Zitat von Dark Guardian Beitrag anzeigen
                foreach() ist das relativ egal wie viel drin steckt...

                Du durchläufst die Namen und da die Indizes gleich sind kannst du mit dem Schlüssel des Namens den dazugehörigen Typ aus $_POST['feldtyp'] ermitteln.

                Hört sich, für mich, sehr gut an.
                Habe folgendes geändert:

                PHP-Code:
                foreach($_POST['feldname'] as $felder
                 {
                  
                $res mysql_db_query($dbase"select feldname from $table where feldname = '$felder'");
                  
                $num mysql_num_rows($res);
                  for (
                $i=0$i<$num$i++)
                   {
                    
                $vorhanden mysql_result($res$i"feldname");
                   }
                  if (
                $vorhanden == '')
                  {
                      
                $feldnamekey array_keys($_POST['feldname']);
                      
                $sqlab "INSERT INTO $table ( `feldname` , `feldtyp` ) VALUES ('$felder', '$_POST[feldtyp][$feldnamekey]')";
                   
                mysql_db_query($dbase$sqlab);
                  }
                 } 
                Jedoch schreibt er mir in die DB nun als feldtyp "Array[]" rein.

                Kommentar


                • #9
                  Zitat von Leinberger Beitrag anzeigen
                  Jedoch schreibt er mir in die DB nun als feldtyp "Array[]" rein.
                  Erstmal:

                  PHP-Code:
                  foreach($_POST['feldname'] as $felder
                  ändern in:

                  PHP-Code:
                  foreach($_POST['feldname'] as $key => $felder
                  Ist der erste Punkt, so sparst du dir das array_keys. Davon abgesehen das du array_keys falsch verwendest. Schau mal im Manual nach was die Funktion zurück gibt...

                  Zweitens:

                  PHP-Code:
                  "INSERT INTO $table ( `feldname` , `feldtyp` ) VALUES ('$felder', '$_POST[feldtyp][$feldnamekey]')"
                  Ist auch unschön. Besser und übersichtlicher geht es so:

                  PHP-Code:
                  "INSERT INTO $table ( `feldname` , `feldtyp` ) VALUES ('".$felder."', '".$_POST['feldtyp'][$key]."')"
                  Auch wenn in " gesetzte Variablen geparsed werden würde ich diese durch String-Verkettung einbetten und nicht einfahc in den String schreiben. Dann kannst du auch problemlos Array-Schlüssel in ' setzen.
                  "Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".

                  Kommentar


                  • #10
                    Und zu guter Letzt: [man]mysql_real_escape_string[/man] verwenden, um SQL-Injection zu verhindern.
                    @fschmengler - @fschmengler - @schmengler
                    PHP Blog - Magento Entwicklung - CSS Ribbon Generator

                    Kommentar


                    • #11
                      Zitat von Dark Guardian Beitrag anzeigen
                      Erstmal:

                      ...
                      Vielen Dank, jetzt funktioniert es. Nochmals DANKE.

                      Kommentar


                      • #12
                        [MAN]mysql_num_rows[/MAN] find ich aber persönlich auch nicht so gut, weil sich die Funktion ähnlich verhält wie wenn ich per foreach oder Ähnlichem hochzähle. Wenn da nen paar hundert Datensätze von der Datenbank zurückkommen, macht sich das im Skript selber schon bemerkbar...
                        Code:
                        SELECT COUNT(PRIMARY_KEY) [ WHERE ]
                        würde ich dem Ganzen vorziehen.

                        Kommentar

                        Lädt...
                        X