PHP:无效表单上的刷新页面提交

时间:2014-05-07 07:48:25

标签: php html forms

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

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

<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>

表单提交错误后是否会显示错误消息?或者我是否必须使用会话来存储它?

4 个答案:

答案 0 :(得分:4)

你需要这样的东西:

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()与将代码直接放入页面相同。

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

对于在呈现页面方面发生的确切过程,您似乎有些困惑,就像其中一些评论一样。您不需要使用会话来解决此问题。没有必要在页面请求之间存储任何服务器端,因为用户的浏览器会保留您需要的所有内容,至少在这种情况下如此。我的猜测是其他人带你提到一个外部引擎&#34;并认为该表格将提交到不同的网站/页面。


表格循环

下面是一个显示典型表单请求循环的图表:

a chart showing a typical flow of request and then render for a form

您不必这样做,因为编码与其他任何事情的个人偏好一样多,但通常人们会设计他们的表单以提交回生成它的相同URI - 正如您在示例中所做的那样,将action属性留空。通过这样做,只要您在表单中嵌入要传递回服务器端的所有内容 - 每次用户提交时 - 该信息将重新发送并以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>";
}

?>


表格引擎维修

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

答案 3 :(得分:1)

可能是,你正在寻找这个! 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
}

}