Frage

Ich lerne PHP und versuche, ein einfaches E -Mail -Skript zu schreiben. Ich habe eine Funktion (checkEmpty), um zu überprüfen, ob alle Formulare ausgefüllt sind und ob die E -Mail -Adresse gültig ist (IsemailValid). Ich bin mir nicht sicher, wie ich true CheckeMpty Funciton zurückgeben soll. Hier ist mein Code:

Wenn die Schaltfläche Senden aufgerufen wird:

if (isset($_POST['submit'])) {

//INSERT FORM VALUES INTO AN ARRAY
$field = array ('name' => $_POST['name'], 'email' => $_POST['email'], 'message' => $_POST['message']);

//CONVERT ARRAY KEYS TO VARIABLE NAMES
extract ($field);
checkEmpty($name, $email, $message);



function checkEmpty($name, $email, $message) {  
    global $name_error;
    global $mail_error;
    global $message_error;

    //CHECK IF NAME FIELD IS EMPTY
    if (isset($name) === true && empty($name) === true) {
    $name_error = "<span class='error_text'>* Please enter your name</span>";
    }

//CHECK IF EMAIL IS EMPTY
if (isset($email) === true && empty($email) === true) {
    $mail_error = "<span class='error_text'>* Please enter your email address</span>";
    //AND IF IT ISN'T EMPTY CHECK IF IT IS A VALID ONE
    } 
    elseif (!isValidEmail($email)) {
        $mail_error = "<span class='error_text'> * Please enter a valid email</span>"; 
    }

    //CHECK IF MESSAGE IS EMPTY
    if (isset($message) === true && empty($message) === true) {
    $message_error = "<span class='error_text'>* Please enter your message</span>";
    }
} 

// This function tests whether the email address is valid  
function isValidEmail($email){
    $pattern = "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$";
    if (eregi($pattern, $email))
        {
            return true;
        } else 
        {
            return false;
        }   
    }

Ich weiß, ich sollte Globale in der Funktion nicht verwenden, ich kenne keine Alternative. Die Fehlermeldungen werden neben jedem Formularelement angezeigt.

War es hilfreich?

Lösung

Zuallererst ist die Verwendung von Global eine Sünde. Sie verschmutzen den globalen Namespace, und dies ist eine schlechte Idee, außer nur wenig Ad-hoc-Skripte und Legacy-Code.

Zweitens missbrauchen Sie die ISSET - aus zwei Gründen: a) In einem bestimmten Kontext passieren Sie die Variable $ Name an eine Funktion, sodass es immer festgelegt ist b) leere Überprüfungen, ob Variable festgelegt ist oder nicht

Drittens sollten Sie die Validierung von der Generierung von HTML trennen.

Viertens können Sie filter_var anstelle eines regulären Ausdrucks verwenden, um zu testen, ob Mail gültig ist.

Zuletzt könnte Ihr Code so aussehen:

<?php

if (isset($_POST['submit'])) {

$fields = array ('name' => $_POST['name'], 'email' => $_POST['email'], 'message' =>     $_POST['message']);

//CONVERT ARRAY KEYS TO VARIABLE NAMES
extract ($fields);  

$errors = validateFields($name, $email, $message);

if (!empty($errors)){

    # error 

    foreach ($errors as $error){

        print "<p class='error'>$error</p>";

    }

} else {

    # all ok, do your stuff

} // if

} // if

function validateFields($name, $email, $post){

    $errors = array();

        if (empty($name)){$errors[] = "Name can't be empty";}
        if (empty($email)){$errors[] = "Email can't be empty";}
        if (empty($post)){$errors[] = "Post can't be empty";}

        if (!empty($email) && !filter_var($email,FILTER_VALIDATE_EMAIL)){$errors[] = "Invalid email";}
        if (!empty($post) && strlen($post)<10){$errors[] = "Post too short (minimum 10 characters)";}

    # and so on...

    return $errors;

}

Andere Tipps

Zunächst sollten Sie Ihre Logik wirklich überdenken, um globale Variablen zu vermeiden.

Erstellen Sie entweder einen variablen $ -Fasserfolg und setzen Sie ihn auf den oberen Rand Ihrer Funktionen. Wenn eine Anweisung fehlschlägt, setzen Sie sie auf false. Dann geben Sie $ Erfolg im Ende Ihrer Funktion zurück. Beispiel:

function checkExample($txt) {
    $success = true;

    if (isset($txt) === true && empty($txt) === true) {
        $error = "<span class='error_text'>* Please enter your example text</span>";
        $success = false;
    }

    return $success;
}

Ich bin mir nicht sicher, ob Sie so wollen, wie ich es sehe, Sie möchten, dass $ mail_error, $ message_error und $ name_error von außerhalb der Funktion zugegriffen werden. Wenn dies der Fall ist, ist das, was Sie brauchen, ungefähr so:

function checkEmpty($name, $email, $message) {  
    $results = false;

    //CHECK IF NAME FIELD IS EMPTY
    if (isset($name) === true && empty($name) === true) {
      $results['name_error'] = "<span class='error_text'>* Please enter your name</span>";
    }

    //CHECK IF EMAIL IS EMPTY
    if (isset($email) === true && empty($email) === true) {
      $results['mail_error'] = "<span class='error_text'>* Please enter your email address</span>";
    //AND IF IT ISN'T EMPTY CHECK IF IT IS A VALID ONE
    } 
    elseif (!isValidEmail($email)) {
        $results['mail_error'] = "<span class='error_text'> * Please enter a valid email</span>"; 
    }

    //CHECK IF MESSAGE IS EMPTY
    if (isset($message) === true && empty($message) === true) {
      $results['message_error'] = "<span class='error_text'>* Please enter your message</span>";
    }

    return $results;
} 
$errors = checkEmpty($name, $email, $message);

Jetzt können Sie Fehler testen

if($errors){
    extract ($errors); // or simply extract variables from array to be used next to form inputs
} else {
    // there are no errors, do other thing if needed...
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top