php - Codeigniter、セッション内の配列、特定のキーのセッション内の配列の値を変更する

okwaves2024-01-25  12

セッション内に数値の配列を含む変数があります。その変数内の特定の数値を変更したいと考えています。 私のセッション:

                $user_data = array(
                    'user_id' => $user_id,
                    'username' => $username,
                    'logged_in' => true,

                    // 20 slots, the counting starts from 0, the last slot's position
                    // is 19.
                    'slots_id' => array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
                );

つまり、slots_id はアクセスしたい変数です。最後の番号を変更する必要があります。私のコントローラーには次のものがあります。

$this->session->set_userdata('slots_id'[19], 100);

ここでは、最後のスロットの値を 100 に設定しようとしています。そこに置くとエラーが発生します。

A PHP Error was encountered Severity: Notice Message: Uninitialized string offset: 19

現在の状況では Google は私を助けてくれませんでした。お時間をいただきありがとうございました。

$this->session->set_userdata( を試してみましたか?'slots_id[19]', 100); ?コードは「slots_id」の位置 19 を更新しようとしています。文字列であり、slots_id が 8 文字の文字列であるため、範囲外になります。私が提案している小さな変更は、インデックス 19 のスロット ID 配列の値を変更するものです。

– ハビエル・ラルーレ

2020 年 9 月 3 日 22:38

'slots_id[19]' 「slots_id[19]」を渡すだけです文字列リテラルとして。このメソッドのドキュメントを見ると、2 引数形式の最初の引数は、検索しようとしているキーの文字列です。 codeigniter.com/userguide3/libraries/sessions.html

– パートタイムカメ

2020 年 9 月 3 日 22:46



------------------------

問題を回避する 2 つの方法:

$this->session->set_userdata('slots_id'[19], 100); $slots_id 配列のインデックス 19 の配列要素に値 100 を割り当てようとしていません。 「slots_id」文字列の 20 番目の文字 (インデックス 19) として値 100 を設定しようとしていますが、これは範囲外になります。

次のことを試してみてください: $this->session->set_userdata('slots_id[19]', 100);

または、セッションから完全な要素を削除し、更新してリセットすることもできます。t:

$aux = $this->session->userdata('slots_id');
$aux[19] = 100;
$this->session->unset_userdata('slots_id');
$this->session->set_userdata('slots_id', $aux);

これはもう少しコードが多いですが、セッション データをその場で更新するのではなく、常に置換することをお勧めします。

3

それは機能しますが、何らかの理由で、コードの使用中に変更した数値を除いて、他のすべての数値がゼロになります。他に何かアイデアはありますか?ところで、お時間を割いてご回答いただき、ありがとうございました。

– ビクターザビースト

2020 年 9 月 3 日 23:42

@VictorTheBeast どちらへ行きましたか?セッション データ内の配列を直接編集しますか、それとも配列を取得して変更し、その後セッション内の配列要素を設定解除または設定しますか?

– ハビエル・ラルーレ

2020 年 9 月 4 日 13:36

私の間違いです。毎回 for ループを使用して配列を設定していたため、配列には常に単一のインデックスが存在していました。今回はループが終了したときに配列を設定したので、すべてのスロットが必要な場所に配置されました。あなたのアドバイスに従い、すべてのスロットを一度に設定しましたが、f の 1 つのインデックスだけを更新していませんそうだね。あなたは私に良いアドバイスをくれたので、私の問題は解決しました。お時間をいただきありがとうございます。

– ビクターザビースト

2020 年 9 月 4 日 17:34



------------------------

PHP の初期化されていない文字列オフセット エラーについては、膨大な量のドキュメントがあります。このエラーが発生するのは、配列のインデックス 19 を参照しているのではなく、文字列のインデックス 19 を参照しているためです。このインスタンスの 'slots_id' はまさにそれです。 「slots_id」の長さは 8 文字です。これは、7 を超えるインデックスは実際には未定義であることを意味します。

何らかの奇妙な理由で $_SESSION スーパーグローバルに直接アクセスできない場合は、helpe 経由でslots_id 配列全体を取得する必要があります。r、ローカル コピーで必要なインデックスを更新し、更新されたコピーでセッション変数のslots_id配列を更新します。

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。