dedlfix: Problem mit Script

Beitrag lesen

echo $begrüßung;

$anzahl=$_POST["anzahl"];
ich weiß die $_Post Variablen sollte man nicht in normale Variablen umschreiben....

Warum machst du dann diesen komplett überflüssigen Schritt trotzdem? Je mehr Variablen du in deinem Script verwendest, desto komplexer und damit weniger leicht durchschaubar und wartbar wird es.

$k=1;
$anzahl=$_POST["anzahl"];
while($k<=$anzahl)
{
echo "<input type='hidden' name='hoppala[]' value='$k'></input>";

Du startest hier $k mit 1. Wenn du ein $a = array(); mit Werten befüllst $a[] = 'foo'; dann startet der Index bei 0. Das ist dein Fehler.
Du kannst den Key-Wert explizit setzen:

echo "<input type='Text' name='name[$k]' value='' size='20'>";
  echo "<input type='Text' name='datum[$k]' value='' size='10'>";
  echo "<select name='k[$k]'>";

Der Browser wird die Reihenfolge der <input>-Felder normalerweise nicht ändern, aber garantiert ist das nicht. Aus einem [] macht PHP durchnummerierte Keys, in der Reihenfolge, wie sie eintreffen. Mit [xxx] nimmt es den angegebenen Wert als Index. Du brauchst dann du auch kein Hidden-Feld mehr.

$i=0;
foreach($_POST["hoppala"] as $aktid)

Iteriere stattdessen über $_POST['name'], lass dir Schlüssel und Wert geben. Über den Schlüssel kannst du auf die anderen Felder zugreifen

foreach ($_POST['name'] as $key => $value) {
    ... = $_POST['datum'][$key]

$name=$_POST["name[$i]"];
$datum=$_POST["datum[$i]"];

Hier hast du einen nächsten Fehler. Verwende Kontrollausgaben, um dich vom tatsächlichen Wert zu überzeugen. Im Fehlerfall ist der meist anders als das was du erwartest. Für Arrays eignet sich neben var_dump() am besten print_r(). Vorher ein <pre> erhöht die Übersichtlichkeit der Ausgabe.

$sql =  "insert into tabelle (

name,
datum,
k,
...
)

Values ('$name','$datum','$k',...)";

Füge niemals Benutzereingaben ungefiltert in SQL-Statements ein. Oder anders gesagt: Sobald du einen Wert in einen anderen Kontext bringst, muss dieser Wert dem Kontext gemäß behandelt werden! Stell dir nur mal vor, wenn jemand als Name O'Brien eingibt. Der ' beendet den String. Der Rest produziert einen Syntax-Fehler. Im für dich besten Fall. In weniger guten Fällen bekommst du ein Statement, das was anderes macht, als das was du vorgesehen hast. Man nennt das SQL-Injection. Für MySQL kennt PHP die Funktion mysql_real_escape_string(). Anwendungsbeispiel:

$sql = sprintf("INSERT INTO tabelle (name, datum, k, ...) VALUES ('%s', '%s', '%s', ...)",
  mysql_real_escape_string($_POST['name'][$key]),
  mysql_real_escape_string($_POST['datum'][$key]),
  mysql_real_escape_string($_POST['k'][$key]),   // oder sollte das ein mysql_real_escape_string($key) sein?
  ...);

Als Fehlermeldung erhalte ich:
Notice: Undefined index: name[0] in ...
etc.
und es werden leere Datensätze angelegt.

Wenn es eine Variable oder ein Array-Element nicht gibt, dann ergibt das ein NULL, das beim Einfügen in deinen SQL-String in einen Leerstring umgewandelt wird.

echo "$verabschiedung $name";