我的表格让我发疯,如果字段是空的,它应该全部设置为停止发送但它总是通过。如果没有任何一个或全部被填满,它将始终显示我的“谢谢”,您的消息已成功发送'信息。
这是我的表格:
<?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 );
}
}
?>
答案 0 :(得分:1)
客户端方法在提交表单之前,将required
属性添加到您要填充的字段的每个元素中!
服务器端方法
如果您不想在服务器端执行此操作,请检查该字段是否为空并以其他方式重定向:
if(!(isset($_POST['message']) and isset($_POST['name'])))
header('locaition: formurl');
最推荐:任何客户端验证都必须重复服务器端
答案 1 :(得分:1)
惹人注意,但稍微偏离主题
虽然这并没有真正回答你的问题,但我建议你研究邮件注入。每当您决定使用客户端数据发送邮件时,您就会面临风险。你似乎没有足够的消毒数据 我曾经几次检查过类似的代码(用PHP发送邮件或处理联系表单)。关于这一点我可以说些什么,特别是关于邮件注入的问题,可以找到here和here。这两个代码评论都包含可能值得阅读的链接。
无论如何,要回答你的问题:
如果您不希望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'])) {
(...)