如何从HTML表单提交空数组到PHP

7

我刚刚意识到一个问题——我不知道如何将一个空数组从HTML表单提交到PHP。我可以提交大小为1或更大的数组,但是否有办法提交一个空数组呢?我的意思是,你可以有:

<form>
  <input type='hidden' name='items[0]' value='Value Item 1' />
 <input type='hidden' name='items[1]' value='Value Item 2' />
</form>

它返回大小为2的数组:$_POST['items'] === ["Value Item 1", "Value Item 2"],但是否有办法将空数组作为$_POST键的值传递?也就是说,我知道可以使$POST['items'] === '',但是一个空数组([])呢?
具体用例是:我有一个一对多的表单,比如购物车中的商品。表单由数据库中现有的“商品”填充,但可以添加或删除商品,这些商品在商品数组中。商品数组是有索引的 - 如果添加了新的商品,则将其保存到数据库;如果删除商品,则从数组中删除并从数据库中删除。
所有这些都很好地工作 - 除非从表单中删除了所有商品,在这种情况下不会传递任何“商品”键。
我找到了完美的解决方法,即在表单顶部放置一个隐藏输入“items”= null,因此即使没有商品,也会传递该键,然后在PHP中,如果“items”键是'',则将其转换为空数组 - 所有工作正常。我只是好奇理论上是否可以POST一个空数组。不知道为什么这被认为是不恰当的 - 希望解释有所帮助。
至于为什么要检查键的存在性 - 我使用相同的通用代码来处理来自不同表单的输入 - 因此,如果用户在购物车上更改地址而没有指定商品,则不应仅因为没有“商品”键而删除商品。
进一步澄清,我实际上并没有构建一个“购物车” - 我正在构建一个抽象框架,支持将一对多POST映射到Eloquent一对多关系。 POST中的任何空值字段都将从对象中删除 - 但是,在POST中不存在的任何字段/键都不会从基础数据库中删除或修改。
重点是,我正在构建一个通用工具集 - 不仅仅是试图使一个函数处理一个表单。

1
只是好奇,为什么?用于什么情况? - GµårÐïåñ
你的问题对我来说毫无意义。 - Pedro Lobito
为什么不只创建一个空数组呢? - Kisaragi
1个回答

6

不行,你不能这样做(虽然了解它似乎毫无意义)。

一旦你设置了一个数组类型的表单字段,它就会产生与其值相同的索引。在这种情况下,它是一个空字符串,意味着它的值是空的(''),只是因为它存在而已。对于PHP来说,没有明确的值意味着是null或空,这被视为有效的值。什么也没有意味着根本没有被声明或定义,这不适用于空数组或一个或多个空值的数组。

<form method="POST" id="test" action="test.php">
 <input type='hidden' name='items[]' />
</form>
<input type="submit" value="Send" form="test">

print_r($_POST)的输出结果

Array
(
    [items] => Array
        (
            [0] => 
        )

)

如果你想让$_POST成为一个空数组,只需不通过POST方法发送任何内容即可。超全局变量在运行时设置为空数组。祝玩得开心。 :)


2
我将此选为“答案”,因为我认为无法POST空数组是正确的。但是,回复中的PHP部分完全不正确。NULL与UNDEFINED、空字符串、false和零以及空数组完全不同。您可以对空数组执行“foreach”——这什么也不做,但不会出错。“foreach”使用未定义的变量或变量等于NULL或等于空字符串会导致错误。 - ChrisNY
这正是我所说的:“对于PHP来说,什么都不是指的是null或empty(请注意or部分,其中明显开启了与null、empty甚至零区分的差距,虽然我没有提到,但也算在内...每个值都不是nothing或undefined)。Nothing(或UNDEFINED)意味着根本不存在。”我不明白你为什么不同意,因为它基本上是相同的,只是更详细而已。 - al'ein
我读了更多的内容,似乎我表达得不太好,因为我没有提到值。我会编辑答案,用一个更合适的陈述来看看是否更好。 - al'ein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接