【问题标题】:PHP form validation on same page with external processing使用外部处理在同一页面上进行 PHP 表单验证
【发布时间】:2013-03-20 21:57:48
【问题描述】:

我正在尝试结束这个具有相同页面验证但外部处理的联系人/报价单。我已经设置了一个变量以进入表单操作,并且当表单验证时,变量/url 从同一页面更改为处理页面。但是,在填写完所有必填字段后,需要单击两次提交按钮来处理表单:将填写所有必填字段,我点击提交,页面重新加载保存的数据变量,然后当我再次点击提交,它终于通过,发送电子邮件并加载感谢页面。我在这里搜索了帖子并尝试了多种方法,但没有找到解决方案。我绝对不是 php 专家,仍然是新手,所以这可能不是完成此任务的最佳方法,但我会很感激有关如何完成此任务的任何想法。这是我所拥有的:

<?php

....

if (empty($Name) && empty($Company) && empty($Address1) && empty($City) && empty($State) && empty($Phone))
{
    echo '<p class="tan">The fields marked with an * are required.</p>';
$Process = 'samepageurl'; 

}

/*else if (empty($Name) || is_numeric($Name))
{
echo '<p class="tan"><b>Please enter your name.</b></p>';
}*/

else if (empty($Company) || is_numeric($Company))
{
echo '<p class="tan"><b>Please enter your company name.</b></p>';
$Process = 'samepageurl'; 

}

else if (empty($Address1) || is_numeric($Address1))
{
echo '<p class="tan"><b>Please enter your address.</b></p>';
$Process = 'samepageurl'; 

}

else if (empty($City) || is_numeric($City))
{
echo '<p class="tan"><b>Please enter your city.</b></p>';
$Process = 'samepageurl'; 

}

else if (empty($State) || is_numeric($State))
{
echo '<p class="tan"><b>Please enter your state.</b></p>';
$Process = 'samepageurl'; 

}

else if (empty($Phone) || ctype_alpha($Phone))
{
echo '<p class="tan"><b>Please enter your phone number.</b></p>';
$Process = 'samepageurl'; 

}

else if (strlen($Phone) < 10 || strlen($Phone) > 12 || ctype_alpha($Phone) || ctype_space($Phone))
{
echo '<p class="tan"><b>Please enter a phone number with an area code.</b></p>';
$Process = 'samepageurl'; 

}

else if (isset($Name) && isset($Company) && isset($Address1) && isset($City) && isset($State) && isset($Phone))
{
$Process = 'processingurl';
}
?> 

<form action="<?php echo $Process; ?>" method="post" class="print"  >
<p><input type="hidden" name="recipient" value="responses@url.com"/> 
<input type="hidden" name="subject" value="Web Site Response"/>
<input type="hidden" name="redirect" value="thankyou.html"/></p>

... form fields ...

</form>    

提前谢谢你!

【问题讨论】:

  • 这就是你的全部代码吗?它看起来不像你分配你的 $_POST 变量,例如$Name = $_POST['name'];
  • 在我看来,您最好在客户端使用 javascript 检查这一点。现在您已经通过验证回到服务器端。如果验证失败,您还可以重定向回表单页面。但不是最好的做事方式。
  • 您绝对应该像丹尼尔所说的那样进行客户端验证,但服务器端验证也很好。有关设置带有验证的非常简单的表单的更多信息,请参阅此处的问题:stackoverflow.com/questions/12158229/php-form-submit
  • 我确实分配了变量——我不确定要发布多少,也不想留下这么多的代码,这很痛苦。禁用客户端验证以排除服务器端验证。我的理解是,如果用户关闭了 javascript,服务器端是故障安全的,所以我想让它正常工作。看来,当所有表单字段变量都被分配时,在使用新的变量分配链接处理到外部文件之前,表单仍在处理自己一次。谢谢你的链接,我去看看!!
  • 客户端验证很方便,但服务器端验证始终是必要的。一个人可能只是在他的服务器上发起一个 POST 操作,而不是在他的页面上,并且服务器不应该相信输入是正确的。

标签: php forms external


【解决方案1】:

首先检查缺失的变量,然后提取并验证变量,然后根据它们提供内容。

<?php
  function verifyPostContains(&$req) {
    global $_POST;
    $missing = array();
    foreach($req as $var => $_) {
      if(!isset($_POST[$var])) {
        $missing[] = $var;
      }
    }
    return $missing;
  }

  $requirements = array('name'=>'','city'=>'','state'=>'',...);
  $missing = verifyPostContains($requirements);

  if(count($missing)>0) {
    $content = formErrorReport($missing);
    sendHeaders();
    echo $content;
    exit();
  }

  // extract, making sure to sanitize
  $name = sanitize($_POST["name"]);
  ...

  $errorHtml = array();
  // validate by reference. Effectively call testName($name).
  if(failsValidation($name, "testName")) {
    $errorHtml [] = generateError(NAME_ERROR, $name);
  } else { $requirements["name"] = $name; }
  if(failsValidation($city, "testCity")) {
    $errorHtml [] = generateError(CITY_ERROR, $city);
  } else { $requirements["city"] = $name; }
  ...

  if(count($errorHTML)>0) {
    generateErrorPage($requirements, $missing, $errorHTML);
  } else { processForm($requirements); }
?>

此代码假定您具有执行需要完成的各种位的函数,并且具有一些用于生成错误 HTML 的字符串常量。

作为新手,您可能想在 Google 上搜索一些教程,这些教程解释了在服务器上使用 PHP 和在客户端使用 JavaScript 进行表单处理。如果您找到一个教程,它为您提供在测试数据时回显错误的代码,例如您的代码,请继续前进。这不是一个好的教程。如果您发现一个在发现一个错误后停止,请继续前进。如果您找到一个告诉您确保 JavaScript 中的值是正确的,然后说“我们已经在客户端验证了这一点,所以我们直接在 PHP 中使用这些值”,请继续前进。寻找解释说明的教程:

  • 使用 JavaScript 确保所有表单字段中都有数据,因此在所有字段都有数据之前,提交按钮处于禁用状态。
  • 确保数据符合您的标准,在 PHP 中,以便那些只是发布到您的服务器而不使用您的页面的人不会因为注入他们不应该做的各种有趣的东西而逃脱
  • 您生成了一个页面,其中解释了所有错误(如果有),并且表单重新填充了错误的数据,但突出显示为错误
  • 如果没有错误,您将处理发布请求。

(如果教程解释说 POST 请求不需要实际生成页面内容作为响应,除了指示 POST 调用是否被接受或拒绝的标头之外,奖励积分。)

【讨论】:

  • 如果这是您希望得到的答案,请记住点击“这回答了我的问题”复选标记,这样您的问题就不会停留在“未回答的问题”列表中 =)
猜你喜欢
  • 2018-11-12
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
相关资源
最近更新 更多