在我的控制器的第一个功能中,我使用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/
并回复浏览器。
答案 0 :(得分:0)
不看你的控制器(让我们详细称它为my_controller
,我想可能会发生的事情是:
(1)您调用第一个函数my_controller/set_value
,其中set_value
设置会话变量并回显结果。
(2)然后,您调用第二个函数show_value
,它只是回显会话变量。
您在set_value
中可能会做的是:
1)回显当前会话变量
2)调用查询并重新设置会话变量
如果是这种情况,那么当你转到show_value
(第二个函数)时,你正在查看最近重新设置的值,而不是你在第一个函数中回显的先前值。
答案 1 :(得分:0)
我对这句话有两个问题:
但如果我在同一个控制器的另一个函数中检索相同的会话,它会显示不同的结果
我将假设这两个问题的答案都是肯定的,因为您说删除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.
}