【问题标题】:Same page processing同页处理
【发布时间】:2011-06-14 13:54:11
【问题描述】:

如何在同一页面上处理表单而不是使用单独的处理页面。现在对于注册、评论提交等,我使用第二个页面来验证数据,然后提交并路由回 home.php。我怎样才能使它在提交时,页面本身验证而不是使用第二个页面。

【问题讨论】:

  • 为什么不只包含第二页?
  • 它的工作有点乱,你不觉得吗?如果它在同一页面上,它会看起来很整洁。

标签: php process verification onsubmit


【解决方案1】:

您可以告诉表单提交给 PHP 自己,然后检查 $_POST 变量以进行表单处理。这种方法非常适合错误检查,因为您可以设置一个错误,然后让表单重新加载用户之前提交的任何信息(即他们不会丢失提交)。

当点击“提交”按钮时,它会将信息发布到同一页面,运行顶部的 PHP 代码。如果发生错误(根据您的检查),表单将为用户重新加载,显示错误以及用户在字段中提供的任何信息。如果没有发生错误,您将显示确认页面而不是表单。

<?php
//Form submitted
if(isset($_POST['submit'])) {
  //Error checking
  if(!$_POST['yourname']) {
    $error['yourname'] = "<p>Please supply your name.</p>\n";
  }
  if(!$_POST['address']) {
    $error['address'] = "<p>Please supply your address.</p>\n";
  }

  //No errors, process
  if(!is_array($error)) {
    //Process your form

    //Display confirmation page
    echo "<p>Thank you for your submission.</p>\n";

    //Require or include any page footer you might have
    //here as well so the style of your page isn't broken.
    //Then exit the script.
    exit;
  }
}
?>

<form method="post" action="<?=$_SERVER['PHP_SELF']?>">
  <?=$error['yourname']?>
  <p><label for="yourname">Your Name:</label><input type="text" id="yourname" name="yourname" value="<?=($_POST['yourname'] ? htmlentities($_POST['yourname']) : '')?>" /></p>
  <?=$error['address']?>
  <p><label for="address">Your Address:</label><input type="text" id="address" name="address" value="<?=($_POST['address'] ? htmlentities($_POST['address']) : '')?>" /></p>
  <p><input type="submit" name="submit" value="Submit" /></p>
</form>

【讨论】:

  • 谢谢迈克尔。正是我一直在寻找的东西。但是,与其说感谢您的提交,不如我如何刷新该页面以便该页面可以加载新信息。现在还不能做 Ajax,编程游戏的新手!
  • 如果您在获取数据之前处理表单(正如我建议的那样),新数据将被自动考虑在内。
  • @AAA 我不明白你的问题。上面的方法是我在 90% 的表单中使用的确切模型,并且几乎是 @NeqO 提供的扩展示例。在“刷新”页面方面,您想要完成什么?
  • @michael 而不是打印消息我如何刷新我的 cmets 页面的页面,以便刷新后可以显示最近提交的评论。
  • @AAA 对不起,我仍然不明白你想要完成什么。我的回答解决了你提出的问题。如果您想要做更多的事情,能否请您改写或使用您的代码添加到您的问题中,以便我们可以尝试进一步帮助您?
【解决方案2】:

最简单的构造就是检测$_POST数组是否不为空

if(isset($_POST['myVarInTheForm'])) {
  // Process the form
}

// do the regular job

【讨论】:

    【解决方案3】:

    您可以检查它是否是页面代码中的 POST 请求,然后检查数据。如果是 GET 请求 - 只需显示表单。

    但请记住,在通过 GET 请求提供的不同页面上显示成功的表单提交结果是一种很好的做法,即任何成功的表单 POST 都应该通过重定向到成功页面来回答。

    【讨论】:

    • 因为当您显示常规页面以响应 POST 时,数据将在页面刷新时重新发送。大多数浏览器会警告用户(大多数用户会对这个警告感到困惑),有些浏览器,比如 Opera,会悄悄地重新发送所有 POST 数据。无论如何,这很可能不是理想的行为。这就是为什么如果请求成功,我建议重定向到结果页面。虽然可以在 POST 之后立即显示验证结果,但如果数据有任何问题并要求用户修复其输入。
    • :-) 我问的唯一原因是因为当您学习时,通常有助于理解为什么要发表特定评论。
    【解决方案4】:

    您当然可以探索查看 AJAX 请求,在其中对处理程序脚本进行异步调用,然后使用成功消息更新发送页面。这给人一种“相同页面处理”的印象,即页面不必刷新。

    这真的取决于你想要达到的效果。

    【讨论】:

    • 谢谢安迪。尝试实现 Ajax。我无法理解它。
    • 网上有很多好的资源,我推荐的网站是net.tutsplus.com - 大量视频演练可以帮助您。
    【解决方案5】:

    @Michael Irigoyen:它工作正常,但在第一次 rn/load 时,它显示:

    “注意:未定义变量:C:\xampp\htdocs\same_page.php 第 28 行出错”

    如何处理这个通知?

    现在明白了: “使用 isset、@ 等来抑制错误……” “奇迹般有效!!!” “现在我将在我的代码上尝试一下……”

    【讨论】:

      【解决方案6】:

      我保存了一条感谢消息并使用会话变量进行了刷新。

      if(!is_array($error)){
          $_SESSION['message'] = 'Thank You!';
          header('Location: yourpage.php');
          exit();
      } 
      

      然后在表格顶部使用这个:

      if(isset($_SESSION['message'])){ 
          echo $_SESSION['message'];
          unset($_SESSION['message'];
      } 
      

      这应该刷新页面并显示消息,然后如果他们刷新页面,会话变量为空,因此不会显示谢谢。这称为闪存消息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-11
        • 1970-01-01
        • 2016-03-17
        • 2012-08-18
        • 1970-01-01
        • 2014-12-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多