Jonas: Problem mit Script

Hallo,
bräuchte mal wieder eure Hilfe. Habe ein altes Script von mir genommen, das noch unter Register_Globals_on geschrieben wurde und wollte das nun auf Globals_off umschreiben, aber irgendwie habe ich da einen Fehler drin - wäre dankbar wenn ihr mal drüber schauen könntet und mir sagt woran es liegt, bzw. was und wie ich es ändern muß.
Das ganze ist 3 geteilt:
1. Formular in dem ich auswählen kann wieviele neue Datensätze ich anlegen möchte
2. Formular für die Datensätze
3. Eintrag in MySql Datenbank

1. Seite
<form action="db_neu.php" method="post">
  Anzahl <input type="text" name="anzahl" value="XX" size="2"><input type="submit" value="neu anlegen">
  </form>

soweit noch kein Problem...

2. Seite
<form action="neu_eintragen.php" method="post">
$k=1;
$anzahl=$_POST["anzahl"];
while($k<=$anzahl)
{
echo "<input type='hidden' name='hoppala[]' value='$k'></input>";
echo "<input type='Text' name='name[]' value='' size='20'>";
echo "<input type='Text' name='datum[]' value='' size='10'>";
echo "<select name='k[]'>";
/*hier kommt eine Datenbankabfrage die mir mehere Sätze aus einer anderen Tabelle ausliest und mit While-Schleife in die Option schreibt
*/
while
{
echo "<option value='$id'>$info</option>";
}
echo "</select";
.
.
.
etc.

}
<input type='Submit' name='Eintragen' value='Eintragen'>

Auch hier geht es noch gut aber bei der Übergabe/Übernahme in die dritte Seite gibt es Probleme

3. Seite

$i=0;
foreach($_POST["hoppala"] as $aktid)
{
$name=$_POST["name[$i]"];
$datum=$_POST["datum[$i]"];
$k=$_POST["k[$i]"];
etc.
/*
ich weiß die $_Post Variablen sollte man nicht in normale Variablen umschreiben....
*/

$sql =  "insert into tabelle (

name,
datum,
k,
...
)

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

if (!mysql_query($sql))

{
 die("<p>Eintrag geht leider nicht </p>");
 }
else
 {
 $id=mysql_insert_id();
 }

$i++;
}

Als Fehlermeldung erhalte ich:
Notice: Undefined index: name[0] in ...
Notice: Undefined index: datum[0] in...
Notice: Undefined index: k[0] in ...
Notice: Undefined index: name[1] in...
Notice: Undefined index: datum[1] in ...
etc.

und es werden leere Datensätze angelegt.

Da ich noch nicht soviel Ahnung von der ganzen Materie habe wäre es klasse wenn Ihr mir helfen könntet

Danke Jonas

  1. Mahlzeit,

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

    [...]

    Als Fehlermeldung erhalte ich:
    Notice: Undefined index: name[0] in ...
    Notice: Undefined index: datum[0] in...
    Notice: Undefined index: k[0] in ...
    Notice: Undefined index: name[1] in...
    Notice: Undefined index: datum[1] in ...
    etc.

    Ich denke, in Deinem $_POST-Array gibt es keinen Eintrag, dessen Key "name[0]" lautet.

    Alle Eingabeelemente, die den gleichen Namen haben, werden in einem Array zusammengefasst. Wenn Du darauf zugreifen willst, musst Du das natürlich so tun, wie Du IMMER auf Arrays zugreifst:

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

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  2. 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";