你好,我试图把我的表格放在一起3天后,我遇到了一个问题...... 使用表单,它可以验证我何时按提交。这很好,但是一旦按下发送,无效数据仍然会被发送到我的收件箱..所以我最终会收到两封电子邮件..一封包含无效数据,另一封包含错误消息后输入的有效数据已经显示并重新发送。如果有人可以查看我的代码,看看我错过了什么,或者做错了,我会非常感激
<?php
if (isset($_POST['submit'])) {
//check email
if(empty($_POST['email_addr']))
$msg_email = "*";
$email_subject = $_POST['email_addr'];
$email_pattern = '/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/';
preg_match($email_pattern, $email_subject, $email_matches);
if(!$email_matches[0])
$msg2_email = "Please enter a valid email address";
}
// validation complete
if(isset($_POST['submit'])){
if($msg_name=="" && $msg2_name=="" && $msg_email=="" && $msg2_email=="")
$msg_success = "Thankyou for your enquiry";
//send mail
$EmailFrom = "someone@somewhere.com";
$EmailTo = "someone@somewhere.com";
$Subject = "Online contact form";
$email_addr = Trim(stripslashes($_POST['email_addr']));
}
// prepare email body text
$Body = "";
$Body .= "email_addr: ";
$Body .= $email_addr;
$Body .= "\n";
// send email
$success = mail($EmailTo, $Subject, $Body, "From: $EmailFrom");
?>
答案 0 :(得分:2)
我会不使用您的正则表达式来验证电子邮件地址。我会改用filter_var。
if( !filter_var($_POST['email_addr'], FILTER_VALIDATE_EMAIL) ) {
$msg2_email = "Please enter a valid email address";
}
如果过滤器失败,则 filter_var
返回false,否则返回过滤后的电子邮件地址。
最重要的是,如果您的过滤器失败,您可以设置default
值。例如,假设电子邮件地址字段不是必需的,那么请编写另一行代码来检查变量中的null-ness,如:
$isEmailNull = ( $_POST['email_addr'] === NULL) ? NULL : $_POST['email_addr'];
使用filter_var
,您可以将其写为:
$emailAddress = filter_var( $_POST['email_addr'], FILTER_VALIDATE_EMAIL,
array('options' => array(
'default' => null
)
));
如果您的过滤器失败,那么$emailAddress
不是false,而是null。这对于非布尔变量更有意义。
您可以阅读有关filter_var
here
您可以验证/清理IP地址,网址,电子邮件地址,ASCII字符,数字等...而无需使用可能有效或无效的正则表达式。