我有一个简单的联系表格,附有一些PHP验证。但是,当一个字段留空并且表单被抛出其中一个错误时,它会重定向到一个空白页面,只是在空白屏幕上回显错误。我如何将这些错误保存在同一页面上?只有当有人点击发送时,错误才不会立即验证。最理想的是,它只是指向联系表单页面,并添加一个关于表单的文本字符串,告诉用户出现错误。
PHP
<?php if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = trim($_POST["name"]);
$email = trim($_POST["email"]);
$subject = trim($_POST["subject"]);
$message = trim($_POST["message"]);
if ($name == "") {
// header("Location: contact.php");
echo "You must speciy a value for name.";
exit;
}
if ($email == "") {
// header("Location: contact.php");
echo "You must speciy a value for email.";
exit;
}
if ($subject == "") {
// header("Location: contact.php");
echo "You must speciy a value for subject.";
exit;
}
if ($message == "") {
// header("Location: contact.php");
echo "You must speciy a value for message.";
exit;
}
foreach( $_POST as $value ) {
if( stripos($value,'Content-Type:') !== FALSE ){
echo "There was a problem with the information you entered.";
exit;
}
}
if ($_POST["address"] != "") {
echo "Your submission has an error.";
exit;
}
require_once("class.phpmailer.php");
$mail = new PHPMailer();
if (!$mail-> ValidateAddress($email)){
echo "You must specify a valid email address";
exit;
}
$email_body = "";
$email_body = $email_body . "Name: " . $name . "<br>";
$email_body = $email_body . "Email: " . $email . "<br>";
$email_body = $email_body . "Subject: " . $subject . "<br>";
$email_body = $email_body . "Message: " . $message . "<br>";
$mail->setFrom($email, $name);
$mail->addAddress('email@gmail.com', 'Staff');
$mail->Subject = "Contact Form | " . $name;
$mail->msgHTML($email_body);
//send the message, check for errors
if (!$mail->send()) {
echo "There was a problem sending the email: " . $mail->ErrorInfo;
exit;
}
header("Location: contact.php?status=thanks");
exit;
}
?>
HTML
<div id="contact-form">
<div class="container">
<div class="row">
<div class="col-md-6">
<form class="form" method="post">
<p class="name">
<div id="label"><label for="name">Name</label></div>
<input type="text" name="name" id="name" placeholder="John Doe" />
</p>
<p class="email">
<div id="label"><label for="email">Email</label></div>
<input type="text" name="email" id="email" placeholder="mail@example.com" />
</p>
<p class="subject">
<div id="label"><label for="subjext">Subject</label></div>
<select name="subject" id="subject">
<option></option>
<option>Request for Consultation</option>
<option>Ordering a Service</option>
<option>Just to Say Hello</option>
<option>Other</option>
</select>
</p>
<p class="message">
<div id="label"><label for="message">Message</label></div>
<textarea name="message" id="message" placeholder="Write something to us" /></textarea>
</p>
<div id="label" class="address" style="display:none !important"><label for="address">Email</label>
<input type="text" name="address" id="address" placeholder="123 Elm Street" />
<p>If you're a human, please leave this field blank.</p>
</div>
<p class="submit">
<input type="submit" value="Send" class="btn-blue btn-submit"/>
</p>
</form>
</div>
</div>
</div>
答案 0 :(得分:0)
两个基本选项......
(1)将错误消息包含在URL中。
header("Location: contact.php?error=" . urlencode("You must specify a value for name."));
然后,您可以contact.php
在适当的位置添加echo $_GET["error"];
。
这里最大的缺点是滥用的可能性。用户可以更改URL中包含的消息,也可以由任何人更改以显示任何内容。有人恶意可能会更改消息以混淆或滥用用户。
(2)使用会话存储错误消息。
session_start();
$_SESSION["error"] = "You must specific a value for name.";
然后在contact.php
上,在顶部添加session_start();
并在页面的某处添加...
if ($_SESSION["error"] != "") {
echo $_SESSION["error"];
$_SESSION["error"] = "";
}
还有更多方法,但这应该让你开始。
答案 1 :(得分:0)
如果您不熟悉Javascript或AJAX,则可以使用PHP实际执行此操作。你有2个选择:其中一个选项过于复杂,但无论如何我都会给你。
选项#1:
将表格发送到同一页面。
更改表单的操作以将其发送到表单本身所在的任何页面。然后,当您想要执行错误消息时,而不是执行
echo "insert error message here";
对于第一个错误消息,在你的情况下,如果他们的名字为空,你想做
$errormsg = "insert error message here";
对于每个其他验证,您想要
$errormsg .= "insert error message here";
然后,只需回显
$errormsg
如果它不为空。
选项#2
此选项非常过分。它具有与上面相同的概念,但如果您希望将表单放在另一页上,则会增加支持。
确保你有
session_start();
位于表单页面和表单验证php页面的顶部。
现在,对于发生的第一个errormsg:
$_SESSION['errormsg'] = "insert error message here";
对于之后的每个其他错误消息,您可以执行
$_SESSION['errormsg'] .= "insert error message here";
像我们之前一样。