Haze: Mysqli namen speicherung?

Beitrag lesen

<?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. :=)