【发布时间】:2017-06-17 23:18:38
【问题描述】:
这是我在方法中的代码:
public function index() {
$pathToFile = $this->session->flashdata( 'img_path' );
if ( $pathToFile ) {
$this->session->set_flashdata( 'file' , $pathToFile );
$this->session->set_flashdata( 'img_path' , $pathToFile );
$data[ 'pageTitle' ] = BLOGER_TITLE . ' دانلود تصاویر';
$data[ 'is_logedin' ] = $this->is_logedin();
$data[ 'banners' ] = $this->_getBanners( 'side' );
$data[ 'img_name' ] = basename( $pathToFile );
$this->load->view( 'download_image' , $data );
} else {
show_404();
}
}
假设用户无法访问此方法,除非访问过另一个方法并在那里设置名为 img_path 的 flashdata,然后重定向到此方法。
到目前为止,此方法按预期完美运行,但如果用户在页面上进行刷新,则会出现错误 404 页面。我想在用户刷新当前页面时保持 flashdata 处于活动状态,所以我应该在索引方法(或构造函数,我都尝试过)中添加一个 $this->session->keep_flashdata('img_path'); 这样做,或者我应该添加另一个 $this->session->set_flashdata('img_path',$pathToFile); 但两种解决方案都没有为我工作。为什么?
为了测试,我在方法的末尾放了一个var_dump($this->session->flashdata('img_path'));。重定向到此方法后,我有 img_path 但刷新后它没有值,所以我尝试在方法中设置 flashdata,我将拥有它,刷新页面后它将设置为 null。还有其他名为file 的flashdata 永远不会获得分配给它的值。为什么会这样?
我的会话配置如下所示,我在autoload.php 中加载了会话库,它在其他控制器和页面中运行良好。
$config['sess_expiration'] = 0;
$config['sess_save_path'] = APPPATH . 'cache/';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
-------------------------------------
更新
-------------------------------------
代码简单一点:
public function test1() {
$this->session->set_flashdata( 'img_path',"abc" );
redirect('imgs/test2','refresh');
}
public function test2() {
$this->session->keep_flashdata( 'img_path' );
$pathToFile = $this->session->flashdata( 'img_path' );
if ( $pathToFile ) {
$this->session->set_flashdata( 'file' , $pathToFile );
$this->session->set_flashdata( 'img_path' , $pathToFile );
var_dump($pathToFile);
} else {
show_404();
}
}
当我转到 localhost/imgs/test1 a 时,它会设置 flashdata 并将我重定向到 localhost/imgs/test2,var_dump(...) 部分将运行并为我详细打印“abc”。
但是刷新页面时,它会显示404 error page,因为flashdata 不再存在,即使我使用了keep_flashdata。
【问题讨论】:
-
您使用 flashdata 的方式并非真正适用。为什么不在会话中设置它,然后在完成后取消设置?
-
如果用户更改控制器,我希望会话被销毁。我认为这是最好的方法,无需在其他控制器构造函数中进行任何额外编码即可删除会话(如果存在)?
标签: php codeigniter session