Я не могу остановить отправку формы php, если поля не заполнены

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

Это моя форма:

<?php 
//////////////////////////
//Specify default values//
//////////////////////////

//Your E-mail
$your_email = 'myemail';

//Default Subject if 'subject' field not specified
$default_subject = 'From My Contact Form';

//Message if 'name' field not specified
$name_not_specified = 'Please type a valid name';

//Message if 'message' field not specified
$message_not_specified = 'Please type a vaild message';

//Message if e-mail sent successfully
$email_was_sent = 'Thanks, your message successfully sent';

//Message if e-mail not sent (server not configured)
$server_not_configured = 'Sorry, mail server not configured';


///////////////////////////
//Contact Form Processing//
///////////////////////////
$errors = array();
if(isset($_POST['message']) and isset($_POST['name'])) {
    if(!empty($_POST['name']))
        $sender_name  = stripslashes(strip_tags(trim($_POST['name'])));

    if(!empty($_POST['message']))
        $message      = stripslashes(strip_tags(trim($_POST['message'])));

    if(!empty($_POST['email']))
        $sender_email = stripslashes(strip_tags(trim($_POST['email'])));

    if(!empty($_POST['subject']))
        $subject      = stripslashes(strip_tags(trim($_POST['subject'])));


    //Message if no sender name was specified
    if(empty($sender_name)) {
        $errors[] = $name_not_specified;
    }

    //Message if no message was specified
    if(empty($message)) {
        $errors[] = $message_not_specified;
    }

    $from = (!empty($sender_email)) ? 'From: '.$sender_email : '';

    $subject = (!empty($subject)) ? $subject : $default_subject;

    $message = (!empty($message)) ? wordwrap($message, 70) : '';

    //sending message if no errors
    if(empty($errors)) {
        if (mail($your_email, $subject, $message, $from)) {
            echo $email_was_sent;
        } else {
            $errors[] = $server_not_configured;
            echo implode('<br>', $errors );
        }
    } else {
        echo implode('<br>', $errors );
    }
}
?>

4 ответа

Не важно, но немного не по теме

Хотя это на самом деле не отвечает на ваш вопрос, я настоятельно призываю вас изучить Mail-инъекцию. Всякий раз, когда вы решите отправить почтовое сообщение с использованием данных клиента, вы подвергаетесь риску. Вы, кажется, недостаточно очищаете данные.
Я пару раз проверял код, который делал похожие вещи (отправка писем с помощью PHP или обработка контактных форм). То, что я должен был сказать по этому поводу, особенно в отношении инъекции почты, можно найти здесь и здесь. Оба обзора кода содержат ссылки, которые также могут быть полезны для чтения.


В любом случае, чтобы ответить на ваш вопрос:

Если вы не хотите, чтобы PHP достиг определенного утверждения (например: mail()) когда что-то идет не так, используйте код, который позволяет вам контролировать поток (остановить выполнение до того, как будет достигнут оператор).
Самый простой и легкий способ сделать это - использовать функцию:

/**
 * Sends mail using data in $data argument
 * requires $fields to be an assoc array where
 * keys == field names, and values = null|| default value
 * null for required fields, default value for optional fields
 * If $data is invalid, an InvalidArgumentException is thrown
 * @param array $data
 * @param array $fields
 * @return bool mail() return value
 * @throws InvalidArgumentException
 */
function sendMail(array $data, array $fields)
{
    foreach ($fields as $field => $val)
    {
        if (isset($data[$field]))
        {//data is set
            if ($field === 'email')
            {//sanitize
                $val = filter_var($data[$field], FILTER_SANITIZE_EMAIL);
                if (!filter_var($val, FILTER_VALIDATE_EMAIL))
                {//if email is not valid, throw exception
                    throw new InvalidArgumentException(
                        sprintf(
                            'invalid %s value: %s',
                             $field,
                             $data[$field]
                        )
                    );
                }
            }
            else
            {//basic, crude sanitation, not enough to protect agains mail injection
                $data[$field] = nl2br(strip_tags(trim($data[$field])));
            }
        }
        else
        {
            if (!$val)
                throw new InvalidArgumentException(
                    sprintf(
                        '%s is a required field',
                        $field
                    )
                );
             $data[$field] = $val;
        }
    }
    return mail('your_email', $data['subject'], wordwrap($data['message'],70), 'From: '.$data['email']);
}

Обратите внимание, что я добавил специальные проверки санитарии / проверки для адресов электронной почты. Функция, которую стоит запомнить filter_var, Он имеет специальные константы для проверки и / или очистки значений. Посмотрите, какие фильтры доступны здесь.

Теперь этот код может показаться довольно многословным (и это так). Если вы хотите, вы можете легко заменить все throw new InvalidArgumentException заявления с простым return 'The error message string'; заявление. Это изменит способ использования этой функции.
С генерируемыми исключениями вы используете функцию следующим образом:

if ($_POST)
{//if there is post data
    try
    {//try - catch block
        //which fields are required, which have default values, defined here
        $validate = array(
            'email'   => null,//required
            'message' => null,//required
            'name'    => 'No Name',//default val,
            'subject' => 'Default subject'//default
        );
        //call function, check what it returns
        if (sendMail($_POST, $validate))
            echo 'Message was sent';//echos if return value was true
        else//if false:
            echo 'failed to send message';
    }
    catch(InvalidArgumentException $e)
    {//if an exception was thrown
        echo 'Error: ', $e->getMessage();//echo the error message
    }
}

Теперь предположим, что мы заменили все throw заявления с простым return 'error-string'; заявление. Теперь использование выглядит так:

if ($_POST)
{
    $validate = array();//same array as above
    $return = sendMail($_POST, $validate);
    if ($return === true)//use type and value check: ===, not ==
        echo 'Message sent';
    elseif ($return === false)
        echo 'Failed to send message';
    else
        echo 'Error: ', $return;//$return is a string: error message returned by function
}

Это был бы мой способ решить вашу проблему

КЛИЕНТСКАЯ СТОРОНА МЕТОД Добавить required Атрибут каждого элемента поля, который вы не хотите заполнять до отправки формы!

СТОРОННЫЙ МЕТОД СЕРВЕРА

Если вы не хотите делать это на стороне сервера, проверьте, не является ли поле пустым, и в противном случае перенаправьте обратно:

if(!(isset($_POST['message']) and isset($_POST['name'])))
    header('locaition: formurl');

Наиболее рекомендуемый: любая проверка на стороне клиента ДОЛЖНА быть повторена на стороне сервера

Решение:

(...)
///////////////////////////
//Contact Form Processing//
///////////////////////////
$errors = array();
if(!empty($_POST['message']) and !empty($_POST['name'])) {
(...)

Если это все еще не так, убедитесь, что поля действительно пусты.

(...)
///////////////////////////
//Contact Form Processing//
///////////////////////////
$errors = array();
if(!empty($_POST['message']) and trim($_POST['message']) and !empty($_POST['name']) and trim($_POST['name'])) {
(...)

Проблема довольно проста: вы не говорите своему сценарию остановиться, если один из них пуст.

Добавьте это в ваш скрипт следующим образом:

if($errors) {
    foreach($errors as $value) {
         echo $value . "<br/>";
    }
    exit();
}

Это остановит ваш скрипт после отправки ошибок.

Другие вопросы по тегам