【问题标题】:How to update a session variable如何更新会话变量
【发布时间】:2011-05-27 23:22:29
【问题描述】:

我正在使用 Ajax 创建一个多步骤表单,并希望根据表单字段的值更改显示的文本。我认为这样做的一个好方法是使用会话变量。如何告诉会话使用新字段值进行更新?目前,会话似乎只存储初始值,但没有对其进行任何更新。因此,如果用户输入“John”作为名字,然后返回并将其更改为“Frank”,则“John”就是存储的名称。

if (!isset($_SESSION)) {
session_start();
$_SESSION['formStarted'] = true;
$_SESSION['timestamp'] = date("M d Y H:i:s");
$_SESSION[$key] = $value;

<p>Your name begins with the letter <?php if ($_SESSION['name'] =='Frank') 
  {echo 'F';}?><p>

jQuery:

$("#form").validate({
   //...
   submitHandler: function(form) {

   //... 
   $(form).ajaxSubmit({               
     type: "POST",
     data: {
       name : $('#name').val(),
//...
     },
     dataType: 'json',
     url: '../ajaxtest.php',
     error: function() {alert("There was an error processing this page.");},
     success: 
       function(data) {
         $('#output1').html(data.message.join(' ')).show(500);
         $('#ouput1').append(data);
//...

ajaxtest.php:

session_start();

$expected = array( 
'name'=>'string', 
//...
);

//...

$return['message']=array();
if(!empty($_POST['name'])){
   $return['message'][] = '' . htmlentities($_POST['name'], ENT_QUOTES, 'UTF-8');
   } 
//...
echo json_encode($return);

【问题讨论】:

  • 我没有看到可能是 PHP 问题的方法。它看起来像一个代码问题。在第 6 行发布提交请求的 ajax 代码,最好是 $key 和 $_SESSION 的一些 var_exports 的输出。
  • 你用什么事件来触发ajax代码?
  • @Jim ajax 代码由提交按钮触发。我在每个部分中使用带有不同部分的手风琴。
  • ajaxtest.php 长什么样子?
  • @Paystey 我发布了 ajax 代码。

标签: php ajax session-variables multipartform-data


【解决方案1】:

您可以像更新简单变量一样更新$_SESSION。 $_SESSION 是一个全局变量,你可以在 session_start() 声明之后访问它。

当您想更改时,不需要unset session,因为您在同一个memory 地址工作。

例如:

index.php

<?php 
   session_start();
   $_SESSION['key'] = 'firstValue';

anotherpage.php

<?php
   session_start();
   session_regenerate_id() // that's not required
   $_SESSION['key'] = 'newValue';

checkpage.php

<?php
   session_start();
   echo $_SESSIOn['key'];

导航

index.php -> anotherpage.php -> checkpage.php // output 'newValue'

【讨论】:

    【解决方案2】:

    如果您想在页面之间创建持久会话,您需要在会话应该应用到的每个脚本的开头调用session_start,而不仅仅是第一个。

    session_start 的 PHP docs 表示如果会话已经存在,该函数将导致会话持续存在。

    【讨论】:

    • @Zach 谢谢。我在每一页的开头都有一个 session_start 。问题似乎是最初输入的值仍然存在,即使它后来被更改。
    • 您确定要在 ajaxtest.php 中设置 $_SESSION['name'] 吗?尝试清除浏览器 cookie 并重新提交表单。如果它是空的,那么您的表单没有设置该变量。另外,尝试var_dump($_SESSION) 以查看整个会话状态。
    • @Zach 我做了一个 var_dump($_SESSION)。除非我刷新页面,否则名称字段的信息似乎不会更新。有没有办法强制会话更新而不刷新页面?
    • Ken,并非没有添加一些 AJAX 调试,但我认为这不值得。出于调试目的,您可以添加 $_SESSION['a'] = $_GET['a'] 之类的内容,并在您更改 URL 中的 ?a=blah 参数时验证会话变量是否更新。
    • 我一直在使用 $_POST,但我可以尝试将其更改为 $_GET 以进行测试。
    【解决方案3】:

    这就是 $_SESSION 应该如何工作的。因为相同的变量可能在不同的页面上使用,并且正在处理中,因此更改值是不可接受的。

    在您的情况下,您正在尝试更新 $_SESSION['name'] 并且需要保持所有其他会话值不变。可能的解决方案是

    <?php
    session_start();
    unset($_SESSION['name']);//remove $_SESSION['name']
    session_regenerate_id();//Copies all other session variables on to new id
    $_SESSION["name"] = $newValue;//Create new session variable 'name'.
    session_write_close();
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多