0

在我的控制器的第一个功能中,我使用 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
)

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

$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/并响应浏览器。

4

2 回答 2

0

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

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

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

你可能在做的set_value是:

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

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

于 2013-03-17T16:23:38.287 回答
0

关于这句话,我有两个问题:

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

  1. 这是在新页面加载上吗?
  2. 如果是这样,查询是否再次运行?

我将假设这两个问题的答案都是肯定的,因为您说删除RAND()会给您相同的结果。

RAND()您在查询中使用and的组合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.
}
于 2013-03-17T23:02:24.353 回答