我的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;
}
它没有正确验证。它的作用是,当用户在名称字段中输入一个数字并填写其他所有内容时,它将显示错误消息以及感谢信息并将其发送到电子邮件,这不是它应该如何工作。
那么我可以就如何纠正问题提供指导吗?我的编码是否做错了我也想知道为什么如果我在php中的语句没有任何意义但我需要它来获得正确的验证。
非常感谢您的阅读,过去6天一直坚持这一点,我真的不知道如何解决这个问题。请帮我。
干杯
试试这个。
我做了以下更改:
$_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 = "";
}
}
}
?>
更改
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) {
。
你的第一个问题是因为你从不检查$nameError
或$commentError
等...如果你设置$error = true;
或检查所有变量,你可能会丢失if语句。
(我个人使用一个$error
然后在做这些事情时将消息附加到单个$message
变量,但这都是个人偏好)
这可能也是第二个问题。你永远不会检查$nameError
。如果你将你的正则表达式更改为:/^[a-zA-Z]+$/
,你也不需要仔细检查。 +
而不是*
说“1个或更多字符”。 *
表示“0个或更多字符”。
对于电子邮件检查,请使用filter_var()
和FILTER_VALIDATE_EMAIL
。请参阅此处的文档:http://php.net/filter_Var