CodeIgniter会话在不同的函数中显示不同的输出

时间:2013-03-17 15:21:57

标签: codeigniter

在我的控制器的第一个功能中,我使用CI活动记录

从mysql表中获取随机记录
$query = $this->db->query("SELECT DISTINCT * FROM questions WHERE `level` = '1' ORDER BY RAND() limit 0,5");
$result = $query->result_array();

并将会话结果保存为

// saving questions id in session
for($i = 0; $i < count($result); $i++)
{
    $session['questionsId'][] = $result[$i]['qId'];
}
$this->session->set_userdata($session);

如果打印会话变量显示输出如:

$qIds_o = $this->session->userdata('questionsId');
var_debug($qIds_o);

Array
(
    [0] => 5
    [1] => 9
    [2] => 3
    [3] => 6
    [4] => 11
)

但如果我在同一个控制器的另一个函数中检索相同的会话,它会显示不同的结果

$qIds = $this->session->userdata('questionsId');
var_debug($qIds);

Array
(
    [0] => 2
    [1] => 8
    [2] => 6
    [3] => 3
    [4] => 5
)

如果我从mysql查询中删除ORDER BY RAND(),如:

$this->db->query("SELECT DISTINCT * FROM questions WHERE `level` = '1' limit 0,5");

它在两个函数中显示相同的会话数组。很奇怪。

请指出出错的地方......

这是我的控制器脚本:

public function set_value(){
    $query = $this->db->query("SELECT DISTINCT * FROM questions WHERE `level` = '1' ORDER BY RAND() limit 0,5");
    $result = $query->result_array();

    // saving questions id in session
    for($i = 0; $i < count($result); $i++)
    {
        $session['questionsId'][] = $result[$i]['qId'];
    }
    $this->session->set_userdata($session);
    $qIds_o = $this->session->userdata('questionsId');
    var_debug($qIds_o);
}

public function get_value(){
    $qIds = $this->session->userdata('questionsId');
    var_debug($qIds);
}

我在页面加载时调用set_value(),一旦页面加载,我使用get_value()调用AJAX post,只需点击my_controller/get_value/并回复浏览器。

2 个答案:

答案 0 :(得分:0)

不看你的控制器(让我们详细称它为my_controller,我想可能会发生的事情是:

(1)您调用第一个函数my_controller/set_value,其中set_value设置会话变量并回显结果。

(2)然后,您调用第二个函数show_value,它只是回显会话变量。

您在set_value中可能会做的是:

1)回显当前会话变量
2)调用查询并重新设置会话变量

如果是这种情况,那么当你转到show_value(第二个函数)时,你正在查看最近重新设置的值,而不是你在第一个函数中回显的先前值。

答案 1 :(得分:0)

我对这句话有两个问题:

  

但如果我在同一个控制器的另一个函数中检索相同的会话,它会显示不同的结果

  1. 这是否在新页面加载?
  2. 如果是,查询是否再次运行
  3. 我将假设这两个问题的答案都是肯定的,因为您说删除RAND()会给您相同的结果。

    您在查询中使用了RAND()LIMIT的组合,这意味着您只需要按随机顺序排列五行。这意味着每次运行查询(并设置会话数据)时,结果都可能非常

    我不确切知道您正在使用这些ID以及您需要哪种数据集,因此对于您的解决方案而言,这可能不是100%完美,但如果您只需要设置此会话数据一次,你应该在运行查询之前检查它是否存在。

    if ($this->session->userdata('questionsId') === FALSE)
    {
        // Run your query and set your session data here.
        // Note that in CI 3.0, Session::userdata()
        // will return NULL if empty, not a boolean.
    }