在 PHP 中处理多个(未)选中复选框的最简单和最干净的方法
Posted
技术标签:
【中文标题】在 PHP 中处理多个(未)选中复选框的最简单和最干净的方法【英文标题】:Simplest and cleanest way to process multiple (un)checked checkboxes in PHP 【发布时间】:2013-01-16 18:55:42 【问题描述】:我有一个电子邮件系统,订阅者可以订阅多个列表。在订阅者编辑模式下,我有一个表格,其中列出了所有列表,其中列出了订阅者订阅的复选框。
到目前为止一切顺利:)
但是,我需要在表单提交时处理这些复选框。到目前为止,复选框代码如下所示:
<input type="checkbox" name="lists[]" value="<?= $list->id ?>" />
这会在提交时返回以下数据:
array(2)
[0]=> string(1) "7"
[1]=> string(1) "8"
但这就是“困难”部分。我总是可以循环数组并将订阅者添加到这些列表中,但用户可能已经订阅了这些列表。即使未操作任何复选框,也会发送这些 ID。
我想我可以做的是获取数组中的所有可用列表,标记那些取消订阅和订阅的列表,并忽略那些没有被操纵的列表。唯一的问题是这听起来有点太复杂了。
你会怎么做?肯定有更简单的方法来做到这一点。底线是,如果订阅没有通过复选框进行操作,我不想更新它们。
【问题讨论】:
你不能删除所有订阅然后添加提交的订阅吗?INSERT IGNORE
后跟DELETE WHERE NOT IN...
?
取决于您的架构。订阅是由值(如subscribed=1
)还是仅由记录的存在来表示?
可能是个奇怪的想法。您可以使用 javascript 或 Jquery 捕获单击或检查事件。使用隐藏字段将 id 更新为逗号分隔值,即为每个复选框操作附加 id 和逗号。基于此,您可以知道用户更改了哪些复选框。
“重新发送”这些标志是否重要?我不明白为什么会这样。
【参考方案1】:
我如何解决它首先是创建一个列表数组,其中键是 id,值是检查 (1) 或不检查 (0) 的任何内容。
然后循环遍历它以创建复选框。
并在保存时使用array_diff_key 来查找它们的值发生变化的那些。然后将差异保存在DB中。
有人建议使用INSERT IGNORE,但是对于大量数据来说效率很低。 php 中的处理应该快得多(因为无论如何您都需要从数据库中提取这些数据 - 以显示 checkbxes,因此您已经拥有它并且数据库没有真正的开销)。
【讨论】:
【参考方案2】:感谢您的建议。我没有提到我使用 Laravel 作为框架,他们有一个功能可以解决这样的问题。
我使用以下代码解决了它:
$subscriber = Subscriber::find(Input::get('subscriber_id'));
$subscriber->maillist()->sync(Input::get('lists'));
现在这让我的关系保持同步:)
【讨论】:
以上是关于在 PHP 中处理多个(未)选中复选框的最简单和最干净的方法的主要内容,如果未能解决你的问题,请参考以下文章
如果 php 和 jQuery 选中或未选中,则在 php 中动态创建复选框值
delphi的dbgrideh中有个区域选中数据的功能。怎样才能知道 选中区域的最上面的行和最下面的行?