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 postmy_controller/get_value/

4

2 に答える 2

0

コントローラーを見ずに(詳細に呼びましょうmy_controller。何が起こっているのかと思います:

(1) セッション変数を設定する最初の関数を呼び出し、my_controller/set_value結果set_valueをエコーし​​ます。

show_value(2) 次に、セッション変数を単純にエコーアウトする2 番目の関数を呼び出します。

あなたがしているかもしれないことset_valueは次のとおりです。

1) 現在のセッション変数をエコーアウトする
2) クエリを呼び出してセッション変数を再設定する

この場合、show_value(2 番目の関数) に移動すると、最初の関数でエコーアウトした以前の値ではなく、最近リセットされた値が表示されます。

于 2013-03-17T16:23:38.287 に答える
0

この文について 2 つの質問があります。

しかし、同じコントローラーの別の関数で同じセッションを取得すると、異なる結果が表示されます

  1. これは新しいページの読み込み時ですか?
  2. その場合、クエリは再度実行されますか?

RAND()削除しても同じ結果が得られると言ったので、これらの質問の両方に対する答えは「はい」であると想定します。

RAND()クエリでとの組み合わせを使用していLIMITます。つまり、ランダムな順序で 5 行だけが必要です。つまり、クエリが実行される (およびセッション データが設定される) たびに、結果が異なる可能性が非常に高くなります。

これらの ID を使用して何をしているのか、どのようなデータ セットが必要なのか正確にはわかりません。そのため、これはソリューションにとって 100% 完璧ではないかもしれませんが、このセッション データを 1 回だけ設定する必要がある場合は、次を確認する必要があります。クエリを実行する前に存在する場合。

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 に答える