Herwig: formular-einträge per schleife in mysql-db ??

hallo,

ich habe folgendes problem: ich möchte alle einträge aus meinem formular per while-schleife in meine db packen, und zwar in eine db-reihe.

wenn ich das mit INSERT INTO mache, bekomme ich logischerweise in der db für jeden formularwert eine neue db-zeile, in der dann nur ein wert des formulars eingetragen ist. ich könnte es natürlich mit UPDATE umgehen, aber es soll ja tatsächlich EIN neuer eintrag entstehen. muß ich da noch eine variable in der schleife dazwischenschalten, oder wie funktioniert so etwas?

hier mein code:

$formular = $_GET['form'];
if (is_array ($formular)) {

while (list($name,$wert) = each($formular)) {

mysql_query("INSERT INTO design ($name) VALUES ('$wert')");

}

}

  1. Hi,

    ich habe folgendes problem: ich möchte alle einträge aus meinem formular per while-schleife in meine db packen, und zwar in eine db-reihe.

    wenn ich das mit INSERT INTO mache, bekomme ich logischerweise in der db für jeden formularwert eine neue db-zeile, in der dann nur ein wert des formulars eingetragen ist.

    Dann setze die einzelnen Werte halt einfach vor dem INSERT in einer Schleife zu _einem_ Wert zusammen.

    MfG ChrisB

  2. echo $begrüßung;

    wenn ich das mit INSERT INTO mache, bekomme ich logischerweise in der db für jeden formularwert eine neue db-zeile, in der dann nur ein wert des formulars eingetragen ist. ich könnte es natürlich mit UPDATE umgehen, aber es soll ja tatsächlich EIN neuer eintrag entstehen. muß ich da noch eine variable in der schleife dazwischenschalten, oder wie funktioniert so etwas?

    Mit dem EVA-Prinzip. Erst Eingabe, dann Verarbeitung, dann Ausgabe.

    hier mein code:
    $formular = $_GET['form'];

    Immer wieder gern genommen aber jedes Mal unsinnig ist diese Umkopieraktion. $_GET['form'] ist bereits eine Variable, die man überall verwenden kann.

    if (is_array ($formular)) {

    Wenn du schon prüfst, dann mach es richtig. Prüfe zunächst, ob $_GET['form'] überhaupt existiert, statt einfach lesend darauf zuzugreifen. Ein auf E_ALL gestelltes error_reporting machte dich im Fehlerfall mit einer Hinweismeldung auf diesen unzulässigen Zugriff aufmerksam.

    if (isset($_GET['form']) and is_array($_GET['form']))

    while (list($name,$wert) = each($formular)) {

    Eine zwar funktionierende Form, aber seit es foreach gibt eine veraltete.

    foreach ($_GET['form'] as $name => $wert)

    mysql_query("INSERT INTO design ($name) VALUES ('$wert')");

    INSERT gibt es auch in der Ausführung mit SET feldname=wert, ...
    Außerdem ist es nicht sehr clever, seine Abfrage direkt und ungeprüft aus den vom Client gesendeten Werten zusammenzubauen. Zunächst wird eine Liste der erlaubten Felder benötigt:

    $allowed_fieldnames = array('feld1', 'feld2', 'feld3'); // muss vor das foreach

    Dann prüfen wir die übergebenen Felder gegen diese Liste:

    if (!in_array($name, $allowed_fieldnames))

    Eigentlich können wir in dem Fall abbrechen. Wenn schon jemand falsche Felder mitsendet sind die Daten der anderen Felder sicher auch nicht gewünscht.

    Und nun fehlt noch die Funktion mysql_real_escape_string(), die bestimmte Zeichen in den eingegebenen Werte MySQL-gerecht aufbereitet, und die Zusammensetzung des Statements. Insgesamt sieht das so aus:

    if (isset($_GET['form']) and is_array($_GET['form'])) {
      $allowed_fieldnames = array('feld1', 'feld2', 'feld3');

    // hier werden die Felder und Werte gesammelt, bevor sie in das Statement eingebaut werden
      $set_values = array();

    foreach ($_GET['form'] as $name => $wert) {
        if (!in_array($name, $allowed_fieldnames)) {
          // gegebenenfals abbrechen
        } else {
          $set_values[] = $name . '=' . mysql_real_escape_string($wert);
        }
      }
      if (empty($set_values)) {
        // Fehler, keine gültigen Felder übergeben.
        // Möglicherweise ist auch noch eine Prüfung sinnvoll,
        // die sicherstellt, dass alle Felder enthalten vorhanden sind.
      } else {
        $sql = 'INSERT INTO table SET ' . implode(',', $set_values);
        if (!mysql_query($sql, $connection))
          // MySQL-Fehler ...
      }
    }

    echo "$verabschiedung $name";

    1. hallo nochmal,

      whow!

      vielen dank erstmal, da kann ich viel lernen!

      ich habs jetzt auch versucht umzusetzten, aber leider bekomme ich keine query zustande. bis zum aufbau des arrays $set_values scheints zu klappen- er wird mit echo $set_values[0]; angezeigt.

      ich poste mal den code. findest du einen fehler?

      vielen dank nochmal!

      <?php
        error_reporting(E_ALL);
      $conn = mysql_connect("server","bn","pw");
      if ($conn)
          {
           if(mysql_select_db("datenbank",$conn))
        {

      if (isset($_GET['form']) and is_array($_GET['form'])) {

      // hier werden die Felder und Werte gesammelt, bevor sie in das Statement eingebaut werden
        $set_values = array();

      foreach ($_GET['form'] as $name => $wert) {

      $set_values[] = $name . '=' . mysql_real_escape_string($wert);
      echo $set_values[0];
          }

      $sql = "INSERT INTO formdesign SET" . implode(',', $set_values);
          if (!mysql_query($sql, $conn)){
            echo "keine query möglich!";}// MySQL-Fehler ...
      }

      }

      else{
      echo"ui";
          }
        }
      ?>

      1. echo $begrüßung;

        ich poste mal den code. findest du einen fehler?
            $sql = "INSERT INTO formdesign SET" . implode(',', $set_values);

        Schau dir das fertige SQL-Statement an (echo $sql;). Damit man das kann, habe ich es vorsorglich in einer Variablen zusammengebaut anstatt dies gleich als Argument der mysql_query()-Funktion zu tun.

        Du wirst dann bestimmt schon sehen, wo dir noch ein Zeichen fehlt.

        if (!mysql_query($sql, $conn)){
              echo "keine query möglich!";}// MySQL-Fehler ...

        Auch die Abfrage des genauen Wortlauts der Fehlermeldung mittels mysql_error() kann aufschlussreich sein, nachdem mysql_query() durch das Rüchgabeergebnis false mitgeteilt hat, dass etwas nicht stimmte.

        echo "$verabschiedung $name";

        1. Auch die Abfrage des genauen Wortlauts der Fehlermeldung mittels mysql_error() kann aufschlussreich sein, nachdem mysql_query() durch das Rüchgabeergebnis false mitgeteilt hat, dass etwas nicht stimmte.

          super hinweis, habs inzwischen schon hinbekommen. so sieht der code jetzt aus, falls jemand das gleiche problem hat:

          if (isset($_GET['form']) and is_array($_GET['form'])) {

          $set_values = array();

          foreach ($_GET['form'] as $name => $wert) {
             echo $name;echo$wert;
                $set_values[] = $name . " = '" . mysql_real_escape_string($wert)."'";
              }

          $sql = 'INSERT INTO design SET '. implode(', ', $set_values);
           echo $sql;
              if (!mysql_query($sql, $conn)){
                echo mysql_error();}
          }

    2. Hello,

      $set_values[] = $name . '=' . mysql_real_escape_string($wert);

      ... wobei diese Methode nicht funktioniert, wenn man (zwischendrin) FALSE oder NULL als Feldwerte übergeben muss/will!

      Harzliche Grüße vom Berg
      http://bergpost.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

      1. echo $begrüßung;

        $set_values[] = $name . '=' . mysql_real_escape_string($wert);
        ... wobei diese Methode nicht funktioniert, wenn man (zwischendrin) FALSE oder NULL als Feldwerte übergeben muss/will!

        Ich sehe gerade, dass ich da oben vergaß, den Wert in Anführungszeichen zu setzen

        $set_values[] = $name . '="' . mysql_real_escape_string($wert) . '"';

        So ist's besser. Zu deinem Einwurf: Da alle Benutzereingaben in $_POST und $_GET als String vorliegen und man da sowieso nicht unterscheiden kann, ob der String "NULL" nun als String oder als NULL-Wert gemeint ist, muss man sich sowieso irgendwas anderes einfallen lassen, falls man NULL besonders behandeln will. Einerseits könnte man definieren, dass bei leerer Benutzereingabe NULL im Feld einzutragen sei, dann braucht man dazu eine Fallunterscheidung (if). Oder man hat ein eigenes Checkbox-Feld (siehe beispielsweise phpMyAdmin), dann benötigt man dazu ebenfalls eine Fallunterscheidung mit extra Auswertung dieser Checkbox.

        Für boolsche Werte wird man wohl auch eher eine Checkbox einsetzen wollen. Die hat nun wieder die besondere Eigenschaft, gar nicht in $_GET/$_POST zu erscheinen, wenn sie nicht angehakt wurde. Und ein gesetzter Wert braucht auch eine Übersetzung vom String-Wert in den in das Feld einzutragenden Wert. Also lassen sich Checkboxen ebenfalls nicht ohne Sonderauswertung ins SQL-Statement übernehmen.

        Meine Glaskugel sagte mir, dass beide Ausnahmefälle beim OP nicht vorkommen, er nur einfache Stringwerte verwendet. :-)

        echo "$verabschiedung $name";

        1. Hello,

          Meine Glaskugel sagte mir, dass beide Ausnahmefälle beim OP nicht vorkommen, er nur einfache Stringwerte verwendet. :-)

          Ich bin mit einem Grinsen im Gesicht auch nur darauf gemommen eben, weil ich las "es gibt bei Insert auch auch SET". Ich mag nämlich die SET-Syntax eigentlich auch lieber.

          Aber die andere ist für diesen Fall besser.

          Da baut man sich sein Array auf mit den Werten

          $_insert = array();
            $_insert[$feldname] = quote(mysql_real_escape_string($feldwert));  ## quote() ist Eigenproduktion
            ...

          wenn dann deie Checkbox gesetzt war, kann man einfach ersetzen

          $_insert[$feldname] = 'NULL';

          Wenn man ein Feld nicht benötigt, kann man einfach

          unset($_insert[$feldname]);

          schreiben.

          und nachher hat man nur zwei einfache implodes für die Feldnamenliste und die Valuesliste.

          Für "zu Fuß" habe ich diese Schreibweise immer gehasst, aber wenn man es programmgesteuert mit einem Array erledigt ist sie tatsächlich die bequmere.

          Harzliche Grüße vom Berg
          http://bergpost.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)