Bernardo: Durch Checkboxen generiertes Array bleibt leer

Hallo zusammen,

ich möchte ein HTML-Formular auswerten, wobei auch einmal auch eine Mehrfachauswahl mit Checkboxen vorgesehen ist. An dieser Stelle komme ich gerade nicht weiter.

Mein HTML sieht dort so aus:

<input type="checkbox"  name="entry[]" value="honorar" /> Honorarbasis o.ä.<br />  
<input type="checkbox"  name="entry[]" value="teilzeit" /> Teilzeitanstellung<br />  
<input type="checkbox"  name="entry[]" value="vollzeit" /> Vollzeitanstellung<br />

Und hier die entsprechende Zeile des auswertenden Skriptes:
$entry_string = implode (" und ", $_POST["entry[]"]);

Das Skript läuft zwar durch, aber ich erhalte jedes Mal die folgende Fehlermeldung, wobei Zeile 33 die oben zitierte ist:
Warning: implode() [function.implode]: Invalid arguments passed in /homepages/27/d70248107/htdocs/schmidtmann/umfrage/danke.php on line 33

Auch mehrere Alternativen haben zu keiner Lösung geführt. Ich habe schließlich festgestellt, dass das Array entry[] schlicht leer ist. Andere Formularbestandteile funktionieren problemlos.

Was muss ich ändern?

