PHP联系表单未提交

3

你好,我之前使用过这个非常简单的php联系脚本,并且成功了,但是当我尝试在一个新的HTML页面上实现它时,表单就无法提交。有人能看到任何明显的错误吗?

这是表单的HTML代码:

<div id="formContainer">

    <form action="form.php" method="post" id="contactForm"> 
    <fieldset>

    <legend>Your details</legend>    

    <label for="name">Name *</label>
    <input type="text" id="name">

    <label for="email">Email *</label>
    <input type="email" id="email">

    <label for="tel">Telephone</label>
    <input type="tel" id="tel">

    </fieldset>

    <fieldset> 
    <legend>Tutoring</legend>

    <label for="type">Type of lesson</label>
    <select name="type" id="type">
    <option>Individual</option>
    <option>Group</option>
    </select>

    <label for="subject">Subject</label>
    <input name="subject" list="subjects" id="subject">
    <datalist id="subjects">
    <option>English</option>
    <option>Biology</option>
    <option>Geography</option>
    </datalist>

    <label for="level">Your level</label>
    <select name="level" id="level">
    <option>Beginner</option>
    <option>GCSE</option>
    <option>A-Level</option>
    <option>University</option>
    </select>

    <label for="hours">Hours/week</label>
    <input type="number" id="hours">

    <label for="info">Additional Information</label>
    <textarea name="info" id="info" rows="10"               cols="6"></textarea>


    </fieldset>

    <input type="submit" name="submit" value="Send" id="sendButton">

    <input type="hidden" name="submit_check" value="1" />   
    </form>

    </div>

以下是简单的PHP脚本:

<?php 

if ($_POST["email"]<>'') { 
    $ToEmail = 'onjegolders@gmail.com'; 
    $EmailSubject = 'Site contact form '; 
    $mailheader = "From: ".$_POST["email"]."\r\n"; 
    $mailheader .= "Reply-To: ".$_POST["email"]."\r\n"; 
    $mailheader .= "Content-type: text/html; charset=iso-8859-1\r\n"; 
    $MESSAGE_BODY = "Name: ".$_POST["name"]."<br>"; 
    $MESSAGE_BODY .= "Email: ".$_POST["email"]."<br>"; 
    $MESSAGE_BODY = "Telephone: ".$_POST["tel"]."<br>";
    $MESSAGE_BODY = "Type: ".$_POST["type"]."<br>";
    $MESSAGE_BODY = "Subject: ".$_POST["subject"]."<br>";
    $MESSAGE_BODY = "Level: ".$_POST["level"]."<br>";
    $MESSAGE_BODY = "Hours required: ".$_POST["hours"]."<br>";
    $MESSAGE_BODY .= "Additional information: ".nl2br($_POST["info"])."<br>"; 
    mail($ToEmail, $EmailSubject, $MESSAGE_BODY, $mailheader) or die ("Failure"); 

?> 

<html>

    <h3>Thanks for your email</h3>
    <h4>I'll get back to you as soon as possible</h4>
    <a href="index.html"><p>Click here to go back to previous page</p></a>

</html>


<?php 
} else { 
?> 

<html>Sorry, this form didn't work</html>

<?php 
}; 
?>

请注意,除非您正在运行suhosin,否则您在这里存在可利用的漏洞;攻击者只需提交带有\r\nCc: blah\r\n\r\nI Love Spam!$_POST[email],您就会将您的主机变成垃圾邮件发送机器。 - sarnold
是的,我很担心这个问题。问题在于,任何具有任何安全功能的脚本都似乎非常复杂,我无法实现它们。我该如何包含suhosin?谢谢。 - onjegolders
5个回答

3
尝试使用

if ( !empty($_POST["email"]) )

不过,您可以使用以下方法检查该页面发布的内容:

echo '<pre>';
var_dump( $_POST );

