Lieber Linuchs,
man kann es auch gleich richtig(TM) machen...
<input name="titel[]" ...>
Das ist PHP-spezifisch. Das kann man so machen, muss man aber nicht.
<input name="zeile[]['titel']" ...> <input name="zeile[]['komponist']" ...> ...
Siehst Du, da sollte man doch nicht PHP überlassen, wie die Array-Struktur aufgebaut werden sollte. In meinem Fall sieht das so aus:
<input name="data-123-title" ...>
<input name="data-123-composer" ...>
<input name="data-123-year" ...>
<input name="data-123-whatever" ...>
Das erzeugt entsprechende $_POST-Schlüssel, die ich dann schön der Reihe nach "parsen" kann. Was nicht passt, wird nicht erkannt und kann meine Array(s) nicht vermüllen:
$data = array();
foreach ($_POST as $key => $value) {
if (preg_match('~^data-(\d+)-([a-z]+)$~', $key, $found)) {
// $found[1] hat Datensatz-Nummer
// $found[2] hat Attribut-Namen
// default-Datensatz anlegen
if (!array_key_exists($found[1], $data)) {
$data[$found[1]] = array(
'composer' => '',
'title' => '',
'whatever' => '',
'year' => ''
);
}
// existiert so ein Attributname?
if (array_key_exists($found[2], $data[$found[1]])) {
$data[$found[1]][$found[2]] = $value;
}
}
}
Mit dieser Vorgehensweise gibt es kein "glauben, dass es tut", sondern absolute Gewissheit über jeden kleinsten Einzelschritt, sowie Sicherheit darüber, dass nichts an weiterem bösen User-Input unpassenderweise hinein kommt. Und das Zuckerli ist noch, dass die Array-Schlüssel Deinen DB-Schlüsseln entsprechen.
Für Neuaufnahmen nimmst Du das Schlüsselwort "new", das ein Array "new" erzeugt, welches Du dann später als Neuaufnahme interpretieren und speichern kannst. Sollen mehrere neue Datensätze aufgenommen werden können, nimmst Du eben fortlaufend nummerierte Schlüssel "new2", "new3" (oder "new-2", "new-3") usw. Auch das kann man später beim Speichern berücksichtigen. Solche "new2" und "new3" könnten von Formularen kommen, die mit JavaScript zusätzlich benötigte Eingabefelder erhalten haben.
Liebe Grüße
Felix Riesterer