Checkbox mit Mehrfachauswahl durch php versenden

#1
Hallo

Wie versende ich das Ergebnis einer Checkbox mit Mehrfachauswahl durch PHP?
Seit Tagen versuche ich mit verschiedenen Möglichkeiten das Problem in den Griff zu bekommen.

Hier ist mein html Code:
HTML:
<div class="col-md-3">
    <h4>Naturwagen</h4>
    <div class="checkbox"><label><input name="naturwagen[]" type="checkbox" value="schäfer" multiple />Schäferwagen</label></div>
    <div class="checkbox"><label><input name="naturwagen[]" type="checkbox" value="pipo" multiple />Pipowagen</label></div>
    <div class="checkbox"><label><input name="naturwagen[]" type="checkbox" value="zauber" multiple />Zauberwagen</label></div>
    <div class="checkbox"><label><input name="naturwagen[]" type="checkbox" value="boheme" multiple />Bohemewagen</label></div>
</div
Leider finde ich nicht die Lösung zu meiner bisherigen php-Programmierung.

PHP:
<?php 
$error = false;
    if (isset($_POST['submit']))
    {
    $naturwagen = ($_POST['naturwagen']);
    $vorname = trim($_POST['txt_vorname']);
    $fromemail = trim($_POST['txt_email']);
 
    $naturwagen = array (
                 'schäfer' => 'Schäferwagen' ,
                 'pipo' => 'Pipowagen' ,
                 'zauber' => 'Zauberwagen' ,
                  'boheme' => 'Bohemewagen' ,
                 );

        if (!preg_match("/^[a-zA-Z ]+$/",$vorname))
        {
            $error = true;
            $vorname_error = "Bitte geben Sie Ihren Vornamen ein!";
        }
        if(!filter_var($fromemail,FILTER_VALIDATE_EMAIL))
        {
            $error = true;
            $fromemail_error = "Bitte geben Sie eine gültige E-Mail Adresse ein!";
        }
    if (!$error)
        {
            $toemail = "info@meinemail.eu";
            $subject = "Anfrage einer privaten Preisliste Naturwagen ";
            $body = "Folgende Angaben wurden gemacht: \n\n Naturwagen: $naturwagen \n Vorname: $vorname \n  E-Mail: $fromemail";
            $headers = "von: $fromemail\n";
            $headers .= "Reply-To: $fromemail";
            $header = 'From:' . $email . "n";
            $header .= 'Content-type: text/plain; charset=UTF-8' . "rn";


            if (mail ($toemail, $subject, $body, $headers))
                $alertmsg  = '<div class="alert alert-success">
                <p>Vielen Dank für Ihr Interesse, wir senden Ihnen die Preisliste umgehend zu!</p>   
                </div>';
            else
                $alertmsg = '<div class="alert alert-danger text-center">Die &Uuml;bertragung ist fehlgeschlagen, probieren Sie es bitte später nocheinmal!</div>';
        }
    }
    
?>
Wer hat eine Idee, wie ich die Checkboxen senden kann?

Gruß Manfred
 

Sprint

Erfahrenes Mitglied
#2
Als erstes kannst du das multiple rauswerfen. Das gibt es nur beim select. Ansonsten ist der html Teil schon richtig.

Bei php mußt du $naturwagen auch als Array ansprechen, denn als solches wird es ja auch in html verwendet. Geh es mit foreach ($_POST['naturwagen'] as ... ) durch und verarbeite die übergebenen Werte. Die spätere Zuweisung eines Arrays auf $naturwagen ist natürlich Quatsch und muß raus.
 

Sprint

Erfahrenes Mitglied
#4
Was meinst du denn mit "Übertragung mit dem restlichen Formular"? Wenn du die gewählten Boxen mit ECHO ausgeben kannst, liegt doch alles korrekt vor.
 
#5
Mit echo wird es in der linken oberen Ecke der Website ausgegeben.
Da soll es natürlich nicht hin.
Wie Du im oberen php-Block sehen kannst, werden die Inhalte des Formulars per $_POST an eine E-Mail Adresse gesendet und da soll es mit gesendet werden.

