PHP联系表单:收到空值,没有更新div以发送成功消息



我的问题可能很简单,但我对PHP很陌生,在阅读后尝试将所有内容拼凑在一起,但遇到了一些问题。我已经阅读了这篇文章的可能副本,并尽可能地将这些解决方案放入我的代码中,但没有成功。

目标:

  1. 名称和电子邮件验证(只是不为空且为电子邮件格式)

  2. 发送到指定电子邮件的详细信息

  3. 代码的基本清理(mysqli escape和htmlspecialchars)(理解有PDO,但希望坚持这一点)。

  4. 成功提交后,重新加载具有相同网站的页面(字段为空),但中的消息指示消息已发送或错误。正在尝试标头("位置:")。我不想介绍AJAX,因为我对它一无所知。这可能吗?我也读过关于使用action:"来保持在同一页面上的文章,但如果我的操作是",我该如何运行我的mail.php?还尝试过include:mail.php,或者将我的mail.php重命名为index.php,但仍然没有成功。

当前面临的问题:

  1. 我确实收到了一封电子邮件,但有空字段,即尽管我在表格中输入了一些值,但输入没有反映出来。这些是我收到的值:

来源:

电话:

等等。。。。

  1. 页面直接指向页眉位置。但是div没有用$success变量更新,即没有更新消息显示在div中

请参阅下面的php和html文件:PHP:

<?php
$link = mysqli_connect("host", "username", "password", "dbname");
$NameErr=$EmailErr=$Success="";
$Name=$Email=$Company=$JobTitle=$Phone=$Message="";
function sanitize($link,$entry) {
$entry = mysqli_real_escape_string($link,$entry);
$entry = htmlspecialchars($entry);
return $entry;
}
if (empty($_POST["Name"])) {
$nameErr = "Name is required";
} 
else if (!preg_match("/^[a-zA-Z ]+$/", $Name)) {
$NameErr = "Only letters and spaces allowed"; 
}
else {
$Name = sanitize($link, $_POST["Name"]);
}
if (empty($_POST["Email"])) {
$EmailErr = "Email is required";
}  
else if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$EmailErr = "Invalid email format";
}
else {
$Email = sanitize($link, $_POST["Email"]); 
}
$Company = sanitize($link, $_POST["Company"]);
$JobTitle = sanitize($link, $_POST["JobTitle"]);
$Phone = sanitize($link, $_POST["Phone"]);
$Message = sanitize($link, $_POST["Message"]);
$formcontent=" From: $Name n Phone: $Phone n Company: $Company n Job Title: $JobTitle n Phone: $Phone n Message: $Message";
$recipient = "myemail@gmail.com";
$subject = "Contact Form";
$mailheader = "From: $Email rn";
if (mail($recipient, $subject, $formcontent, $mailheader)){
$Success = "Message sent, thank you for contacting us!";
header("location:Contact.Us.html");
}
else($Success = "Sorry, we are unable to process your submission.");
?>

HTML表单:

<form action="mail.php" method="POST">
<ul class="contact">
<li>
<label for="Name">Name<span class="red">*</span></label>
<p><input id="Name" name="Name" type="text" required/></p>
</li>
<li>
<label for="Email">Email<span class="red">*</span></label>
<p><input id="Email" name="Email" type="email" required/></p>
</li>
<li>
<label for="Company">Company</label>
<p><input id="Company" name="Company"/></p>
</li>
<li>
<label for="JobTitle">Job Title</label>
<p><input id="JobTitle" name="JobTitle"/></p>
</li>
<li>
<label for="Phone">Phone</label>
<p><input id="Phone" name="Phone"/></p>
</li>
<li>
<label for="Message">Message</label>
<p><textarea id="Message" wrap="soft" name="Message"></textarea></p>
</li>
</ul>
<br>
<p><input id="submit" type="submit" value="Send!" /></p>
<div class="success"><? =$Success; ?></div>
</form>

如能解决上述任何问题,将不胜感激。如果您能强调其他可能的安全问题,我们也将不胜感激。谢谢

此外,在实施消毒建议($link,$entry)后,我在电子邮件中收到了变量的输入:公司和职位。

因此,我进一步将所有变量名称更改为第一个字母大写,即$message改为$message,并在表单的输入"id"、"name"one_answers"for"中进行对齐。之后,我设法接收到电话和消息的附加变量的输入。

目前,我只是没有在我的电子邮件中收到变量Name和email的值。也许php代码的"if-else-if"部分有错误。将再次计算并更新。同时,如果有任何建议,请继续更新。谢谢你的帮助!

@headmax指出,您还需要将链接参数传递给消毒函数

function sanitize ($link,  $entry) {
}

原因是如果不将其作为参数传递,$link变量将变得未定义。如果你在上有错误报告,你会在$link上收到通知。

为了将来的目的,无论何时在开发环境中,始终将错误报告作为打开

error_reporting(E_ALL);//place this at the top of the script

编辑

为了显示成功消息并执行重定向,最好使用Ajax。

setTimeOut();//use this to display the success message for a while(pass number of seconds)

然后使用javascript作为执行重定向

window.location.href ='URL';  

使用您的方法,只需将成功变量声明为

$success = '';//add this before you use the variable

最新更新