我的问题可能很简单,但我对PHP很新,并且在阅读后尝试将所有内容拼凑在一起,但遇到了一些问题。我已经阅读了这篇文章的可能重复内容,并尝试尽可能地将这些解决方案放入我的代码中,但无济于事。
目标:
姓名和电子邮件验证(仅非空和电子邮件格式)
详细信息已发送至指定的电子邮件
代码的基本消毒(mysqli escape和htmlspecialchars)(了解有PDO,但我想坚持这一点)。
成功提交后,重新加载具有相同网站的页面(字段为空),但显示消息已发送或错误。我正在尝试标题(“位置:”)。我不想介绍AJAX,因为我不知道它。这可能吗?还阅读了关于使用动作:“”保持同一页面,但如果我的动作是“”,如何运行我的mail.php?还试过包括:mail.php,或者将我的mail.php重命名为index.php,但仍然没有成功。
当前面临的问题:
来自:
电话:
等...
请参考下面我的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 \r\n";
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'和'for'中对齐。之后,我设法接收了Phone和Message的附加变量的输入。
目前,我没有在电子邮件中收到变量名称和电子邮件的值。也许我的'if else if'部分的php代码出错了。将再次计算和更新。在此期间,如果有任何建议,请继续更新。谢谢你的帮助!
答案 0 :(得分:0)
正如@headmax指出的那样,您还需要将link参数传递给sanitize函数
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