【问题标题】:Codeigniter POST data nameCodeigniter POST 数据名称
【发布时间】:2025-11-27 00:50:01
【问题描述】:

我对发布数据变量名称有疑问,例如我可能会得到这种类型的输入:

<input type="number" name="amount[BKP1P+NC10A]" />

从理论上讲,数组元素名称没有任何问题,当我不在 codeigniter 中时,我会收到数组名称并照常访问它,但奇怪的是当我使用 $this-&gt;input-&gt;post() 甚至当我访问数据时直接从$_POST 删除数组元素名称,而是得到一个枚举数组。

例如在普通帖子中(没有 codeigniter)我得到:

 array(1) {
  ["amount"]=>
   array(1) {
     ["BKP1P+NC10A"]=>
     string(2) "12"
   }
 }

在 codeigniter 中我得到了这个:

array(1) {
  ["amount"]=>
   array(1) {
    [0]=>
     string(2) "12"
  }
}

谁能告诉我发生了什么以及如何获取实际名称而不是枚举数组?

感谢和问候

【问题讨论】:

  • 为什么您需要输入数组名称为BKP1P+NC10A。我没有证据,但我强烈怀疑 CodeIgniter -&gt;post() 删除了一些特殊字符,可能是为了一些潜在的安全漏洞,或者可能只是为了开发人员的理智。
  • 这种类型的代码是零件号,是的,它可以用作元素。在 codeigniter 中,不仅 ->post() 甚至 $_POST 的行为都相同并获得一个枚举数组
  • 它似乎不能用作 CodeIgniter 中的一个元素,这可能就是你得到这种行为的原因。它可能没有记录,您必须查看 CodeIgniter 的系统代码以确认(并修复),但如果此数组元素名称给您带来意外行为,则可能是因为 + 符号。使用数据键来存储数据是非常规的。与其尝试使用一个字段做两件事,您应该有两个字段,一个是您现在拥有的带有通用键名的字段,另一个是带有部件号的隐藏字段。
  • 其实是+,我也可能有.在零件编号中,这两个让我有了这种行为。虽然我尝试编码使 + 更改为 %2B,但效果仍然相同

标签: php arrays codeigniter post


【解决方案1】:

@Goose 指出的问题似乎来自 codeigniter 的核心,当我重新访问核心输入类时,我发现了一个函数 _clean_input_keys,其中包含:

preg_match('/^[a-z0-9:_\/|-]+$/i', $str);

如您所见 + 和 .不允许,所以我将其更改为:

preg_match('/^[a-z0-9\+\.:_\/|-]+$/i', $str);

希望这对任何人都有帮助!

【讨论】:

  • 我还强烈建议将数组键更改为通用键,如果您需要向下传递部件号,请将其作为值而不是键传递。否则你很快就会遇到下一个问题。
  • 已经添加到我的待办事项列表中,因为我讨厌调整核心文件,因为我的想法是......如果我需要更改核心中的某些内容,我做错了。但现在它必须起作用。感谢您的帮助