如果字段为空,我无法阻止我的PHP表单发送

时间:2014-07-17 11:24:39

标签: php forms email contact-form formfield

我的表格让我发疯,如果字段是空的,它应该全部设置为停止发送但它总是通过。如果没有任何一个或全部被填满,它将始终显示我的“谢谢”,您的消息已成功发送'信息。

这是我的表格:

<?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 个答案:

答案 0 :(得分:1)

客户端方法在提交表单之前,将required属性添加到您要填充的字段的每个元素中!

服务器端方法

如果您不想在服务器端执行此操作,请检查该字段是否为空并以其他方式重定向:

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

最推荐:任何客户端验证都必须重复服务器端

答案 1 :(得分:1)

惹人注意,但稍微偏离主题

虽然这并没有真正回答你的问题,但我建议你研究邮件注入。每当您决定使用客户端数据发送邮件时,您就会面临风险。你似乎没有足够的消毒数据 我曾经几次检查过类似的代码(用PHP发送邮件或处理联系表单)。关于这一点我可以说些什么,特别是关于邮件注入的问题,可以找到herehere。这两个代码评论都包含可能值得阅读的链接。


无论如何,要回答你的问题:

如果您不希望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。它具有特殊常量来验证和/或清理值。 See which filters are available here

现在这段代码可能看起来很冗长(而且确实如此)。如果需要,可以使用简单的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
}

这将是我的解决问题的方法

答案 2 :(得分:0)

问题相当容易,如果其中一个是空的,你就不会告诉你的脚本停止。

将以下内容添加到您的脚本中:

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

这将在发送错误后停止您的脚本。

答案 3 :(得分:0)

解决方案是:

(...)
///////////////////////////
//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'])) {
(...)