Subfader: Variable Anzahl an identischen Inserts aus Formular heraus

Ich weiß wie es generell funktionert {Values (1,2), (3,4), (5, 6)] so ist nicht :)

Ich habe aber ein Formular mit einem kleinen Inputfeld in dem man die Anzahl eingeben kann, wie oft der gleiche Eintrag vorgenommen werden soll.

Formular (Auszug da ohne Anzahl funktioniert):
...Input für title, content
<input type="text" name="times" rows="1" size="2"> Input für Anzahl
...Submit

Action:
if ($_POST['times'] == NULL)
   {$times = array_keys(1)} else {$times = array_keys($_POST['times'])
$sql = "INSERT INTO table ( title, content) VALUES
foreach ($times) {
  ("".$_POST['title']."", "".$_POST['content']."")
  }
";

Wenn "times" 0 ist soll der Eintrag nur 1 mal erfolgen. Das "array_keys" ist sicher völlig falsch, hab ich woanders kopiert.

Für Hilfe wäre ich dankbar.

Gruß

  1. Hi,

    if ($_POST['times'] == NULL)
       {$times = array_keys(1)} else {$times = array_keys($_POST['times'])
    $sql = "INSERT INTO table ( title, content) VALUES
    foreach ($times) {
      ("".$_POST['title']."", "".$_POST['content']."")
      }
    ";

    Wenn "times" 0 ist soll der Eintrag nur 1 mal erfolgen. Das "array_keys" ist sicher völlig falsch, hab ich woanders kopiert.

    Schon das foreach ist an dieser Stelle voellig falsch - weil du dich an der Stelle in einem Textstring befindest, und da sind das eben nur die Buchstaben f, o, r, e, a, c und h hintereinander als Stringinhalt.

    Wenn dir also noch Grundwissen ueber Umgang mit Strings fehlt, dann schlage ich vor, du faengst hier an zu lesen:
    http://www.php.net/manual/en/language.types.string.php

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
    1. Gut das war falsch. Dachte halt wegen VALUES (1,2), (3,4), (5, 6).
      Ich weiß halt nicht wie ich die sql $times mal loopen soll.

      if ($_POST['times'] == NULL)
         {$times = array_keys(1)} else {$times = array_keys($_POST['times']}
      foreach (...) {
      $sql = "INSERT INTO table ( title, content) VALUES
      ("".$_POST['title']."", "".$_POST['content']."")";
      }

      1. Hi,

        Gut das war falsch. Dachte halt wegen VALUES (1,2), (3,4), (5, 6).
        Ich weiß halt nicht wie ich die sql $times mal loopen soll.

        Wenn du einfach nur das, was hinter obigem VALUES steht dynamisch in einer Schleife zusammensetzen willst - dann mach das doch.

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
        1. Ich will das aber $times mal machen. Z.B. für $times = 4 entspräche VALUES (1,2), (1,2), (1,2), (1,2)
          Nun weiß ich aber nicht wie. Statt foreach versuche ich mich nun an

          for ($i=0; $i<=$_POST['times']; $i++ ) {
          $sql = ...
          }

          Ist syntaxtechnisch natürlich auch wieder falsch ;)

          1. Hi,

            Ich will das aber $times mal machen. Z.B. für $times = 4 entspräche VALUES (1,2), (1,2), (1,2), (1,2)
            Nun weiß ich aber nicht wie. Statt foreach versuche ich mich nun an

            for ($i=0; $i<=$_POST['times']; $i++ ) {
            $sql = ...
            }

            Ist syntaxtechnisch natürlich auch wieder falsch ;)

            Na ja, du solltest $sql dabei nicht in jedem Durchgang ueberschreiben, sondern einen Wert anhaengen.

            for statt foreach ist schon mal eine gute Wahl, wenn du etwas eine bestimmte Anzahl mal machen willst.
            Den Wert von $_POST['times'] solltest du dann aber noch auf Vorhandensein und Gueltigkeit pruefen, sonst kann das auch huebsch krachen an der Stelle.

            MfG ChrisB

            --
            „This is the author's opinion, not necessarily that of Starbucks.“
            1. echo $begrüßung;

              Den Wert von $_POST['times'] solltest du dann aber noch auf Vorhandensein und Gueltigkeit pruefen, sonst kann das auch huebsch krachen an der Stelle.

              Und vor allem kontextspezifisch behandeln, sonst kracht das per SQL-Injection noch viel mehr.

              echo "$verabschiedung $name";

              1. Hi,

                echo $begrüßung;

                Den Wert von $_POST['times'] solltest du dann aber noch auf Vorhandensein und Gueltigkeit pruefen, sonst kann das auch huebsch krachen an der Stelle.

                Und vor allem kontextspezifisch behandeln, sonst kracht das per SQL-Injection noch viel mehr.

                Ja, das gilt dann fuer die anderen Werte, die als Daten in der Query landen sollen. times war ja hier nur fuer die Laufweite der Schleife gedacht.

                MfG ChrisB

                --
                „This is the author's opinion, not necessarily that of Starbucks.“
                1. (Hab oben falsche Nachricht beantwortet.)
                  Danke für die Hinweise zu $times, ich hätte als erstes aber gerne den loop zum laufen gebracht :)
                  Nächster Versuch:

                  $times = $_POST['times']; //check kommt später
                  for ($i=1; $i<=$times; $i++ ) {
                    $title   = $_POST['title'];
                    $content = $_POST['content'];
                       $i = "INSERT INTO adding ( title, content) VALUES (
                               '".$title."',
                               '".$content."'
                               )";
                  ...$result = mysql_query($i)...

                  Wird nur 1 mal hinzugefügt.

                  $times: default hätte ih gern nichts im times input (dann $times=1). der check klappt nicht so recht:
                  if ($_POST['times'] == NULL) {$times = 1} else {$times = $_POST['times']}

                  1. Hi,

                    Nächster Versuch:

                    Was hat denn der jetzt noch mit dem urspruenglichen Ansatz zu tun?
                    Jetzt willst du ja doch mehrfach INSERT-Queries absetzen, statt das passende SQL-Statement zu generieren, das mehrere in einem Rutsch einfuegt.

                    Wird nur 1 mal hinzugefügt.

                    Dann kontrolliere deinen Scriptverlauf - bspw. durch eine Kontrollausgabe innerhalb der Schleife, "ich bin gerade im x. Durchlauf".

                    Und wenn du eine Query an die Datenbank abgesetzt hast - dann kontrolliere anschliessend auch deren Erfolg.
                    Betrachtung des Rueckgabewertes von mysql_query und ggf. davon abhaengig Ausgabe von mysql_error() sind dazu das mindeste.

                    $times: default hätte ih gern nichts im times input (dann $times=1). der check klappt nicht so recht:
                    if ($_POST['times'] == NULL) {$times = 1} else {$times = $_POST['times']}

                    Dann kontrollierst du natuerlich zunaechst mal, ob der Wert NULL ueberhaupt dem uebergebenen entspricht.
                    var_dump bietet sich zur Kontrolle von Variableninhalten an, da es zusaetzlich zum Inhalt auch noch den Typ anzeigt.

                    MfG ChrisB

                    --
                    „This is the author's opinion, not necessarily that of Starbucks.“
                    1. Ich konntrolliere das schon, füge aber hier nicht jedesmal den ganzen Rattenschwanz ein...
                      Ich dachte halt ich darf nichts innerhalb von $sql bedingen. Ok also doch values loopen?

                      $sql = "INSERT INTO adding (title, content) VALUES
                         for ($i=1; $i<=$times; $i++ )
                           {
                            ('".$_POST['title']."', '".$_POST['content']."')
                           }
                      ";

                      So ist $i undefined. Im obrigen beispiel mit for { $sql hat er wenigstens einmal eingefügt. :/

                      1. Hi,

                        Ich dachte halt ich darf nichts innerhalb von $sql bedingen.

                        Innerhalb eines String sind weitere PHP-Konstrukte wie Schleifen wirkungslos - weil sie dort eben keine Befehlswoerter, sondern reiner Text sind.

                        Aber es zwingt dich niemand, "alles in einem" zu schreiben - Strings kann man durchaus auch aus mehreren Teilen zusammensetzen. Und deshalb sagte ich dir ja auch bereits, *beschaeftige* dich bitte damit ...

                        MfG ChrisB

                        --
                        „This is the author's opinion, not necessarily that of Starbucks.“
                        1. tue ich das nicht die ganze zeit? ich suche sicher nicht 10 stunden lang rum um festzustellen es muss sonstawie heißen, wenn mir jemand freundliches auch schnell die lösung posten kann. dazu sind hilfeforen ja da. ist ja nicht so dass ich noch nichtmal code habe und sage "ich will das und das wer shreibt mir das?" sondern ich habe meinen problemcode konkret geschildert, nur fehlt mir eben der korrekte befehl.
                          auch wenn ich syntaktisch einiges sicher falsch mache, komme ich trptzdem mit google & trial & error über die runden.
                          ich durchforste jetzt sicher nicht ganz php.net nach dem korrekten befehl wenn ich gar nicht weiß wo ich ansetzen soll.

                          1. Hi,

                            ist ja nicht so dass ich noch nichtmal code habe und sage "ich will das und das wer shreibt mir das?" sondern ich habe meinen problemcode konkret geschildert, nur fehlt mir eben der korrekte befehl.

                            Nein, dir fehlt kein korrekter Befehl, sondern grundlegendes Wissen ueber die Syntax.

                            ich durchforste jetzt sicher nicht ganz php.net nach dem korrekten befehl wenn ich gar nicht weiß wo ich ansetzen soll.

                            Ich habe dir bereits einen konkreten Link an die Hand gegeben, und auch geschrieben, wie du dein Vorhaben umsetzen kannst.

                            Jetzt sollte also mal wieder ein bisschen was von deiner Seite kommen.

                            MfG ChrisB

                            --
                            „This is the author's opinion, not necessarily that of Starbucks.“
                            1. Da bin wohl an den falschen geraten hier, aber ging mir schon vorher so. Die Hilfe ist gleich null hier. Sorry aber das Forum wäre schon tot wenn jeder nur den Obermacker spielen und antworten würde:
                              "Tja, tut mir leid, aber du hast keine Ahnung. Wir helfen nur bei Profiproblemen. Beschäftige dich gefälligst mit dem Thema. Frag erst wieder wenn du die Lösung hast".

                              Macht das Forum doch einfach zu, dann braucht ihr euch nicht mehr mit den verdammten Anfängern rumschlagen.

                              Nein, dir fehlt kein korrekter Befehl, sondern grundlegendes Wissen ueber die Syntax.

                              Learning by doing trial & error. Ist zeitaufwendiger aber geht voran.

                              Jetzt sollte also mal wieder ein bisschen was von deiner Seite kommen.

                              Hättest wohl gerne. Hab die Lösung be Yahoo!Answers als Antwort auf ne dumme Frage gefunden. Sorry für dei kommenden Googler die hier landen. Aber so funktioniert das Forum hier.

            2. Danke für die Hinweise zu $times, ich hätte als erstes aber gerne den loop zum laufen gebracht :)
              Nächster Versuch:

              $times = $_POST['times']; //check kommt später
              for ($i=1; $i<=$times; $i++ ) {
                $title   = $_POST['title'];
                $content = $_POST['content'];
                   $i = "INSERT INTO adding ( title, content) VALUES (
                           '".$title."',
                           '".$content."'
                           )";
              ...$result = mysql_query($i)...

              Wird nur 1 mal hinzugefügt.

              $times: default hätte ih gern nichts im times input (dann $times=1). der check klappt nicht so recht:
              if ($_POST['times'] == NULL) {$times = 1} else {$times = $_POST['times']}

              1. Hi,

                bitte antworte an *einer* Stelle im Thread, anstatt mehrfach das gleich zu posten.

                MfG ChrisB

                --
                „This is the author's opinion, not necessarily that of Starbucks.“