感谢所有的回复,但不幸的是更改第一个if语句似乎没有帮助。问题可能来自新的HTML5标记吗?这个相同的脚本在我使用的另一个只有基于表格的HTML4表单的网站上运行良好。 - onjegolders
感谢您。我在表单提交后收到以下内容:array(6) { ["type"]=> string(10) "个人" ["subject"]=> string(0) "" ["level"]=> string(8) "初学者" ["info"]=> string(0) "" ["submit"]=> string(4) "发送" ["submit_check"]=> string(1) "1" }抱歉,此表单未能正常工作。 - onjegolders
因为这里没有email字段,所以显然会执行else语句。看看你的HTML代码...前三个输入框中没有name属性。给它们命名并再次测试。 - hsz
好的,我会的,再次感谢。您能否看一下我的代码中出现了什么错误,因为只有最后两个message_body被发送到了电子邮件消息中。 - onjegolders
只是回答自己的问题,虽然我不知道为什么需要它们,但我在除第一个message_body之外的所有地方添加了“。”,现在我可以收到所有邮件。 - onjegolders
显示剩余3条评论

1

将您的form.php更改为以下内容

    <?php 

if ($_POST["email"]<>'') { 
    $ToEmail = 'onjegolders@gmail.com'; 
    $EmailSubject = 'Site contact form '; 
    $mailheader = "From: ".$_POST["email"]."\r\n"; 
    $mailheader .= "Reply-To: ".$_POST["email"]."\r\n"; 
    $mailheader .= "Content-type: text/html; charset=iso-8859-1\r\n"; 
    $MESSAGE_BODY = "Name: ".$_POST["name"]."<br>"; 
    $MESSAGE_BODY .= "Email: ".$_POST["email"]."<br>"; 
    $MESSAGE_BODY = "Telephone: ".$_POST["tel"]."<br>";
    $MESSAGE_BODY = "Type: ".$_POST["type"]."<br>";
    $MESSAGE_BODY = "Subject: ".$_POST["subject"]."<br>";
    $MESSAGE_BODY = "Level: ".$_POST["level"]."<br>";
    $MESSAGE_BODY = "Hours required: ".$_POST["hours"]."<br>";
    $MESSAGE_BODY .= "Additional information: ".nl2br($_POST["info"])."<br>"; 
    mail($ToEmail, $EmailSubject, $MESSAGE_BODY, $mailheader) or die ("Failure"); 

echo &lt;&lt;&lt;EXCERPT

<html>

    <h3>Thanks for your email</h3>
    <h4>I'll get back to you as soon as possible</h4>
    <a href="index.html"><p>Click here to go back to previous page</p></a>

</html>

EXCERPT;

} else { 


echo "<html>Sorry, this form didn't work</html>";

} 
?>

0
你应该尝试这个:
if(!empty($_POST["email"])){
  //your email preparation code
}

不要使用这个:

if($_POST["email" <> ''){
  //your email preparation code
}

! 基本上意味着 ,因此 !empty 意味着 非空


感谢所有的回复,但不幸的是更改第一个if语句似乎没有帮助。问题可能来自新的HTML5标记吗?这个相同的脚本在我使用的另一个只有基于表格的HTML4表单的站点上运行良好。 - onjegolders
可能是这样,但当您单击提交时,它实际上是否正在更改页面?或者只是停留在同一页上?+ 这听起来很愚蠢,但您可能需要关闭输入标记,例如<input type="submit" name="submit" value="Send" id="sendButton" />。您有一些需要关闭的标记。 - ryryan
我原本以为输入标签只需要用>来关闭。不过现在已经改正了,谢谢。但是表单仍然无法正常工作!我应该说,在添加了HTML标记中的“名称”值之后,新页面确实出现了,并且表单可以发送电子邮件,但并非所有字段都显示在邮件中。 - onjegolders
好的,那么表单现在可以工作了吗?你选择了答案,那么它有什么问题呢? - ryryan

0

在你的

if ($_POST["email"] <> '') { 

将其改为

 if ($_POST["email"] != '') { 

0

你也可以直接使用:

if ($_POST["email"]) { 

这个功能类似于!= ""empty()检查。PHP的初衷是为了处理表单。你可以让它探测传入的表单字段。它使用一些字符串的魔法布尔转换规则,大多数情况下会实现你想要的效果。

这种更简单的风格的另一个优点是,如果你启用了E_ALL和E_NOTICE(=debug)error_reporting模式,它会使调试变得更容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接