仅在更新时设置PHP会话变量

时间:2011-08-09 07:45:28

标签: php forms session

我有一套非常简单的php表单,可以让用户在最终提交信息之前完成3个步骤。

我正在使用会话变量来保留每个页面上的数据,并将每个会话变量拉入可能已经提交的字段,以便表单是“粘性的”。

问题是,一旦他们到达表单的第3部分,如果他们使用提供的链接向后返回,则会出错,因为实际上没有来自第1部分的数据的POST,所以没有任何设置对于会话变量。

为了解决这个问题,我为所有变量添加了以下代码:

    if(!isset($_SESSION['home_tel'])){
        session_register('home_tel');
        $_SESSION['home_tel'] = $_POST['home_tel'];                         
    }

这个工作正常,直到我意识到这意味着如果用户返回到第一页,它将不会将会话更新为已经设置的最新数据,因此认为它不需要做任何事情。

在更新会话变量之前,是否有一种简单的方法可以检查会话值以查看它们是否已更改?或者,只有一种方法可以检查是否已发布,如果是,则创建变量。我试过if(isset($ _ POST ['home_tel']))....等但这似乎不起作用。

任何帮助都会很棒?

非常感谢,Jonny

3 个答案:

答案 0 :(得分:2)

if(isset($_POST['home_tel']) && ($_POST['home_tel'] != $_SESSION['home_tel'])){
    $_SESSION['home_tel'] = $_POST['home_tel'];
}

如果提交了帖子并且新值与旧值不同,则会设置$_SESSION['home_tel']

答案 1 :(得分:0)

您不想再使用session_register了:

  

自PHP 5.3.0起,此功能已被弃用。依靠这个   功能非常沮丧。

http://www.php.net/session_register

答案 2 :(得分:0)

首先,正如您所发现的那样,在会话中存储交易数据是一个坏主意。您已经遇到了后退按钮的问题,当用户在同一会话中打开第二个窗口时,您很快就会发现问题。

  

在更新会话变量之前,是否有一种简单的方法可以检查会话值以查看它们是否已更改?

为什么呢?覆盖会话变量没有任何开销 - 实际上,代码每次都要写会话以阻止它过期。如果必须使用会话变量,只需为字段使用唯一名称,并相应地预填充会话....

$reserved_values=array('email','authenicated_user');
foreach ($_POST as $name=>$val) {
  if (!in_array($name, $reserved_values) 
      && array_key_exists($name, $_SESSION)) {
      $_SESSION[$name]=$val;
  }
}