【问题标题】:Codeigniter, array in session, change the value of array in session in a specific keyCodeigniter,会话中的数组,在特定键中更改会话中数组的值
【发布时间】:2020-09-03 21:28:58
【问题描述】:

我在会话中有一个包含数字数组的变量。我想更改该变量中的特定数字。 我的会话:

                $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。但是我放在那里的“[19]”会导致错误。

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 的 slot_id 数组的值
  • 'slots_id[19]' 只是将 'slots_id[19]' 作为字符串文字传递。如果您查看此方法的文档,则在双参数形式中,第一个参数是您要查找的键的字符串。 codeigniter.com/userguide3/libraries/sessions.html

标签: php arrays codeigniter


【解决方案1】:

解决问题的两种方法:

$this->session->set_userdata('slots_id'[19], 100); 未尝试将值 100 分配给 $slots_id 数组的索引 19 上的数组元素。它试图将值 100 设置为 'slots_id' 字符串的第 20 个字符(索引 19),这超出了范围。

您可以尝试: $this->session->set_userdata('slots_id[19]', 100);

或者更好的是,从会话中删除整个元素,更新并重置它:

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

代码有点多,但我的建议是始终替换会话数据,而不是即时更新。

【讨论】:

  • 它可以工作,但由于某种原因,所有其他数字都变为零,除了我在使用您的代码时更改的数字。还有其他想法吗?谢谢你的时间和回答顺便说一句。
  • @VictorTheBeast 你去了哪条路?直接编辑会话数据中的数组或获取它,修改它然后取消设置/设置会话中的数组元素?
  • 我的错误。我每次都使用 for 循环来设置数组,这导致它总是有一个索引。这次我在循环结束时设置数组,所以现在我的所有插槽都在我想要的位置。我接受了您的建议,我一次设置了所有插槽,我不会即时更新一个索引。你给了我很好的建议,我解决了我的问题。感谢您的宝贵时间。
【解决方案2】:

Uninitialized string offset PHP 中的错误有大量关于它们的文档。您收到此错误是因为您没有引用数组的索引 19,而是引用了一个字符串,这正是本例中的“slots_id”。 'slots_id' 长度为 8 个字符,这意味着任何超过 7 的索引实际上都是未定义的。

如果由于某种奇怪的原因您无法直接访问$_SESSION 超全局,则需要通过帮助程序检索整个slots_id 数组,更新本地副本中所需的索引,然后更新会话变量的@ 987654324@ 数组与您的更新副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多