【问题标题】:PHP Form Server ValidationPHP 表单服务器验证
【发布时间】:2015-07-02 09:45:18
【问题描述】:

所以我用 HTML 为我们公司创建了一个联系页面,然后在提交时执行了一个单独的 mail.php 脚本。我还在联系页面 html 中添加了一个隐藏字段以减少垃圾邮件。我也有页面上的 jQuery 验证,效果很好。但我是 PHP 新手,目前正在努力在我的 PHP 脚本中添加服务器端验证的确切位置以及它应该采用的确切格式。在研究时,似乎有许多不同的方式来格式化代码,所以它有点混乱。

请帮助我更改或添加我需要在现有代码的上下文中添加的代码。所有表单字段是必需的。 HTML 代码是:

<form action="/submit.php" method="post">

<div>First Name:* <input type="text" name="firstname" required></div>

<div>Surname:* <input type="text" name="lastname" required></div>

<div>Email Address:* <input type="text" name="email" required></div>

<div>Telephone Number:* <input type="text" name="telephone" required></div>

<div class="antispam">Leave this empty: <input type="text" name="url">/div>

<div><textarea name="message" required></textarea></div>

<div><select name="enquiry" size="1" required>
 <option value=""> Make a choice:
  <option value="sales">Sales</option>
 <option value="billing">Billing</option>
 <option value="technical">Technical</option>
 <option value="accounts">Accounts</option>
 <option value="business">Business</option>
</select></div>

<div><input type="submit" value="Send" /></div>
</form>

PHP 是这样的

 <?php 
// if the url field is empty 
if(isset($_POST['url']) && $_POST['url'] == ''){

 $youremail = 'me@example.com';

 $body = "This is the result of your contact form:     
First Name: $_POST[firstname]
Last Name: $_POST[lastname]
E-Mail: $_POST[email]
Telephone: $_POST[telephone]
Message: $_POST[message] 
Fav Fruit: $_POST[enquiry]"; 

 if( $_POST['email'] && !preg_match( "/[\r\n]/", $_POST['email']) ) {
     $headers = "From: $_POST[email]";     
 } else {
     $headers = "From: $youremail"; 
 }

 mail($youremail, 'Contact Form', $body, $headers ); } 

header('Location: http://www.example.com/message-sent/');
exit;
?>

我目前遇到的问题是,如果有人禁用了 jQuery,那么每个必填字段都需要进行一些服务器端验证。目前唯一的服务器端验证是应该留空的隐藏字段。

我假设我需要在靠近顶部的 PHP 代码中将所需的编码放置在我的电子邮件之前。我将如何正确格式化?

【问题讨论】:

    标签: php forms validation contact


    【解决方案1】:

    由于所有字段都是必需的,因此在开始处理任何检查 $_POST 变量中的所有值是否存在之前,请保留一个 if 条件

    if(isset($_POST["firstname"]) && isset($_POST["lastname"]) && ...) {
         // Process after validation
    }
    

    您只是在检查错误的 url。希望这会有所帮助。

    编辑:您实际上并没有通过隐藏输入来使其无垃圾邮件。它很容易被看到。实际上你可以做的是添加 CSRF(阅读更多)。基本上这是一个隐藏字段,其值由任何人都不知道的随机字符串生成(显然)。如果此随机字符串匹配,则仅在服务器端进行处理。

    【讨论】:

    • 感谢您的回复,但这并不完全正确。我当前的 php 代码(上)检查 url 字段是否已填写,如果已填写,则“不”发送表单。这是表单所需的默认行为。然后,我希望为表单的所有其他字段添加相反的行为,因此如果未填写这些其他字段,表单也将不会发送..
    • 为什么只检查 url?其他人呢。我可以使用 curl 保持 $_POST['url'] = '' 和 $_POST['email'] = "some actual email" 直接转到您的 submit.php 页面,它会发送邮件,因为您没有检查任何其他邮件字段
    • 这正是我发布问题并要求有人回答的原因。我认为您误读了我当前的 PHP 代码。我的代码当前检查以确保 url 字段为空,如果是则发送表单。这是预期的行为,但我现在想确保其他字段都已完成并且不能留空。关于我需要添加到我的 php 代码中的任何建议(同时请保持现有代码完整。)
    • 我所说的是检查 url 字段是否为空并不是导致发送电子邮件的唯一条件。如果我发送电子邮件 field="abc@example.com" 并保持 url 字段为空 = '' 而不输入其他字段,您的表单将很好地提交(如果 js 被禁用或者我直接 POST 到 submit.php)。但根据您的要求,只有在设置了所有字段后才应发送电子邮件。
    • 是的,我们彼此同意@raj454raj - 这是正确的。目前,您可以将所有“必填字段”留空,或者只填写您想要的字段,表格仍会发送。所以..我正在寻找一种解决方案来制作所需的字段。有人可以建议吗?
    猜你喜欢
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2012-03-05
    相关资源
    最近更新 更多