Vielen Dank
Bernardo

  1. Hallo Bernardo,

    da Browser nur die Checkboxen übermitteln, die auch aktiviert sind,
    ist es vorteilhaft das Formular mittels Hidden-Felder zu erweitern:

    <input type="hidden"   name="entry[0]" value="N" />  
    <input type="checkbox" name="entry[0]" value="Y" /> Honorarbasis o.ä.<br />  
    <input type="hidden"   name="entry[1]" value="N" />  
    <input type="checkbox" name="entry[1]" value="Y" /> Teilzeitanstellung<br />  
    <input type="hidden"   name="entry[2]" value="N" />  
    <input type="checkbox" name="entry[2]" value="Y" /> Vollzeitanstellung<br />
    

    Und wie das super funktioniert kannst Du hier anschauen.

    m.b.G. Rolf

    1. Danke Rolf,

      aber leider führt auch hier die Zeile
      $entry_string = implode (" und ", $_POST["entry[]"]);
      zu o.g. Fehlermeldung.

      Viele Grüße
      Bernardo

      1. Meine Rückmeldung war etwas spärlich: Das Array entry[] ist schlicht nach wie vor leer.

        Gruß
        Bernardo

        1. Meine Rückmeldung war etwas spärlich: Das Array entry[] ist schlicht nach wie vor leer.

          dann versuche doch mal:
          <pre><?php print_r($_POST); ?></pre>

          Das es prinzipiell funktioniert sieht man an dem Demo-Script.

          m.b.G. Rolf

      2. Hi,

        aber leider führt auch hier die Zeile
        $entry_string = implode (" und ", $_POST["entry[]"]);
        zu o.g. Fehlermeldung.

        war auch Unsinn...

        Wenn Du im HTML [] angibst, übermittelt der Browser ggfls. ein Array. Dieses erhälst Du in diesem Fall über $_POST['entry'] und musst es als Array weiterverarbeiten - wobei " und " dort nirgends vorkommt und unsinnig ist.

        freundliche Grüße
        Ingo

        1. Hi,

          folgender Stand:

            
          $entry = $_POST['entry'];  
          print_r($entry); // gibt 'Array' aus -> OK?  
          $entry_string = implode ($entry); // Fehlermeldung  
          
          

          ... wobei " und " dort nirgends vorkommt und unsinnig ist.

          Die Funktion implode() soll ja ein String aus einem Array machen und dabei optional Trennzeichen einfügen. Jetzt habe ich mal den optionalen Trenner weggelassen und habe nun eine andere Fehlermeldung erhalten: 'Argument must be an array...'

          Übrigens wird auch $_POST['entry'] nicht als argument von implode akzeptiert.

          Offensichtlich wird es also irgendwie nicht als Array erkannt.

          Hier übrigens die Ausgabe von print_r($_POST):

            
              [entry] => Array  
                  (  
                      [0] => praktikum  
                      [1] => volo  
                      [2] => -  
                      [3] => -  
                      [4] => -  
                  )  
          
          

          Was läuft falsch?

          Vielen Dank
          Bernardo

          1. Hi,

            folgender Stand:

            $entry = $_POST['entry'];
            print_r($entry); // gibt 'Array' aus -> OK?
            $entry_string = implode ($entry); // Fehlermeldung

            das sollte allerdings funktionieren - unter der Voraussetzung, dass mindestens eine Checkbox übermittelt wurde, was ja der Fall ist, wenn Du tatsächlich zuvor diese Antwort auf die Abfrage erhalten hattest.  
              
            
            > Übrigens wird auch $\_POST['entry'] nicht als argument von implode akzeptiert.  
            >   
            > Offensichtlich wird es also irgendwie nicht als Array erkannt.  
            
            doch - sollte es; und zwar genau so.  
            Struppi hat natürlich recht damit, dass der Browser nicht wirklich ein Array liefert. Er übermittelt das name-Attribut wie angegeben, also hier "entry[]" ein oder mehrmals mit den entsprechenden Werten und erst die serverseitige Auswertung legt wegen "[]" ein Array $\_POST['entry'] an.  
              
            
            > Hier übrigens die Ausgabe von print\_r($\_POST):  
            > ~~~php
              
            
            >     [entry] => Array  
            >         (  
            >             [0] => praktikum  
            >             [1] => volo  
            >             [2] => -  
            >             [3] => -  
            >             [4] => -  
            >         )  
            > 
            
            

            wo kommen die "-" her?

            freundliche Grüße
            Ingo

            1. Hi,

              Struppi hat natürlich recht damit, dass der Browser nicht wirklich ein Array liefert. Er übermittelt das name-Attribut wie angegeben, also hier "entry[]" ein oder mehrmals mit den entsprechenden Werten und erst die serverseitige Auswertung legt wegen "[]" ein Array $_POST['entry'] an.

              Das ist mir klar, aber _nach_ der Zeile $entry = $_POST['entry']; sollte doch schließlich $entry als Array vorliegen und implode ($entry) funktionieren, oder stehe ich hier auf der Leitung?

              Hier übrigens die Ausgabe von print_r($_POST):

              [entry] => Array
                      (
                          [0] => praktikum
                          [1] => volo
                          [2] => -
                          [3] => -
                          [4] => -
                      )

              
              > wo kommen die "-" her?  
                
              Die "-" kommen aus der HTML-Datei. Von einem anderen Poster kam ja der Vorschlag mit den hidden-Feldern, den ich so umgesetzt hatte.  
                
              Danke  
              Bernardo
              
              1. Hi,

                Das ist mir klar, aber _nach_ der Zeile $entry = $_POST['entry']; sollte doch schließlich $entry als Array vorliegen und implode ($entry) funktionieren, oder stehe ich hier auf der Leitung?

                nö, das sollte nicht nur so sein, sondern ist es auch. Wenn nicht, musst Du irgendwo anders einen Fehler gemacht haben.

                freundliche Grüße
                Ingo

                1. Danke,

                  hier nochmal der komplette Code bis zu der Stelle. Fällt dir was auf?

                  Gruß
                  Bernardo

                    
                  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  
                       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
                    
                  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">  
                  <head>  
                    
                  <title>Vielen Dank f&uuml;r Ihre Unterst&uuml;tzung! </title>  
                    
                  <pre><?php print_r($_POST); ?></pre> // entry wird als Array ausgegeben  
                  
                  
                    
                  <?php  
                    
                  if ($_SERVER['REQUEST_METHOD'] == 'GET') die ("Bitte das Formular benutzen! Es wurden keine Daten &uuml;bermittelt.");  
                    
                    
                  // Tags entfernen, @ und / umwandeln  
                  foreach($_POST as $key=>$value) $_POST[$key]=(str_replace("@","AT",$value));  
                  foreach($_POST as $key=>$value) $_POST[$key]=(strip_tags($value));  
                  foreach($_POST as $key=>$value) $_POST[$key]=(str_replace("/","SLASH",$value));  
                    
                    
                  $company = $_POST["company"];  
                  $contact_person = $_POST["contact_person"];  
                  $phone = $_POST["phone"];  
                  $mail = $_POST["mail"];  
                  $sector = $_POST["sector"];  
                  $size = $_POST["size"];  
                  $fields = $_POST["fields"];  
                  $education = $_POST["education"];  
                  $degree = $_POST["degree"];  
                  $requirements = $_POST["requirements"];  
                  $soft_skills = $_POST["soft_skills"];  
                    
                  $entry = $_POST['entry'];  
                  $entry_string = implode ($entry); // Warning: implode() [function.implode]: Argument must be an array in [pfad]/danke.php on [diese Zeile]  
                    
                  
                  
                  1. Hi,

                    hier nochmal der komplette Code bis zu der Stelle. Fällt dir was auf?

                    aber sicher.

                    // Tags entfernen, @ und / umwandeln
                    foreach($_POST as $key=>$value) $_POST[$key]=(str_replace("@","AT",$value));
                    foreach($_POST as $key=>$value) $_POST[$key]=(strip_tags($value));
                    foreach($_POST as $key=>$value) $_POST[$key]=(str_replace("/","SLASH",$value));

                    setze vor diesen Unsinn mal error_reporting(E_ALL); und Du erhälst die Erklärung:
                    "Notice: Array to string conversion".

                    Übrigens ist auch die folgende Umkopiererei unsinnig.

                    freundliche Grüße
                    Ingo

        2. aber leider führt auch hier die Zeile
          $entry_string = implode (" und ", $_POST["entry[]"]);
          zu o.g. Fehlermeldung.
          war auch Unsinn...

          Wenn Du im HTML [] angibst, übermittelt der Browser ggfls. ein Array.

          Nein der Browser übermittelt kein Array, das macht - wie schon gesagt - PHP da  raus. Man muss diese halt nur entsprechenden auslesen - wie weiß ich nicht ich kann kein PHP

          Struppi.

  2. Was muss ich ändern?

    Das ist ein PHP Problem. PHP macht aus solchen Felder ungefragt irgendetwas.

    Struppi.

    1. Hai Struppi,

      Das ist ein PHP Problem. PHP macht aus solchen Felder ungefragt irgendetwas.

      oops,
      was ist Dir denn über die Leber gelaufen ... ;-)

      m.b.G. Rolf

      1. Das ist ein PHP Problem. PHP macht aus solchen Felder ungefragt irgendetwas.
        oops,
        was ist Dir denn über die Leber gelaufen ... ;-)

        wieso? stimmt doch.

        Struppi.

  3. Mahlzeit Bernardo,

    Und hier die entsprechende Zeile des auswertenden Skriptes:
    $entry_string = implode (" und ", $_POST["entry[]"]);

    Hmmm, mit Klammern ...?

    Ich habe schließlich festgestellt, dass das Array entry[] schlicht leer ist.

    Hast Du Dir mal angeschaut (z.B. mittels var_dump($_POST) o.ä.), wie das Array, das Du meinst, überhaupt heißt?

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|