Ich hab schon zig verschiedene Skripte probiert, mit dem Ergebnis das in der E-Mail endweder nur eine Selekt-Box (es waren vier ausgewählt), Array oder senden angezeigt wurde.
 
#8
Doch noch nicht gelöst, schade.

Wenn ich keins der Checkboxen aktiviere, wird alles korrekt übermittelt und auch die Erfolgsmeldung wird angezeigt,
aber leider bekomme ich folgende Fehlermeldung: Warning: implode(): Invalid arguments passed in /kunden/242095_70794/rp-hosting/10132/11132/naturwagen/Privat-Kunden.php on line 23
Die Zeile, die die Fehlermeldung beschreibt steht betrifft die obere Zeile von Post#6

Kann bitte jemand helfen?
 

Sprint

Erfahrenes Mitglied
#9
Prinzipiell kannst du das ignorieren. Warnungen sind harmlos und wenn du die Fehlerausgabe unterdrückst, was du auf der endgültigen Seite sowieso machen mußt, erscheint das nur noch in den Logs.

Wenn du das auch noch weghaben willst, kannst du das implode ja in eine if Abfrage packen.

if (!empty($array))...
 
#11
PHP:
<?php 
    $error = false;
    if (isset($_POST['submit']))
    {
        $naturwagen = ($_POST['naturwagen']);
        $naturlodge = ($_POST['naturlodge']);
        $zeltlodge = ($_POST['zeltlodge']);
        $andere = ($_POST['andere']);
        $vorname = trim($_POST['txt_vorname']);
        $nachname = trim($_POST['txt_nachname']);
        $strasse = trim($_POST['txt_strasse']);
        $plz = trim($_POST['txt_plz']);
        $ort = trim($_POST['txt_ort']);
        $telefon = trim($_POST['txt_telefon']);
        $mobil = trim($_POST['txt_mobil']);
        $fromemail = trim($_POST['txt_email']);
        $gesehen = trim($_POST['txt_gesehen']);
       
        $naturwagen = implode(',', $naturwagen);
        if ($naturwagen);

        $naturlodge = implode(',', $naturlodge);
        if ($naturlodge) 

        if (!preg_match("/^[a-zA-Z ]+$/",$vorname))
        {
            $error = true;
            $vorname_error = "Bitte geben Sie Ihren Vornamen ein!";
        }
       
        if (!preg_match("/^[a-zA-Z ]+$/",$nachname))
        {
            $error = true;
            $nachname_error = "Bitte geben Sie Ihren Nachnamen ein!";
        }
        
        if (!$error)
        {
            $toemail = "info@manfredschmidt.eu,info@webdesign-fotografie.eu";
            $subject = "Anfrage einer privaten Preisliste Naturwagen ";
            $body = "Folgende Angaben wurden gemacht: \n\n Naturwagen: $naturwagen \n Naturlodge: $naturlodge \n Zeltlodge: $zeltlodge \n Andere: $andere \n Vorname: $vorname \n Nachname: $nachname \n Strasse: $strasse \n PLZ: $plz \n Ort: $ort \n Telefon: $telefon \n Mobil: $mobil \n E-Mail: $fromemail \n gesehen: $gesehen";
            $headers = "von: $fromemail\n";
            $headers .= "Reply-To: $fromemail";
            $header = 'From:' . $email . "n";
            $header .= 'Content-type: text/plain; charset=UTF-8' . "rn";
    
            if (mail ($toemail, $subject, $body, $headers))
                $alertmsg  = '<div class="alert alert-success">
                                    <p>Vielen Dank für Ihr Interesse, wir senden Ihnen die Preisliste umgehend zu!</p>   
                                </div>';
            else
                $alertmsg = '<div class="alert alert-danger text-center">Die &Uuml;bertragung ist fehlgeschlagen, probieren Sie es bitte später nocheinmal!</div>';
        }
    }
?>

Es ist nicht der ganze Code, aber damit müsste man klar kommen.
 

Sprint

