繁体   English   中英

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

[英]PHP: Refresh page on invalid form submit

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

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

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

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

你需要这样的东西:

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

代替

if ( $name == 'name')

UPDATE

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

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

你可以在php端使用redirect:

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

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


形成循环

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

一个图表,显示典型的请求流,然后呈现表单

您不必这样做,因为编码与个人对其他任何事情的偏好一样多,但通常人们会设计他们的表单以提交回生成它的相同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 ,尽管我会将标题代码保留在您的引擎逻辑之外,并将该决定留给引擎中需要的代码 - 如上所述。

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

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM