代码点火器会话不';t根据ajax请求进行更新


codeigniter session doesn't update on ajax request

为什么在完成ajax请求时,codeigniter会话不更新值?

控制器索引:

public function index()
{
    $this->session->set_userdata( 'greetings', 'hello!' );
}

ajax请求:

$.ajax({
    type: "POST",
    url: "<?php echo site_url("set_greeting"); ?>",
    data: data,
    cache: false,
    success: function(response){
        alert('<?= $this->session->userdata('greetings'); ?>');
    }
});

控制器:

public function set_greeting()
    {
        $this->session->set_userdata( 'greetings', 'hi!' );
        echo $this->session->userdata('greetings');
    }

在发出ajax请求后,我检查了firebug的控制台,控制器的响应是"hi!",但ajax成功后的警报值仍然是"hello"。

alert('<?= $this->session->userdata('greetings'); ?>');

此代码将在您的ajax请求之前呈现。。

alert(response);

使用它可以查看您更新的会话值;

索引部分没有变化

public function index()
{
    $this->session->set_userdata( 'greetings', 'hello!' );
}

我假设以下javascript仅加载在index页面上。请参阅我已更改alert部分。

$.ajax({
  type: "POST",
  url: "<?php echo site_url("set_greeting"); ?>",
  data: data,
  cache: false,
  success: function(response){
     alert(response);
     }
    }); 

对于如下所示的set_greeting处理程序更新,

public function set_greeting(){
        $this->session->set_userdata( 'greetings', 'hi!' );
        $greetings = $this->session->userdata('greetings');
        $this->output->set_output($greetings); // Note: set output data here.    
    }

PHP在服务器端运行,所有PHP代码在发送任何内容到客户端之前都会被渲染,因此alert('<?= $this->session->userdata('greetings'); ?>');会被渲染到alert('hello');

当你做

success: function(response){ alert('<?= $this->session->userdata('greetings'); ?>'); }

它基本上是说如果ajax请求成功,就提醒CCD_ 7。

由于PHP在没有页面刷新的情况下无法反映服务器端所做的任何更改,因此您无法看到对服务器会话所做的更改,但如果刷新页面,您将能够看到更改后的值,因为'<?= $this->session->userdata('greetings'); ?>'在服务器上再次呈现,现在其值已更改为hi。(但在您的代码中,您将无法看到会话更改,因为您的索引方法始终将值设置为hello。更改后的值将始终被页面刷新覆盖,但如果您在系统中使用任何其他未设置特定会话值的控制器方法,您可以反映更改。(

为什么代码中会出现这种情况?

发生这种情况是因为您没有对ajax请求使用response。您正确地更改了服务器会话,响应也正确,但由于您没有使用response,因此无法看到修改后的值。使用回应,你应该一切都好。