在 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 中动态创建复选框值

如何用jquery标记未选中复选框的值?

delphi的dbgrideh中有个区域选中数据的功能。怎样才能知道 选中区域的最上面的行和最下面的行?

如何将一组选中/未选中的复选框值传递给 PHP 电子邮件生成器?

PHP jquery设置复选框值,如果选中或未选中并发布

在javascript和PHP中的字符串中获取多个选中的复选框值