Haze: Mysqli namen speicherung?

<?php
if (isset($_POST['submit']) && isset($_POST['Vorname'])) {
 try {
    $db = new Mysqli('localhost', 'root', '', 'Namen');
    echo 'Verbindung offen.<br />';
    $sql = sprintf ('INSERT INTO angaben (Vorname,)
    VALUES ('%s)',
    $db->real_escape_string($_POST['Vorname'])
     );
    $db->query($sql);
    echo 'SQL Geschickt. <br />';
    $db->close();
    echo 'Verbindung zu.<br />';
  } catch (Exception $e) {
    echo 'Fehler:' . htmlspecialchars($e->getMessage());
 }
}
?>
<form method="POST">
<input type="text" name="Vorname" value="Vorname" /> <br />
<input type="submit" name="submit" value="submit" /> <br />
</form>

So hallöchen, ich versuche gerade mich ein bisschen in  Mysqli datenbanken einzuarbeiten aber muss feststellen das ich wohl zu vertrottelt bin -.-
Ich rätsel da jetzt schon seit heut morgen rum, und ich versteh es nicht ich habe das beispiel anhand eines video2brains versucht nachzustellen, seltsamerweise funktionierts bei Ihm, bei mir macht das außer den echo nachrichten kein stück.

Ich kann die Werte via hand reinschreiben aber sobald es mit dem submit gehen soll, versteh ich die Welt nicht mehr. Das untere Script funktioniert einwandfrei aber das obere kann oder will einfach nicht gehen.
Wäre nett wenn jemand kurz darüber schaut um mir mitzuteilen an was es liegt, weil ich bin eindeutig nicht im stande dazu...

<?php
 try {
    $db = new Mysqli('localhost', 'root', '', 'Namen');
    echo 'Verbindung offen.<br />';
    $sql = 'INSERT INTO angaben (Vorname,)
    VALUES ('HansGustav')';
    $db->query($sql);
    echo 'SQL Geschickt. <br />';
    $db->close();
    echo 'Verbindung zu.<br />';
  } catch (Exception $e) {
    echo 'Fehler:' . htmlspecialchars($e->getMessage());
 }

?>

  1. Hallo,

    $sql = sprintf ('INSERT INTO angaben (Vorname,)
        VALUES ('%s)',
        $db->real_escape_string($_POST['Vorname'])
         );

    a) nähme ich ein Prepared Statement.
    b) wenn ich es wie Du schon zusammenbaute,
       nutzte ich für sprintf Anführungszeichen, die mir das Escapen
       von notwendigen Anführungszeichen ersparten:
       "INSERT INTO ... "
    c) der derzeit hinderliche Fehler ist jedoch das Komma in der Spaltenliste
       hinter Vorname:
       "INSERT INTO angaben (Vorname) VALUES ('%s')", ...
    d) Wenn man SQL-Statements dynamisch zusammenbaut, hilft die Ausgabe des
       erzeugten Statements mit anschließendem Copy-and-Paste in den DB-Client
       Deiner Wahl.

    Freundliche Grüße

    Vinzenz

    1. »» a) nähme ich ein Prepared Statement.
      Ja, das hab ich mir auch überlegt, aber dann dachte ich nee das geht auch ohne, wenn es wirklich darum geht werde ich eines benutzen aber zu Test zwecken will ich mir einbilden das ich es auch ohne hinbekommen habe.

      b) wenn ich es wie Du schon zusammenbaute,
         nutzte ich für sprintf Anführungszeichen, die mir das Escapen
         von notwendigen Anführungszeichen ersparten:
         "INSERT INTO ... "

      Werd ich in Zukunft denk ich auch anwenden.

      c) der derzeit hinderliche Fehler ist jedoch das Komma in der Spaltenliste
         hinter Vorname:
         "INSERT INTO angaben (Vorname) VALUES ('%s')", ...

      Ja wirklich ärgerlich das hätte ich auch selber sehen müssen...

      d) Wenn man SQL-Statements dynamisch zusammenbaut, hilft die Ausgabe des
         erzeugten Statements mit anschließendem Copy-and-Paste in den DB-Client
         Deiner Wahl.

      Auch ein guter tipp. :)

      Freundliche Grüße

      Vinzenz

      Danke :=)

      1. <?php
        if (isset($_POST['submit']) && isset($_POST['Vorname'])
        && isset($_POST['Jahr']) {
         try {
            $db = new Mysqli('localhost', 'root', '', 'namen');
            echo 'Verbindung offen.<br />';
            $sql = sprintf ("INSERT INTO angaben (Vorname, Jahr)
            VALUES ('%s','%s')",
            $db->real_escape_string($_POST['Vorname']),
            $db->real_escape_string($_POST['Jahr']),
             );
            $db->query($sql);
            echo 'SQL Geschickt. <br />';
            $db->close();
            echo 'Verbindung zu.<br />';
          } catch (Exception $e) {
            echo 'Fehler:' . htmlspecialchars($e->getMessage());
         }
        }
        ?>
        <form method="POST">
        <input type="text" name="Vorname" value="Vorname" /> <br />
        <input type="text" name="Jahr" value="Jahr" /> <br />
         <input type="checkbox" name="Jahr[]" value="1" /> <br />
         <input type="checkbox" name="Jahr[]" value="2" /> <br />
         <input type="checkbox" name="Jahr[]" value="3" /> <br />
         <input type="checkbox" name="Jahr[]" value="4" /> <br />

        hallöchen nocheinmal :)
        Und zwar habe ich das problem das ich dieses Checkbox array nicht in die datenbank bekomme. Ich weiß das ich es zu einem string formatieren muss bevor ich es weiterleiten kann. Jetzt ist die Frage nicht nur wie sondern auch wo? Mitten in der php mysqli anweisung geht das bestimmt nicht, es wird wohl so sein, das ich herausfinden muss welche checkbox ausgewählt wurde und diese dann als string weiterschicke?
        Ich weiß das php leere checkboxen ignoriert und mit ihnen gar nichts macht bin ziemlich ratlos. Wäre nett wenn jemand mir helfen könnte.

        <input type="checkbox" name="Jahr1" value="1" /> <br />
         <input type="checkbox" name="Jahr2" value="2" /> <br />
         <input type="checkbox" name="Jahr3" value="3" /> <br />
         <input type="checkbox" name="Jahr4" value="4" /> <br />

        Das ist für mich leider keine Lösung da ich die abfrage ob etwas angeklickt ist wennn nicht gib aus: Bitte wählen sie ihr Jahr aus schon aufgebaut habe. Ich muss lediglich das array in einen string umwandeln, ich weiß auch das es mit unserialze() gehen müsste, aber habe auch gelesen das es nicht die beste methode ist. Gibt es eine möglichkeit hier mit implode/explode zu arbeiten?

        1. $db->real_escape_string(implode($_POST['Jahr'])),

          Ähm habs jetzt so gelöst, verbesserungsvorschläge erwünscht :)

          1. Tut mir leid wegen dem fehl script werde morgen mal das anständige niederschreiben muss halt an den anderen pc

            Gruß

            1. <html>
              <head>
              <title>Formular</title>
              </head>
              <body>
              <?php
              $clear1 = true;
              $clear2 = true;
              $clear3 = true;
              $clear4 = true;
              $clear5 = true;
              $clear6 = true;

              if (isset($_POST['Absenden'])) {
              $ausgabe = '';
              $fehler = '';

              if (isset($_POST['Vorname']) && !is_array($_POST['Vorname']) && $_POST['Vorname'] != ''){
              $ausgabe .= 'Vorname: ' . htmlspecialchars($_POST['Vorname']) . '<br />';

              } else {
              $fehler .= 'Bitte füllen Sie Ihren Vornamen aus<br />';
              $clear1 = false;
              }
              if (isset($_POST['Nachname']) && !is_array($_POST['Nachname']) && $_POST['Nachname'] != ''){
              $ausgabe .= 'Nachname: ' . htmlspecialchars($_POST['Nachname']) . '<br />';

              } else {
              $fehler .= 'Bitte füllen Sie Ihren Nachnamen aus<br />';
              $clear2 = false;
              }
              if (isset($_POST['hausnummer']) && !is_array($_POST['hausnummer']) && $_POST['hausnummer'] != ''){
              $ausgabe .= 'hausnummer: ' . htmlspecialchars($_POST['hausnummer']) . '<br />';

              } else {
              $fehler .= 'Bitte füllen Sie Ihre hausnummer aus.<br />';
              $clear3 = false;
              }
              if (isset($_POST['Jahr']) && is_array($_POST['Jahr']) && count($_POST['Jahr']) > 0) {
              $ausgabe .= 'Jahr: ' . htmlspecialchars(implode(' ',$_POST['Jahr'])) . '<br />' ;

              }
              else {
              $fehler .= 'Bitte wählen Sie Ihre Jahr aus.<br />';
              $clear4 = false;
              }
              if (isset($_POST['Uhrzeit']) && !is_array($_POST['Uhrzeit']) && $_POST['Uhrzeit'] != ''){
              $ausgabe .= 'Zeit: ' . htmlspecialchars($_POST['Uhrzeit']) . '<br />';

              } else {
              $fehler .= 'Bitte füllen Sie Ihre Uhrzeit aus.<br />';
              $clear5 = false;

              }
              if (isset($_POST['Wochentag']) && !is_array($_POST['Wochentag']) && $_POST['Wochentag'] != ''){
              $ausgabe .= 'Wochentag: ' . htmlspecialchars($_POST['Wochentag']) . '<br />';

              } else {
              $fehler .= 'Bitte wählen Sie Ihren Wochentag.<br />';
              $clear6 = false;

              }
              if ($fehler == '') {
              echo $ausgabe;
              echo '</body></html>';
              }   else {
              echo "$fehler";
              }
              try {
              $db = new Mysqli('localhost', 'root', 'zigeuner123', 'tutorium');
              echo 'sql offen';
              $sql = sprintf ("INSERT INTO angaben (Vorname, Nachname, hausnummer, Jahr, Uhrzeit, Wochentag)
              VALUES (%s,%s,%s,%s,%s,%s)",
              $db->real_escape_string($_POST['Vorname']),
              $db->real_escape_string($_POST['Nachname']),
              (int)($_POST['hausnummer']),
              $db->real_escape_string(implode(',',$_POST['Jahr'])),
              $db->real_escape_string($_POST['Uhrzeit']),
              $db->real_escape_string($_POST['Wochentag'])
              );
              $db->query($sql);
              echo 'sql geschickt';
              $db->close();
              } catch (Exception $e) {
              echo 'Fehler:' . htmlspecialchars($e->getMessage());
               }
              }
              ?>
              <form action="<?php echo htmlspecialchars ($_SERVER['PHP_SELF']); ?>" method="POST">
              <label for='Vorname'>Vorname:</label><br>
              <input type='text' name='Vorname' id='Vorname'  maxlength="50" value="<?php
              if(isset($_POST['Vorname']) && !is_array($_POST['Vorname'])) {
              echo htmlspecialchars ($_POST['Vorname']);
              }
              ?>
              "/>
              <?php
              if (!$clear1) {
              echo '<span style="color:orange">*</span>';
              }
              ?>
              <br />
              <label for='Nachname'>Nachname:</label><br>
              <input type='text' name='Nachname' id='Nachname'  maxlength="50" value="<?php
              if(isset($_POST['Nachname']) && !is_array($_POST['Nachname'])) {
              echo htmlspecialchars ($_POST['Nachname']);
              }
              ?>
              "/>
              <?php
              if (!$clear2) {
              echo '<span style="color:orange">*</span>';
              }
              ?>
              <br />
              <label for='hausnummer'>hausnummer:</label><br>
              <input type='text' name='hausnummer' id='hausnummer'  size="2" value="<?php
              if(isset($_POST['hausnummer']) && !is_array($_POST['hausnummer'])) {
              echo htmlspecialchars ($_POST['hausnummer']);
              }
              ?>
              "/>
              <?php
              if (!$clear3) {
              echo '<span style="color:orange">*</span>';
              }
              ?>
              <br />
              <p> Geben Sie Ihr Jahr an:<?php
              if (!$clear4) {
              echo '<span style="color:orange">*</span>';
              }
              ?><br />
              <br />
              <label for='Jahr'>1992:</label><br>
              <input type="checkbox" name="Jahr[]" value="1992" <?php
              if (isset($_POST['Jahr']) && is_array($_POST['Jahr']) &&
              in_array('1990',$_POST['Jahr'])) {
              echo 'checked="checked" ';
              }
              ?>
              />
              1992
              <br />
              <input type="checkbox" name="Jahr[]" value="1993" <?php
              if (isset($_POST['Jahr']) && is_array($_POST['Jahr']) &&
              in_array('1991',$_POST['Jahr'])) {
              echo 'checked="checked" ';
              }
              ?>
              />
              1993
              <br />
              <input type="checkbox" name="Jahr[]" value="1994" <?php
              if (isset($_POST['Jahr']) && is_array($_POST['Jahr']) &&
              in_array('1992',$_POST['Jahr'])) {
              echo 'checked="checked" ';
              }
              ?>
              />
              1994<br />
              <input type="checkbox" name="Jahr[]" value="1995" <?php
              if (isset($_POST['Jahr']) && is_array($_POST['Jahr']) &&
              in_array('1995',$_POST['Jahr'])) {
              echo 'checked="checked" ';
              }
              ?>
              />
              1995
              <br />
              <input type="checkbox" name="Jahr[]" value="1996" <?php
              if (isset($_POST['Jahr']) && is_array($_POST['Jahr']) &&
              in_array('1996',$_POST['Jahr'])) {
              echo 'checked="checked" ';
              }
              ?>
              />
              1996
              <br />
              <input type="checkbox" name="Jahr[]" value="1997 " <?php
              if (isset($_POST['Jahr']) && is_array($_POST['Jahr']) &&
              in_array('1997',$_POST['Jahr'])) {
              echo 'checked="checked" ';
              }
              ?>
              />
              1997
              <br />
              <input type="checkbox" name="Jahr[]" value="1998" <?php
              if (isset($_POST['Jahr']) && is_array($_POST['Jahr']) &&
              in_array('1998',$_POST['Jahr'])) {
              echo 'checked="checked" ';
              }
              ?>
              />
              1998
              <br />
              </p>
              <label for='Uhrzeit' >Bitte geben Sie Ihre Uhrzeit an den sie wählen möchten (Kumulativ)<br />
              Mehrere Zeitangaben mit Leerstellen trennung bsp: 12:00 13:00 /Wenn jemand weiß wie ich die Uhrzeit besser speichern kann nur zu Tipps sind erwünscht!</label><br>
              <input type='text' name='Uhrzeit' id='Uhrzeit'  size="20" value="<?php
              if(isset($_POST['Uhrzeit']) && !is_array($_POST['Uhrzeit'])) {
              echo htmlspecialchars ($_POST['Uhrzeit']);
              }
              ?>
              "/>
              <?php
              if (!$clear5) {
              echo '<span style="color:orange">*</span>';
              }
              ?>
              <br />
              <br />
              <label for='Tag' >Bitte geben Sie Ihre Wochentage an<br />
              Beispiel: Montag, Mittwoch, hier gilt das gleiche wie für Uhrzeit :=)<br /><br />
              </label>
              <input type='text' name='Wochentag' id='Wochentag'  size="20" value="<?php
              if(isset($_POST['Wochentag']) && !is_array($_POST['Wochentag'])) {
              echo htmlspecialchars ($_POST['Wochentag']);
              }
              ?>
              "/>
              <?php
              if (!$clear6) {
              echo '<span style="color:orange">*</span>';
              }
              ?>
              <br />
              <input type='submit' name='Absenden' value='Absenden' />
              <input type='reset'  name='Zurücksetzen' value='Zurücksetzen'/>
              </form>
              </body>
              </html>

              So hier ist mein Formular an dem ich gerade sitze. Ich weiß zwar grad nicht warum es nicht läuft bzw es keine Daten an die Db schickt aber da schau ich mal später rein, dürfte kein problem sein.

              Mein hauptproblem besteht bis jetzt nur aus:

              Das Array speichern.
              Eine Anständige Uhrzeit hinbekommen.
              Und die WOchentage auch anständig in die Db zu kriegen.

              Das mit der Einen Zeile sieht wirklich derbst daneben aus, in der db.
              Was sql injections angeht, ich bin zwar bereits dran mich über das Thema zu informieren, aber nützliche Tipps und Kommandos können nie schaden.

              Das Clear1-6 könnte ich eigentlich auch in ein array packen.
              Aber das grund gerüst steht ja schon einmal.

              Dankbar für Tipps auf jedenfall :=)

              1. Tach!

                Was sql injections angeht, ich bin zwar bereits dran mich über das Thema zu informieren, aber nützliche Tipps und Kommandos können nie schaden.

                SQL-Injection ist nur eine Spielart der Injections. Sie können überall auftreten, wo Daten und Code gemischt übertragen werden und der Empfänger zwischen Code und Daten unterscheiden muss. Grundsätzlich musst du also an all den Stellen, an denen du Daten irgendwo einfügst, dir überlegen, ob man nicht auch Code einschleusen könnte. Dabei darfst du nicht nur auf Eingaben von Anwendern achten. Im Prinzip ist es sogar egal, woher die Daten kommen. Solange du nicht genau ihren Inhalt kennst, musst du sie als potentiell gefährlich betrachten.

                Wichtig ist nun zu wissen, was das Zielsystem für Sonderzeichen hat. Es ist auch keine schlechte Idee, genau mit diesen Sonderzeichen dein System zu malträtieren. Es muss sich souverän verhalten und alle Zeichen wie eingegeben anzeigen. Ob das am Ende ein sinvoller Wert für deine Anwendung ist, ist für die Injection-Betrachtung nicht weiter interessant. Inhalte müssen an anderer Stelle auf fachliche Richtigkeit geprüft werden.

                Ist dir schon der Kontextwechsel-Artikel empfohlen worden? Da hab ich mal alles Wichtige aufgeschrieben.

                $db = new Mysqli('localhost', 'root', 'zigeuner123', 'tutorium');
                echo 'sql offen';
                $sql = sprintf ("INSERT INTO angaben (Vorname, Nachname, hausnummer, Jahr, Uhrzeit, Wochentag)
                VALUES (%s,%s,%s,%s,%s,%s)",

                Hier fehlen Anführungszeichen, dafür sind Backslashes zu viel.

                (int)($_POST['hausnummer']),

                Du kannst auch die Funktion intval() verwenden.

                Mehrere Zeitangaben mit Leerstellen trennung bsp: 12:00 13:00 /Wenn jemand weiß wie ich die Uhrzeit besser speichern kann nur zu Tipps sind erwünscht!</label><br>

                Nunja, in der Form bekommst du sie nur als String. Dann heißt es entweder den String ins DBMS zu schreiben, auf das dieses die Uhrzeit nicht wirklich auswerten kann, oder du fummelst die Eingabe auseinander und formatierst sie so, dass sie in ein TIME-Feld eingefügt werden kann. Und nun kommst du wieder an das bereits erwähnte Problem der Strukturierung deiner Tabellen, so dass beliebig viele Uhrzeiten eingegeben werden können und das System sie auch noch erkennt.

                So hier ist mein Formular an dem ich gerade sitze. Ich weiß zwar grad nicht warum es nicht läuft bzw es keine Daten an die Db schickt aber da schau ich mal später rein, dürfte kein problem sein.

                Debugging ... die notwendigen Werkzeuge sind dir sicher schon genannt worden.

                Mein hauptproblem besteht bis jetzt nur aus:
                Das Array speichern.
                Eine Anständige Uhrzeit hinbekommen.
                Und die WOchentage auch anständig in die Db zu kriegen.

                Dafür solltest du zuerst deine Tabellen richtig designen. Dabei helfen dir die Datenbänker, wenn du ihnen mehr von deiner Anwendung erzählst, so dass sie fachlich einschätzen können, welches Design dafür sinnvoll ist.

                Wenn das geklärt ist, kannst du darüber nachdenken, wie du die Daten in die Tabellen bekommst.

                dedlfix.

                1. Hallo,

                  (int)($_POST['hausnummer']),

                  Du kannst auch die Funktion intval() verwenden.

                  Noch sinnvoller wäre es aber die Hausnummer aber einfach als String zu behandeln - da kann durchaus auch ein Buchstabe mit drinstehen (z.B. Hausnummer 42b) der beim Umwandeln in eine Zahl verloren geht ...

                  Gruß,
                  Tobias

        2. edit: so tuts doch nicht -.-

          1. Tach!

            edit: so tuts doch nicht -.-

            Beschreibe bitte genauer, was du erwartest und was du stattdessen bekommst. Es ist nicht günstig, dies die potentiellen Antworter erst noch erraten zu lassen.

            dedlfix.

            1. <?php
              if (isset($_POST['submit']) && isset($_POST['Vorname'])
              && isset($_POST['Nachname'])&& isset($_POST['Ort'])
              && isset($_POST['Jahr']) && isset($_POST['Uhrzeit'])
              && isset($_POST['Woche'])) {
              try {
                  $db = new Mysqli('localhost', 'root', '', 'namen');
                  $sql = sprintf ('INSERT INTO angaben (Vorname, Nachname, Jahr, Uhrzeit, Woche)
                  VALUES ('%s','%s','%s','%s','%s','%s')',
                  $db->real_escape_string($_POST['Vorname']),
                  $db->real_escape_string($_POST['Nachname']),
                  $db->real_escape_string(implode(',',$_POST['Jahr'])),
                  $db->real_escape_string($_POST['Uhrzeit']),
                  $db->real_escape_string($_POST['Woche'])
                   );
                  $db->query($sql);
                  $db->close();
                } catch (Exception $e) {
                  echo 'Fehler:' . htmlspecialchars($e->getMessage());
               }
              }
              ?>
              <input type="Vorname" name="Vorname" value="" />
              <input type="Vorname" name="Vorname" value="" />
              <input type="checkbox" name="Jahr[]" value="1990" />1990<br />
              <input type="checkbox" name="Jahr[]" value="1991" />1991<br />
              <input type="checkbox" name="Jahr[]" value="1992" />
              <input type="submit" name="submit" value="submit" /> <br />

              so sieht zur Zeit "ungefähr mein code aus, bin gerade an einem anderen pc deshalb hab ich nicht das gesamte Script.
              Wie man oben sehen kann hab ich jetzt das array einfach in die Datenbank
              geschrieben, bzw die Checkbox Werte. Alles was ausgewählt ist in der Checkbox wird mir so auch in die Datenbank geschrieben, sieht bisschen dumm aus aber man kanns ertragen. Für verbesserungs vorschläge bin ich offen.

              Was allerdings zum vorschein gekommen ist, wenn man das formular absendet ohne ein haken in einer der checkboxen zu machen, bekomme ich 2 Fehlermeldungen.

              Notice: Undefined index: Fach in C:\xampp\htdocs\xampp....php on line 76

              Warning: implode() [function.implode]: Invalid arguments passed in C:\xampp\htdocs\xampp....php on line 76

              Nunja, die 2 kann ich mir auch beantworten, einmal weil das Index wenn ich das Formular aufrufe noch leer ist und man erst die checkboxen checken muss.

              Und das implode scheint wohl auch noch an der Falschen stelle zu sein...

              $db->real_escape_string(implode(',',$_POST['Jahr'])),

              wahrscheinlich auch weil es das array nicht erkannt wird wenn es nicht bestätigt wurde

              »»Wenn du auf das Vorhandensein des submit prüfst, dann kann man in manchen »»Browsern, vorwiegend IE nicht mit Enter das Formular absenden, denn der »»IE betrachtet einen nicht geklickten Button als nicht erfolgreiches »»Element und schickt es nicht mit. Andere Browser nehmen sich einfach »»irgendeinen Button und tun so, als ob er geklickt wurde.

              hm? hab gemeint das ich mit der isset abfrage das abfragen würde, oder gibt es da noch eine andere möglichkeit die mir entgangen ist?

              »»Wie sieht denn die Tabellenstruktur aus? Willst du tatsächlich mehrere »»Werte in ein Feld bringen? Das erzeugt nämlich gleich noch ein »»Folgeproblem: Wie findet man Werte in solch einem Feld? FIND_IN_SET() »»kann zwar bei kommaseparierten Werten helfen, aber das ist langsam, weil »»dabei kein Index verwendet werden kann.

              Bis jetzt hab ich die oben gesetzten Felder und pro Feld eine spalte.
              Vorname  1
              Nachname 1
              Jahr     1
              (Ja auch für das array, das ja ziemlich bescheiden in der db aussieht
              Ort      1
              Uhrzeit  1
              Woche    1

              Ich möchte das array speichern und es dann später bei einem User mit sonderrechten wieder ausgeben lassen. Ich hab noch gar nicht darüber nachgedacht wie ich das wieder aus der db bekomme eigentlich war ich schon froh das ich es reinbekommen habe^^ Gut ich hab mir schon überlegt für das array bzw jeden einzelnen Wert im array ein eigene spalte zu geben gleich beim hineinsetzen. Hab mir das auch schon angeschaut, aber möchte es dann doch langsamer angehen lassen.

              Was die sql injection angeht, hm ich find bis jetzt sieht der code doch recht sicher aus oder nicht? Ich werde die einzelnen input felder natürlich noch mit htmlspecialchars ausbessern und die eingabe überprüfen aber da es jetzt möchte ich erstmal das alles anständig in der datenbank landet. Ein paar tipps sind nie verkehrt. :=)

              1. Tach!

                $db->real_escape_string(implode(',',$_POST['Jahr'])),
                Was allerdings zum vorschein gekommen ist, wenn man das formular absendet ohne ein haken in einer der checkboxen zu machen, bekomme ich 2 Fehlermeldungen.
                Notice: Undefined index: Fach in C:\xampp\htdocs\xampp....php on line 76
                Warning: implode() [function.implode]: Invalid arguments passed in C:\xampp\htdocs\xampp....php on line 76
                Nunja, die 2 kann ich mir auch beantworten, einmal weil das Index wenn ich das Formular aufrufe noch leer ist und man erst die checkboxen checken muss.

                Mit var_dump() würdest du genauer sehen, was Phase ist. $_POST['Jahr'] dürfte gar nicht vorhanden sein, wenn du Jahr nicht noch einmal an anderer Stelle als Input-Element-Namen verwendest.

                Und das implode scheint wohl auch noch an der Falschen stelle zu sein...
                $db->real_escape_string(implode(',',$_POST['Jahr'])),
                wahrscheinlich auch weil es das array nicht erkannt wird wenn es nicht bestätigt wurde

                Rate nicht, bevor du nicht mit einer Kontrollausgabe geprüft hast, was tatsächlich vorliegt!

                Wenn du auf das Vorhandensein des submit prüfst, dann kann man in manchen Browsern, vorwiegend IE nicht mit Enter das Formular absenden, denn der IE betrachtet einen nicht geklickten Button als nicht erfolgreiches Element und schickt es nicht mit. Andere Browser nehmen sich einfach irgendeinen Button und tun so, als ob er geklickt wurde.
                hm? hab gemeint das ich mit der isset abfrage das abfragen würde, oder gibt es da noch eine andere möglichkeit die mir entgangen ist?

                Das submit ist nicht in allen Fällen sicher vorhanden. Du prüfst auf die anderen Werte, das reicht.

                Was die sql injection angeht, hm ich find bis jetzt sieht der code doch recht sicher aus oder nicht?

                Es ist sicher gegen das Einfügen von Befehlsbestandteilen in das SQL-Statement, aber der Anwender wird nicht gehindert, Werte mit Kommas drin oder gar anderen Werten mitzusenden.

                Ich werde die einzelnen input felder natürlich noch mit htmlspecialchars ausbessern und die eingabe überprüfen aber da es jetzt möchte ich erstmal das alles anständig in der datenbank landet.

                htmlspecialchars() ist nicht für Eingaben sondern für Ausgaben in Richtung HTML geeignet.

                dedlfix.

        3. Tach!

          if (isset($_POST['submit']) && isset($_POST['Vorname'])
          && isset($_POST['Jahr']) {

          Wenn du auf das Vorhandensein des submit prüfst, dann kann man in manchen Browsern, vorwiegend IE nicht mit Enter das Formular absenden, denn der IE betrachtet einen nicht geklickten Button als nicht erfolgreiches Element und schickt es nicht mit. Andere Browser nehmen sich einfach irgendeinen Button und tun so, als ob er geklickt wurde.

          $sql = sprintf ("INSERT INTO angaben (Vorname, Jahr)
              VALUES ('%s','%s')",

          Jetzt hast du zwar das Statement in "" eingerahmt, aber trotzdem noch die ' maskiert.

          <input type="text" name="Jahr" value="Jahr" /> <br />
          <input type="checkbox" name="Jahr[]" value="1" /> <br />
          <input type="checkbox" name="Jahr[]" value="2" /> <br />
          <input type="checkbox" name="Jahr[]" value="3" /> <br />
          <input type="checkbox" name="Jahr[]" value="4" /> <br />

          Jetzt hast du aus PHP-Sicht zwei Elemente, die den Namen Jahr tragen.

          Und zwar habe ich das problem das ich dieses Checkbox array nicht in die datenbank bekomme.

          Wie sieht denn die Tabellenstruktur aus? Willst du tatsächlich mehrere Werte in ein Feld bringen? Das erzeugt nämlich gleich noch ein Folgeproblem: Wie findet man Werte in solch einem Feld? FIND_IN_SET() kann zwar bei kommaseparierten Werten helfen, aber das ist langsam, weil dabei kein Index verwendet werden kann.

          Ich weiß das ich es zu einem string formatieren muss bevor ich es weiterleiten kann.

          Ein Array in einen String-Kontext zu bringen erzugt immer den Wert "Array". Du brauchst also irgendwas anderes, wenn du wirklich nur ein Feld verwenden willst. Mit Hinblick auf FIND_IN_SET() wäre dann was mit Kommas angesagt.

          Jetzt ist die Frage nicht nur wie sondern auch wo? Mitten in der php mysqli anweisung geht das bestimmt nicht,

          Was verstehst du unter einer "php mysqli anweisung"? Du hast zunächst einmal nur PHP-Code. Du musst also mit PHP-Code-Mitteln ein SQL-Statement erzeugen. Und das muss obendrein syntaktisch korrekt sein sowie keine SQL-Injection-Lücke aufweisen. Ein einfaches implode() mit einem Komma als $glue reicht nicht. Du musst jeden Wert einzeln sichern und dann kannst du sie zusammenfügen.

          es wird wohl so sein, das ich herausfinden muss welche checkbox ausgewählt wurde

          Nun, die ausgewählten werden vom Browser mitgesendet, die anderen nicht.

          und diese dann als string weiterschicke?

          Sichern und zusammenbauen. Aber besser ist vielleicht das Datenmodell in Bezug auf Normalisierung zu ändern.

          Ich weiß das php leere checkboxen ignoriert und mit ihnen gar nichts macht bin ziemlich ratlos.

          Falsch, es ist der Browser. Schau dir an, was bei PHP ankommt, indem du eine Kontrollausgabe von $_POST machst - mit var_dump() oder print_r() (und <pre> vorher). Und was den Browser verlässt kannst du mit entsprechenden Browser-Erweiterungen oder -Funktionen prüfen (livehttpheaders für den Firefox beispielsweise).

          Ich muss lediglich das array in einen string umwandeln, ich weiß auch das es mit unserialze() gehen müsste, aber habe auch gelesen das es nicht die beste methode ist.

          Das "lediglich" ist zu wenig. serialize() (und unserialize() beim Abfragen) geht zwar prinzipiell (Escaping braucht es für den serialisierten Wert natürlich auch), aber dann kann MySQL gar nicht mehr (oder nur mit noch viel mehr Aufwand) in dem Feld suchen.

          dedlfix.