我的php代码有问题,在发送到我的电子邮件之前验证页面本身的表单。
这是我的PHP,它高于doctype html
<?php
$name = $_POST['name'];
$email = $_POST['email'];
$subjectTitle = $_POST['subjectTitle'];
$comment = $_POST['comment'];
$errormsg = "Invalid Entry";
$validmsg = "Thank you for your message";
if($_POST['submit']) {
if(empty($_POST['name'])) {
$nameError = true;
}
if(empty($_POST['email'])) {
$emailError = true;
}
if(empty($_POST['subjectTitle'])) {
$subjectError = true;
}
if(empty($_POST['comment'])) {
$commentError = true;
}
else if (empty($_POST['name']) || empty($_POST['email']) || empty($_POST['subjectTitle']) || empty($_POST['comment'])) {
$error = true;
}
else {
$to = "EMAIL_ADD_GOES_HERE";
$name = trim($_POST['name']);
$email = trim($_POST['email']);
$subjectTitle = trim($_POST['subjectTitle']);
$comment = trim($_POST['comment']);
$subject = "Contact Form Enquiry";
$messages = "\r\n Name: $name \r\n Email: $email \r\n Subject: $subjectTitle \r\n Comments: $comment";
$headers = "From:" . $name;
$mailsent = mail($to, $subject, $messages, $headers);
if($mailsent) {
$sent = true;
$name = "";
$email = "";
$subjectTitle = "";
$comment = "";
}
}
}
?>
对于我的HTML,为了使查看更容易,我只需要填写表单部分。
<html>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post">
Name: <input type="text" name="name" id="name" value="<?php echo $name; ?>">
<?php if($nameError == true) {echo $errormsg;} ?>
Email: <input type="text" name="email" id="email" value="<?php echo $email; ?>">
<?php if($emailError == true) {echo $errormsg;} ?>
Subject: <input type="text" name="subjectTitle" id="subjectTitle" value="<?php echo $subjectTitle; ?>">
<?php if($subjectError == true) {echo $errormsg;} ?>
Comments: <textarea name="comment" id="comment"><?php echo $comment; ?></textarea>
<?php if($commentError == true) {echo $errormsg;} ?>
</form>
</html>
除了上面说明之外,我的html中没有其他PHP代码。
此验证仅在任何字段留空时有效。它将在页面本身内提示错误消息,并且不会发送电子邮件,这应该是如何工作的。
然而,我面临一个奇怪的问题,我似乎无法找出其背后的原因/理论/逻辑。如果你看看PHP代码,如果我没有其他if语句
else if (empty($_POST['name']) || empty($_POST['email']) || empty($_POST['subjectTitle']) || empty($_POST['comment'])) {
$error = true;
}
验证失败,当用户在textarea中键入时,仍会发送电子邮件。例如,如果用户未填写姓名,电子邮件和主题,但仅填写评论,则仍会发送。但是,一旦我将其他if语句,它就解决了问题。
但主要问题是,preg_match。我希望名称字段只允许空格和字母,我希望电子邮件字段只允许电子邮件。所以,当我尝试将此代码放入时,
if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
$nameError = true;
}
或将其与名称空字段检查结合起来
if (empty($_POST['name']) || (!preg_match("/^[a-zA-Z ]*$/",$name))) {
$nameError = true;
}
它无法正确验证。它的作用是,当用户在名称字段中输入一个数字并填写其他所有内容时,它将显示错误消息以及感谢信息并将其发送到电子邮件,这不是它应该如何工作。 / p>
那么我可以就如何解决问题提供指导吗?我的编码是错误地完成的,而且我想知道为什么如果我在php中的语句没有意义,但我需要它来获得正确的验证。
非常感谢您的阅读,过去6天一直坚持这一点,我真的不知道如何解决这个问题。请帮我。
干杯
答案 0 :(得分:2)
变化
else if (empty($_POST['name']) || empty($_POST['email']) || empty($_POST['subjectTitle']) || empty($_POST['comment'])) {
$error = true;
}
else {
到
if (!$nameError && !$emailError && !$subjectError && !$commentError) {
这样,只有在没有重新测试所有内容的情况下没有遇到错误的情况下,才会发送电子邮件。
或者,只要您设置$error = true
并且只测试$xyzError
,就可以设置if (!$error) {
。
答案 1 :(得分:2)
您的第一个问题是因为您从不检查$nameError
或$commentError
等等...如果您同时设置$error = true;
或检查了所有变量,则可能会丢失if语句。
(我个人使用一个$error
,然后在执行这些事情时将消息附加到单个$message
变量,但这是所有个人偏好)
这可能是第二个问题。你永远不会检查$nameError
。如果您将正则表达式更改为:/^[a-zA-Z]+$/
,那么您也不需要进行双重检查。 +
代替*
表示&#34; 1个或多个字符&#34;。 *
表示&#34; 0个或更多字符&#34;。
对于电子邮件检查,请将filter_var()
与FILTER_VALIDATE_EMAIL
一起使用。请参阅此处的文档:http://php.net/filter_Var
答案 2 :(得分:2)
试试这个。
我做了以下更改:
$_POST
分配的变量。$error
变量。+
代替*
,因此它与空值不匹配,我们不需要进行明确的empty()
检查。同时使用i
修饰符使其不区分大小写,而不是A-Za-z
。else if
逻辑。如果评论不为空,您只进行了所有empty()
次检查。<?php
$name = trim($_POST['name']);
$email = trim($_POST['email']);
$subjectTitle = trim($_POST['subjectTitle']);
$comment = trim($_POST['comment']);
$errormsg = "Invalid Entry";
$validmsg = "Thank you for your message";
$error = '';
if($_POST['submit']) {
if(!preg_match('/^[a-z ]+$/i', $name)) {
$error .= 'Name missing or incorrect<br>';
}
if(empty($email)) {
$error .= 'Missing email<br>';
}
if(empty($subjectTitle)) {
$error .= 'Missing title<br>';
}
if(empty($comment)) {
$error .= 'Missing comment<br>';
}
if ($error) {
echo $error;
} else {
$to = "EMAIL_ADD_GOES_HERE";
$subject = "Contact Form Enquiry";
$messages = "\r\n Name: $name \r\n Email: $email \r\n Subject: $subjectTitle \r\n Comments: $comment";
$headers = "From:" . $name;
$mailsent = mail($to, $subject, $messages, $headers);
if($mailsent) {
$sent = true;
$name = "";
$email = "";
$subjectTitle = "";
$comment = "";
}
}
}
?>