セッション内に数値の配列を含む変数があります。その変数内の特定の数値を変更したいと考えています。
私のセッション:
$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配列を更新します。