Jochen: Array Ausgabe + INSERT in Ddatenbank

Guten Abend,

ich habe auf meiner Seite ein Formular, das sieht derzeit so aus:

  
 <input type="text" name="name[]"  id="name" size="12" />  
 <input type="text" name="vorname[]" id="vorname" size="12" />  
  
 <input type="text" name="name[]"  id="name" size="12" />  
 <input type="text" name="vorname[]" id="vorname" size="12" />  

nun möchte ich die Daten in die Datenbank bekommen und zwar jede Reihe in eine neue Spalte also immer:

Zeile 1
Name (Spalte1)
Vorname (Spalte2)

Zeile 2
Name (Spalte1)
Vorname (Spalte2)

Mein Code sieht bis jetzt so aus:

  
if(is_array($_POST["name"]) && $_POST["name"][0]){  
     foreach($_POST["name"] as $v){  
	echo $v;  
	}  
	}  

damit bekomme ich die Namen raus, aber wie mache ich das nun mit dem Vornamen und wie speichere ich das in die Datenbank?

Mein INSERT Code sieht derzeit so aus:

  
$sqlinsert = "INSERT INTO `adressen`  
SET  
 a_name 	 = '$name',  
 a_strasse 	 = '$strasse'  
";  
$result = mysql_query($sqlinsert);  
echo mysql_error();  
  

