【问题标题】:CodeIgniter, set_flashdata not working after redirectCodeIgniter,set_flashdata 重定向后不起作用
【发布时间】:2013-08-13 06:44:58
【问题描述】:

set_flashdata 仅在一次重定向后无法直接工作。

我在这个过程中使用了一个控制器——Profilers 的控制器。它处理成员确认过程,并在重定向上显示登录页面。流程如下:

  1. 本次会话 set_flashdata('topic', 'newmember')

  2. 重定向('登录')

  3. 路由 ['login'] = 'profilers/signIn'

  4. topic = $this session flashdata ('topic')

我已经关闭了所有数据库会话配置以进行更清晰的调试,即使会话库在配置中打开,我仍然开始调用它,这似乎也不起作用。

这是我的代码。如您所见,我将路径信息发送到日志文件 path.log:

在控制器 Profilers 中,函数 confirmMember:

public function confirmMember()
  {
    //use_ssl();
    $this->form_validation->set_rules('handle', 'Unique Member Name', 'trim|xss_clean|required|min_length[5]|max_length[30]');
    $this->form_validation->set_rules('confirmation', 'Confirmation Code', 'trim|xss_clean|required|min_length[20]|max_length[20]|alpha_numeric');

    if ($this->form_validation->run() === FALSE) {echo "here";exit;
      $data['handle']=$this->input->post('handle');
      $data['confirmation']=$this->input->post('confirmation');
      $this->load->view('signing/defaults/header',$data);
      $this->load->view('defaults/heading',$data);
      $this->load->view('defaults/banner');
      $this->load->view('defaults/banner_right');
      $this->load->view('member/temp/index',$data);
      $this->load->view('defaults/footer',$data);
    } else {

      $post = $this->input->post(NULL,TRUE);
      $data['member'] = $this->Signing_model->model_confirmMember($post);

  if ($data['member']['confirmed']!==FALSE) {
    /* PATH CHECK */ 
    error_log("member confirmation not false\n",3, LOG_DIR.'path.log');
    unset($post);
    $this->session->sess_destroy();
    $this->session->set_flashdata('topic', 'newmember');
    // $this->session->keep_flashdata('topic');
    redirect('login','refresh');
  } else {
    /* PATH CHECK */ 
    error_log("member confirmation IS FALSE\n",3, LOG_DIR.'path.log');
    $this->load->view('member/temp/index',$data);
  }

我的日志文件显示该路径使用正确的路径并显示“会员确认不假”。

我已经尝试过启用 keep_flash 数据(我认为这不起作用,因为没有其他重定向)并关闭。

我也尝试过不使用“刷新”的重定向。

在 config/routes.php 中:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

$route['join'] = 'profilers/joinUp';
$route['login'] = 'profilers/signIn';
...

登录页面使用Profilers Controller,登录功能如上图:

public function signIn()
{
  $topic = $this->session->flashdata('topic');
  if (isset($topic)) {
      $message = "topic is set. topic = ".$topic."\n";
      if ($topic!==FALSE) {
              error_log("flash var topic is not false\n", 3, LOG_DIR.'path.log');
      } else {
              error_log("flash var topic is FALSE\n", 3, LOG_DIR.'path.log');
      }
  } else {
      $message = "topic is NOT set\n";
  }
  error_log($message,3,LOG_DIR.'path.log');

  exit;
  ...
  ...
}

日志文件显示主题已设置但为假。

"flash var 主题为 FALSE"

"主题已设置。topic = "

当然没有设置主题变量,因为它是 FALSE。

如您所见,我已将获取闪存数据功能移至控制器功能的开头,以绕过可能损坏数据的任何内容。

【问题讨论】:

  • 如果您在confirmMember(){} 中设置它之后(以及重定向之前)立即尝试使用echo $this-&gt;session-&gt;flashdata('topic');die(); 对其进行调试,您会得到任何数据吗?另外,是否只有闪存数据不起作用?如果您尝试使用会话变量,它会起作用吗?
  • 没有。没有。感谢您的快速回复。
  • 在控制器的最顶部,紧跟在 session_start();,请尝试添加。
  • 顺便说一句,isset($topic) 将始终为真,即使它为空。这是因为您在之前的行上创建了变量,因此它存在。你最好检查一下if($topic){
  • 感谢 Jeemusu 的帮助。那确实改变了事情,而且一定是问题所在。它现在显示了一些我必须克服的错误。一旦我解决了这些错误,我会尽快回复。

标签: codeigniter flash session


【解决方案1】:

您可能需要在销毁会话后重新启动它。

尝试在致电sess_destory() 后添加此内容:

$this-&gt;session-&gt;sess_create()

或者,您可以避免破坏会话,并 unset() 您希望摆脱的值。

【讨论】:

  • 感谢 Jeemusu 的帮助。另外我应该注意到,我们发现在重定向之前在同一个文件中调用 flashdata 可能不起作用。
猜你喜欢
  • 2015-09-15
  • 1970-01-01
  • 2012-10-18
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
相关资源
最近更新 更多