【问题标题】:codeigniter session doesn't update on ajax requestcodeigniter 会话不会根据 ajax 请求更新
【发布时间】:2017-02-23 11:58:13
【问题描述】:

为什么当 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”。

【问题讨论】:

  • 会话已设置需要刷新页面。然后你会得到会话设置值

标签: javascript php jquery ajax codeigniter


【解决方案1】:

索引部分没有变化

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

【讨论】:

    【解决方案2】:

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

    当你这样做时

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

    基本上是说如果ajax请求成功就提醒hello

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

    为什么会在您的代码中发生这种情况?

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

    【讨论】:

      【解决方案3】:
      alert('<?= $this->session->userdata('greetings'); ?>');
      

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

      alert(response);
      

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

      【讨论】:

      • 我认为这行代码应该在成功的 ajax 请求后呈现?
      猜你喜欢
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 2019-06-09
      • 2013-01-20
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多