Gruß,
Jochen

  1. Hallo,

    <input type="text" name="name[]"  id="name" size="12" />
    <input type="text" name="vorname[]" id="vorname" size="12" />

    <input type="text" name="name[]"  id="name" size="12" />
    <input type="text" name="vorname[]" id="vorname" size="12" />

    
    >   
      
    da fällt als erstes auf, dass du IDs mehrfach verwendest. Das ist nicht valide.  
      
    Gruß  
    Kalk
    
  2. Tach!

    <input type="text" name="name[]"  id="name" size="12" />

    <input type="text" name="vorname[]" id="vorname" size="12" />

    <input type="text" name="name[]"  id="name" size="12" />
    <input type="text" name="vorname[]" id="vorname" size="12" />

      
    Damit bekommst du nur mehr oder weniger zufällig eine Zuordnung zwischen Name und Vorname hin. Ich würde einen eindeutigen Wert in den []-Klammern vorgeben.  
      
    
    > if(is\_array($\_POST["name"]) && $\_POST["name"][0]){  
      
    Wenn $\_POST["name"] ein Array ist, kannst du darüber foreach-en, auch wenn keine Werte darin enthalten sein sollten. Der Test $\_POST["name"][0], noch dazu mit einer Umwandlung in einen booleschen Wert, ist überflüssig.  
      
    
    >      foreach($\_POST["name"] as $v){  
    > damit bekomme ich die Namen raus, aber wie mache ich das nun mit dem Vornamen und wie speichere ich das in die Datenbank?  
      
    foreach kennt eine Syntax, bei der man auch den Key geliefert bekommt. Über diesen Key kannst du dann im Vornamen-Array das zugehörige Element finden. Deswegen die händische Key-Vorgabe, damit sie hier garantiert zusammenpassen.  
      
    
    > ~~~php
    
    $sqlinsert = "INSERT INTO `adressen`  
    
    > SET  
    >  a_name 	 = '$name',  
    >  a_strasse 	 = '$strasse'  
    > ";
    
    

    Im Interesse deiner eigenen Datensicherheit bitte den Kontextwechsel beachten.

    dedlfix.

    1. Hallo,

      Ich würde einen eindeutigen Wert in den []-Klammern vorgeben.

      Meinst du das in etwa so?

        
       <input type="text" name="naqme[1]"   size="12" />  
       <input type="text" name="vorname[1]"  size="12" />  
        
       <input type="text" name="naqme[2]"   size="12" />  
       <input type="text" name="vorname[2]"  size="12" />  
      
      

      Was meinst du denn mit diesem Satz, diesen verstehe ich leider nicht!

      foreach kennt eine Syntax, bei der man auch den Key geliefert bekommt. Über > diesen Key kannst du dann im Vornamen-Array das zugehörige Element finden. > Deswegen die händische Key-Vorgabe, damit sie hier garantiert zusammenpassen.

      Gruß,
      Jochen

      1. Tach!

        Ich würde einen eindeutigen Wert in den []-Klammern vorgeben.
        Meinst du das in etwa so?

        Ja.

        Was meinst du denn mit diesem Satz, diesen verstehe ich leider nicht!

        foreach kennt eine Syntax, bei der man auch den Key geliefert bekommt.

        Da muss ich jetzt raten, was genau du daran nicht verstehst. Ist es, dass du die beiden Arten von foreach nicht kennst? Dann gibt das PHP-Handbuch darüber Auskunft: http://php.net/foreach. Du hast die Variante genommen, die nur den Wert des aktuellen Array-Eintrags liefert. Der entspricht dem, was der Nutzer in das Input-Feld eingegeben hat.

        Über diesen Key kannst du dann im Vornamen-Array das zugehörige Element finden. Deswegen die händische Key-Vorgabe, damit sie hier garantiert zusammenpassen.

        Um auf die zugehörigen anderen Input-Felder zugreifen zu können, benötigst du nun auch noch den Schlüssel, den du dir ja jetzt vermutlich hinzugefügt hast. Allein daran siehst du nun schon im HTML-Code, welche Felder zusammengehören. Unter PHP kannst du nun mit $_POST['name'][$key] und $_POST['vorname'][$key] ebenfalls auf die zugehörigen Felder zugreifen.

        Übrigens gibt es auch noch einen anderen Weg. Wenn du die Namen wie folgt vergibst

        <input ... name="person[1][name]">
        <input ... name="person[1][vorname]">

        <input ... name="person[2][name]">
        <input ... name="person[2][vorname]">

        kannst du unter PHP mit einem einfachen foreach ($_POST['person'] as $person) durchlaufen und hast mit $person ein Array, das alle Daten der Person enthält. Mach mal ein print_r($_POST), dann siehst du wie das aussieht und vermutlich auch den Vorteil darin. (Vorher ein <pre> ausgeben erhöht die Übersichtlichkeit der print_r-Ausgabe.)

        dedlfix.

        1. Hallo,

          kannst du unter PHP mit einem einfachen foreach ($_POST['person'] as $person) durchlaufen und hast mit $person ein Array, das alle Daten der Person enthält. Mach mal ein print_r($_POST), dann siehst du wie das aussieht und vermutlich auch den Vorteil darin. (Vorher ein <pre> ausgeben erhöht die Übersichtlichkeit der print_r-Ausgabe.)

          wenn ich das so mache, wie du geschrieben hast, dann bekomme ich folgende Ausgabe:

          Array
          (
              [person] => Array
                  (
                      [1] => Array
                          (
                              [name] => Test
                              [vorname] => Name
                          )

          [2] => Array
                          (
                              [name] =>
                              [vorname] =>
                          )

          [3] => Array
                          (
                              [name] => Test 1
                              [vorname] => Name 1
                          )

          )

          [button] => Daten jetzt eintragen
          )

          kann ich jetzt noch verhindern, dass es mir die leeren nicht mit Anzeigt bzw. auch nicht mit in die Datenbank speichert? Sonst müsste ich ein weiteres Script schreibe das mit die leeren Einträge wieder rausfiltert und löscht.

          Gruß
          Jochen

          1. Tach!

            kann ich jetzt noch verhindern, dass es mir die leeren nicht mit Anzeigt bzw. auch nicht mit in die Datenbank speichert? Sonst müsste ich ein weiteres Script schreibe das mit die leeren Einträge wieder rausfiltert und löscht.

            Die leeren bekommst du auch mit deiner ursprünglichen Vorgehensweise. Dafür hast du ja bereits eine Fallunterscheidung eingebaut, die allerdings nur auf das erste Feld gewirkt hat. Du brauchst die Fallunterscheidung in jedem Fall, und zwar richtig implementiert: für jedes Feld-Paar erneut, also innerhalb der foreach-Schleife. Die Prüfung auf leer kannst du gleich mit anderen Validitätsprüfungen verbinden, falls du schon welche implementieren wolltest. Wenn nicht, wirst du vielleicht später noch Bedarf sehen.

            dedlfix.