• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Es regnet, ist neblig und kalt, alle sind krank und der Chef wird zunehmend cholerisch. Das Thema des Monats ist also folgerichtig --> Das Grau(en)
    Wir sind gespannt, war Euch dazu einfällt! Zum Wettbewerb --> Klick

PHP Problem

mschoening

Gelbe Schleswiger Reinette
Registriert
21.02.07
Beiträge
1.764
Hi,
ich bin gerade dabei ein AJAX Kontaktformular zu basteln und bin fast fertig. Mir fehlt noch eine kleine "validation".

Das mailer.php script was als action im HTML Formular deklariert ist sieht folgendermaßen aus:

Code:
<?php
    include('functions.php');

    if ($_POST['first_name']=='' || strlen($_POST['first_name'])<3) {
        $errors[] = 'First name is required and must contain 3 characters or more.';
    }
    
    if (valid_email($_POST['email'])==FALSE) {
        $errors[] = 'Please supply a valid email address';
    }
    
    if(is_array($errors)) {
        echo '<p class="error">The following errors occured:';
        while (list($key,$value) = each($errors)) {
            echo '<span class="error">'.$value.'</span>';
        }
    }
    
    else {
        $to = "// Recipient";
        $subject = "// Subject";
        $name_field = $_POST['first_name'];
        $email_field = $_POST['email'];

        $body = "From: $name_field\n E-Mail: $email_field";

        mail($to, $subject, $body);
    } 
?>
Es ist eine gekürzte Version des "scripts" aber man erkennt was gemeint ist. Es sendet Emails und validiert auch alle Felder korrekt. Jetzt würde ich aber gerne noch in dem letzten schritt wo die else-Schleife aufgeht eine Schleife einbauen die kontrolliert ob die mail()-Funktion auch richtig ausgeführ wurde. Also so etwas in der Art:

Code:
else {
    if {
        $to = "[email protected]";
        $subject = "Form Tutorial";
        $name_field = $_POST['first_name'];
        $email_field = $_POST['email'];
        $message = $_POST['message'];

        $body = "From: $name_field\n E-Mail: $email_field\n Message:\n $message";

        mail($to, $subject, $body);
    }

    else {
        echo "Klappt nicht.";
    }
}
Leider funktioniert das dann nicht und er gibt mir folgenden Fehler:
Code:
Parse error: syntax error, unexpected '{', expecting '(' in /home/17673/domains/test.maximilianschoening.com/html/validation/mailer.php on line 32
 

xenxox

Macoun
Registriert
08.02.05
Beiträge
122
Mail liefert einen boolean zurück (siehe doku), du kannst also direkt auf mail() prüfen.
 
  • Like
Reaktionen: mschoening

XeN

Apfel der Erkenntnis
Registriert
09.08.07
Beiträge
735
Code:
else {
    if {
        $to = "[email protected]";
        $subject = "Form Tutorial";
        $name_field = $_POST['first_name'];
        $email_field = $_POST['email'];
        $message = $_POST['message'];

        $body = "From: $name_field\n E-Mail: $email_field\n Message:\n $message";

        mail($to, $subject, $body);
    }

    else {
        echo "Klappt nicht.";
    }
}

Könntest es mal so versuchen:

Code:
if (mail(....)) {
   echo "funktioniert";
}else{
   echo "funktioniert nicht";
}
 
  • Like
Reaktionen: mschoening

mschoening

Gelbe Schleswiger Reinette
Registriert
21.02.07
Beiträge
1.764
Hi,
bin jetzt mit dem script soweit fertig. Gibt es noch irgendwelche verbesserungs Vorschläge (vielleicht kann man das mit dem $recipient noch vereinfachen?):

Code:
<?php
    include('functions.php');

    if ($_POST['first_name']=='' || strlen($_POST['first_name'])<3) {
        $errors[] = 'First name is required and must contain 3 characters or more.';
    }

    if ($_POST['last_name']=='' || strlen($_POST['last_name'])<3) {
        $errors[] = 'Last name is required and must contain 3 characters or more.';
    }
    
    if (valid_email($_POST['email'])==FALSE) {
        $errors[] = 'Please supply a valid email address';
    }
    
    if ($_POST['email']!=$_POST['re_email']) {
        $errors[] = 'The two email addresses must match.';
    }
    
    if ($_POST['recipient']=='0' ) {
        $errors[] = 'Please select a recipient.';
    }
    
    if ($_POST['message']=='' || strlen($_POST['message'])<3) {
        $errors[] = 'A message is required and must contain 3 characters or more.';
    }
    
    if (is_array($errors)) {
        echo '<p class="error">The following errors occured:';
        while (list($key,$value) = each($errors)) {
            echo '<span class="error">'.$value.'</span>';
        }
    }
    
    else {
        $subject = "AJAX Mailing Form";
        $first_name_field = $_POST['first_name'];
        $last_name_field = $_POST['last_name'];
        $email_field = $_POST['email'];
        $recipient = $_POST['recipient'];
        $message = $_POST['message'];
        
        if ($recipient == "1") {
            $to = "[email protected]";
        }
        if ($recipient == "2") {
            $to = "[email protected]";
        }
        if ($recipient == "3") {
            $to = "[email protected]";
        }
        if ($recipient == "4") {
            $to = "[email protected]";
        }
        if ($recipient == "5") {
            $to = "[email protected]";
        }
        
        $body = "From: $first_name_field $last_name_field\n E-Mail: $email_field\n Message:\n $message";

        if (mail($to, $subject, $body)) {
            echo "Your message has been sent to $to.";
        }
        
        else {
            echo "Your message has not been sent. Please try again.";
        }
    } 
?>
 

XeN

Apfel der Erkenntnis
Registriert
09.08.07
Beiträge
735
Jep, weil das "break;" in der jeweiligen abfrage fehlt.

Das break besagt das er an diesem Punkt die Case schleife verläßt. Sonst läuft er immer bis unten durch.

also immer

case "wert":
$variable = "zugewiesenerwert";
break;
 

MrNase

Champagner Reinette
Registriert
11.01.05
Beiträge
2.656
Zu empfehlen wäre am Ende auch noch sowas wie:


Code:
default:
$to = "[email protected]";
break;

Wenn der Empfänger z.B. weder 1 noch 5 ist dann definierst du da was dann passieren soll. Du kannst natürlich auch das $to leer machen und die Mail dann gar nicht abschicken.
 

mschoening

Gelbe Schleswiger Reinette
Registriert
21.02.07
Beiträge
1.764
Zu empfehlen wäre am Ende auch noch sowas wie:


Code:
default:
$to = "[email protected]";
break;
Wenn der Empfänger z.B. weder 1 noch 5 ist dann definierst du da was dann passieren soll. Du kannst natürlich auch das $to leer machen und die Mail dann gar nicht abschicken.

Hi,
thanks ist aber nicht nötig. Das Formular wird vor dem abschicken ja eh validiert und man kann ohne einen "recipient" auszuwählen die Mail gar nicht abschicken...