Erfahrenes Mitglied
#12
Ich würde die implode der besseren Übersichtlichkeit wegen neuen Variablen zuweisen. Und diese Zuweisung in die if Abfrage verpacken, ob in dem Array überhaupt was drin ist. Dann dürften die Warnungen auch weg sein.

Die Umschreibung der Umlaute wie in der $alertmsg kannst du dir sparen, wenn du alles auf utf-8 deklarierst und auch die Dateien in utf-8 kodierst. Dann kannst du ganz normale Umlaute verwenden.
 

Alice

Erfahrenes Mitglied
#13
PHP:
   if (isset($_POST['submit']))
   {
       $naturwagen = ($_POST['naturwagen']);
       $naturlodge = ($_POST['naturlodge']);
       $zeltlodge  = ($_POST['zeltlodge']);
       $andere     = ($_POST['andere']);
       $vorname    = trim($_POST['txt_vorname']);
       $nachname   = trim($_POST['txt_nachname']);
       $strasse    = trim($_POST['txt_strasse']);
       $plz        = trim($_POST['txt_plz']);
       $ort        = trim($_POST['txt_ort']);
       $telefon    = trim($_POST['txt_telefon']);
       $mobil      = trim($_POST['txt_mobil']);
       $fromemail  = trim($_POST['txt_email']);
       $gesehen    = trim($_POST['txt_gesehen']);
       
       if (count($naturwagen) > 0)
       {
           $naturwagen = implode(',', $naturwagen);
       }

       if (count($naturlodge) > 0)
       {
           $naturwagen = implode(',', $naturlodge);
       }

       if (!preg_match("/^[a-zA-Z ]+$/", $vorname))
       {
           $errors[] = "Bitte geben Sie Ihren Vornamen ein!";
       }
       
       if (!preg_match("/^[a-zA-Z ]+$/", $nachname))
       {
           $errors[] = "Bitte geben Sie Ihren Nachnamen ein!";
       }

       if (is_array($errors))
       {
           echo '<ul>';

           foreach ($errors as $error)
           {
              echo '<li>'.$error.'</li>';
           }

           echo '</ul>';
       }
           else
       {
           $toemail  = "info@manfredschmidt.eu,info@webdesign-fotografie.eu";
           $subject  = "Anfrage einer privaten Preisliste Naturwagen ";
           $body     = "Folgende Angaben wurden gemacht: \n\n Naturwagen: $naturwagen \n Naturlodge: $naturlodge \n Zeltlodge: $zeltlodge \n Andere: $andere \n Vorname: $vorname \n Nachname: $nachname \n Strasse: $strasse \n PLZ: $plz \n Ort: $ort \n Telefon: $telefon \n Mobil: $mobil \n E-Mail: $fromemail \n gesehen: $gesehen";
           $headers  = "von: $fromemail\n";
           $headers .= "Reply-To: $fromemail";
           $header   = 'From:' . $email . "n";
           $header  .= 'Content-type: text/plain; charset=UTF-8' . "rn";
   
           if (mail($toemail, $subject, $body, $headers))
           {
               $alertmsg = '<div class="alert alert-success"><p>Vielen Dank für Ihr Interesse, wir senden Ihnen die Preisliste umgehend zu!</p></div>';
           }
               else
           {
               $alertmsg = '<div class="alert alert-danger text-center">Die &Uuml;bertragung ist fehlgeschlagen, probieren Sie es bitte später nocheinmal!</div>';
           }
       }
   }
 
#14
Ich würde die implode der besseren Übersichtlichkeit wegen neuen Variablen zuweisen. Und diese Zuweisung in die if Abfrage verpacken, ob in dem Array überhaupt was drin ist. Dann dürften die Warnungen auch weg sein.

Die Umschreibung der Umlaute wie in der $alertmsg kannst du dir sparen, wenn du alles auf utf-8 deklarierst und auch die Dateien in utf-8 kodierst. Dann kannst du ganz normale Umlaute verwenden.
Kannst Du mir sagen wie das geht, das mit dem Implode in Variablen zuweisen, ich finde dazu nichts bei Google.