【问题标题】:PHP: Refresh page on invalid form submitPHP:在提交无效表单时刷新页面
【发布时间】:2014-05-07 07:48:25
【问题描述】:

如何在提交时刷新带有表单的页面,等待提交数据的结果并显示结果。

例如,我有一个带有表单的页面:

<form action="" method="post">
   <input type="name" value="" name="name" placeholder="Your Name" />
   <input type="button" name="submit" value="submit form "/>
</form>

处理表单的引擎是外部的,但在页面中是必需的:

require_once 'form_engine.php';

form_engine.php 检查输入,

$success = "true";
$errorMessage = " ";
$name = $_POST['name'];

if ( $name == '') {
      $errorMessage = 'Please enter your name';
      $success = false;
}
else (if $success = true) {
   // do something with the data

}

表单页面包含结果:

<form action="" method="post">
   <input type="name" value="" name="name" placeholder="Your Name" />
   <input type="button" name="submit" value="submit form "/>
</form>
<p><?php echo $errorMessage; ?></p>

表单提交错误后会显示错误信息吗?还是我必须使用会话来存储它?

【问题讨论】:

  • 是的,使用会话。在这里阅读更多:php.net/manual/en/features.sessions.php
  • 顺便说一句,您的form_engine.php 有一些语法和逻辑错误。 else ( if( $success = true )$success = "true";
  • 这些应该固定为else if (($success == true)$success = true;
  • 如果您在同一页面上提交表单,则不需要使用会话但是在您的情况下,您希望使用 form_engine.php 作为单独的 php 表单提交代码处理程序,因此,您必须使用 session 来存储 $errorMessage 的值,然后您才能在表单中访问它。

标签: php html forms


【解决方案1】:

你需要这样的东西:

if (!isset($_POST['name']))

而不是

if ( $name == 'name')

更新

试试这个,它应该给你的想法:

<?php

    $errorMessage = false;

    if (isset($_POST['submit'])) {

        if (!isset($_POST['name']) || $_POST['name']=='') {
            $errorMessage = 'Please enter your name';
        }
        else {
           // do something with the data
           echo "Success!!";
        }
    }
?>

<form method="post">
   <input type="name" value="" name="name" placeholder="Your Name" />
   <input type="submit" name="submit" />
</form>
<p><?php if ($errorMessage) echo $errorMessage; ?></p>

注意:省略action 属性只会将表单提交到当前页面

注意 2:这里的 PHP 可以很好地存储在另一个页面中。使用require()与直接将代码放入页面是一样的。

【讨论】:

  • 如果我错了,请纠正我,但value="" 不会强制设置它并且只有一个空值吗?编辑:等等.. Html .. 是的,我错了。
  • 这不是问题的重点。我想知道如何刷新页面,而不是检查名称是否已发布。
  • @user3143218 您希望页面何时刷新?
  • 当用户点击提交时。抱歉忘记在示例中添加提交按钮。
  • @user3143218 当用户点击提交时,页面将自动刷新到action中的任何一个url,在你的情况下是当前页面。我不确定我是否理解您的问题。
【解决方案2】:

您可以在 php 端使用重定向:

header('Location: www.mysite.com/index.php');

【讨论】:

    【解决方案3】:

    您似乎对渲染页面的确切过程有些困惑,其中一些评论也是如此。您不需要使用会话来解决此问题。无需在页面请求之间在服务器端存储任何内容,因为用户的浏览器保留了您需要的所有内容,至少在这种情况下是这样。我的猜测是其他人让您提到了“外部引擎”,并认为该表单将提交到不同的站点/页面。


    形成循环

    下图展示了一个典型的表单请求循环:

    您不必这样做,因为编码与个人偏好一样多,但通常人们会设计他们的表单以提交回生成它的相同 URI - 正如您在示例中所做的那样,将操作属性留空。通过这样做,只要您在表单中嵌入您希望传递回服务器端的所有内容(每次用户提交时),这些信息就会被重新发送并在 PHP 中可用。

    显然,您需要警惕哪些信息可能构成敏感信息,因为只有当您的请求受到 HTTPS/SSL 保护时,才应将这些数据写入标记。您还应该过滤/转义任何用户输入,以防止将标记注入您的站点。您可以通过使用htmlentities 来防止许多问题,但是这可能会导致问题,具体取决于您尝试从用户那里获取的值。因为您使用的是双引号 HTML 属性(执行它们的正确方法;)我没有设置 ENT_QUOTES 选项。


    回到正题

    所以在上面的循环中,用户将第一次看到表单,并且在任何后续提交之后,这意味着每次您的 PHP 注意到有错误时,您可以将您的消息添加到页面流中。这种系统的诀窍是,一旦表格完全完成,你到底要做什么。为了摆脱循环,大多数人会使用标题位置调用:

    <?php
    
    require_once 'form_engine.php';
    
    $name = !empty($_POST['name']) ? trim($_POST['name']) : '';
    $name = htmlentities($name);
    
    if ( $success ) {
      header('location: next-step.php');
      exit;
    }
    
    ?>
    <form action="" method="post">
      <input type="name" value="<?php echo $name; ?>" name="name" placeholder="Your Name" />
      <input type="button" name="submit" value="submit form "/>
    </form>
    <?php
    
    if ( $errorMessage ) {
      echo "<p>$errorMessage</p>";
    }
    
    ?>
    


    形成引擎维修

    您还应该根据我上面的 cmets 和 Shekhar Joshi 的回答纠正您的 form_engine.php,尽管我会将标头代码保留在您的引擎逻辑之外,并将该决定留给引擎中需要的代码 - 如上所述可以。

    【讨论】:

    • 哇!谢谢你这么棒的回答。这非常有帮助!
    • @user3143218 ~ 没问题,现在您的下一步是在哪里/如何存储提交的详细信息:) 如果您正在构建一次性表单,您可以在开始之前直接存储到数据库.如果您正在构建表单链(推荐而不是长单数形式..就用户体验而言),最好查看会话或构建一些功能来帮助您聚合用户输入并创建一个动态表单来更新取决于用户所处的“步骤”,即随着用户的进展重写可用的输入。
    • 实际上我正在考虑创建一个类似(“步骤”)的列,当每个步骤完成时,我可以更新值(即 - step1,step2,step3,完成)。这样用户可以离开和回来,他们的进度被存储。然后我可以检查该值是否也以这种方式完成。
    • 我自己会小心这条路线,这不是一个坏主意,但最好围绕存储的用户信息设计表单步骤——而不是基于他们在僵化的页面系统中的感知位置.例如,稍后想象在步骤过程中添加一个新字段。如果您支持人们在完成中途返回(您将需要会话/cookies/localStorage),您希望这些用户回到现在缺失值所在的位置,以便可以填写。如果您一直在计算他们的“位置” " 在每个请求(基于他们缺少的答案)上,您都可以免费获得此行为。
    【解决方案4】:

    可能是,您正在寻找这个! header() 方法。

    $success = true;
    $errorMessage = " ";
    $name = $_POST['name'];
    
    if(isset($_POST['name'])) {
     if ( $_POST['name'] == '') {
          $errorMessage = 'Please enter your name';
          $success = false;
          header('Location: www.something.com/some.php');
     }
     else if ($success == true) {
       // do something with the data
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 2017-04-09
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      相关资源
      最近更新 更多