4

所以我有这两个页面:pageOne.phppageTwo.php。表格是pageOne.php

<form method="post" action="pageTwo.php"> .... </form>

并进行所有数据收集-验证-插入并发送邮件pageTwo.php(我在两个单独的页面中做所有事情的原因是为了避免在页面刷新时重新提交数据......这是我处理的最简单的方法问题)。到目前为止,一切都运行良好。

现在,我想在表单提交后使用警告框显示成功/失败消息,并尝试了一些没有运气的事情。例如,当我在 上尝试解决方案时pageTwo.php,没有弹出框出现,我认为那是因为我在header该页面顶部有这个

<?php header("Location: http://TestPages.com/pageOne.php");  ?>

<?php
if( $_POST ) {
     //collect the data
     //insert the data into DB
     //send out the mails IFF the data insertion works

     echo "<script type='text/javascript'>alert('It worked!')</script>";
}else
     echo "<script type='text/javascript'>alert('Did NOT work')</script>";
?>

当在 中尝试第二个解决方案pageOne.php,每次刷新页面时都会弹出警报框并收到失败消息,即使数据已插入数据库并已发送邮件。pageOne.php

<html>
<body>
   <?php
   if( $GLOBALS["posted"])  //if($posted) 
      echo "<script type='text/javascript'>alert('It worked!')</script>";
   else
      echo "<script type='text/javascript'>alert('Did NOT work')</script>";
   ?>
   <form method="post" action="pageTwo.php"> .... </form>
</body>

并在pageTwo.php

<?php header("Location: http://TestPages.com/pageOne.php");  ?>

<?php
$posted = false;
if( $_POST ) {
     $posted = true;
     //collect the data
     //insert the data into DB
     //send out the mails IFF the data insertion works
}    ?>

为什么这个简单的事情不起作用:(?有什么简单的方法可以解决吗?谢谢!!

更新

所以我根据drrcknlsn的建议做了一些改变,这就是我到目前为止所拥有的...... pageOne.php

 <?php
   session_start();

   if (isset($_SESSION['posted']) && $_SESSION['posted']) {
      unset($_SESSION['posted']);
      // the form was posted - do something here
  echo "<script type='text/javascript'>alert('It worked!')</script>";
   } else
      echo "<script type='text/javascript'>alert('Did NOT work')</script>";
 ?>
<html> <body>
   <form method="post" action="pageTwo.php"> .... </form>
</body> </html>

pageTwo.php

<?php
session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
     $_SESSION['posted'] = true;

     //collect the data
     //insert the data into DB
     //send out the mails IFF the data insertion works

     header('Location: http://TestPages.com/pageOne.php');
     exit;
} ?>

通过这些更改,现在页面的重定向和成功消息正在工作,但是每次打开/刷新页面时我都会收到失败消息(我知道那是因为尚未设置会话密钥)......我该如何避免呢?再次感谢!!

4

2 回答 2

0

首先,有几点:

  1. 变量(甚至全局变量)不会像您在底部示例中尝试做的那样在请求之间共享。为了$posted在两个页面中都可以访问,您必须以某种方式将其持久化。通常这涉及设置会话变量(例如$_SESSION['posted'] = true;),但它也可以保存在 cookie、数据库、文件系统、缓存等中。

  2. 使用类似的东西if ($_SERVER['REQUEST_METHOD'] === 'POST')而不是if ($_POST). 虽然后者在大多数情况下可能是安全的,但最好养成使用前者的习惯,因为存在一个边缘情况,$_POST即有效POST请求可能为空,并且可能是一个难以追踪的错误。

使用上述建议解决您的问题的一种潜在模式:

pageOne.php:

<?php
session_start();

if (isset($_SESSION['posted']) && $_SESSION['posted']) {
    unset($_SESSION['posted']);

    // the form was posted - do something here
}
?>
...
<form>...</form>

pageTwo.php:

<?php
session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $_SESSION['posted'] = true;

    // do form processing stuff here

    header('Location: pageOne.php');
    exit;
}

// show an error page here (users shouldn't ever see it, unless they're snooping around)
于 2013-06-18T20:28:06.223 回答
-1

看起来这是一个范围问题。利用:

global $posted = true;

http://php.net/manual/en/language.variables.scope.php

于 2013-06-18T19:23:37.667 回答