为什么在完成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
,因此无法看到修改后的值。使用回应,你应该一切都好。