Форма обратной связи PHP, я делаю это неправильно? - PullRequest
2 голосов
/ 13 мая 2010

Я изучаю PHP и пытаюсь написать простой почтовый скрипт. У меня есть функция (checkEmpty), чтобы проверить, заполнены ли все формы и является ли адрес электронной почты действительным (isEmailValid). Я не уверен, как вернуть истинную функцию checkEmpty. Вот мой код:

Когда нажата кнопка отправки:

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;
        }   
    }

Я знаю, что не должен использовать глобальные переменные в функции, я не знаю альтернативы. Сообщения об ошибках отображаются рядом с каждым элементом формы.

Ответы [ 3 ]

0 голосов
/ 13 мая 2010

Я не уверен, что это то, что вы хотите, как я вижу, вы хотите, чтобы $ mail_error, $ message_error и $ name_error были доступны извне функции. Если это так, то вам нужно что-то вроде этого:

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);

теперь вы можете проверить на ошибки

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...
}
0 голосов
/ 13 мая 2010

Прежде всего, использование глобальных является грехом. Вы загрязняете глобальное пространство имен, и это плохая идея, за исключением небольших специальных сценариев и устаревшего кода.

Во-вторых, вы неправильно используете isset - по двум причинам: а) в данном контексте вы передаете переменную $ name в функцию, поэтому она всегда установлена б) пустая проверка, установлена ​​ли переменная или нет

В-третьих, вы должны отделить проверку от создания html.

В-четвертых, вы можете использовать filter_var вместо регулярного выражения, чтобы проверить, правильна ли почта.

Наконец, ваш код может выглядеть так:

<?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;

}
0 голосов
/ 13 мая 2010

Прежде всего, вам следует по-настоящему переосмыслить свою логику, чтобы избежать глобальных переменных.

В любом случае, создайте переменную $ success и установите ее значение true в верхней части ваших функций.Если какой-либо оператор if не удался, установите его в false.Затем верните $ success в нижней части вашей функции.Пример:

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;
}
...