【问题标题】:Simplest and cleanest way to process multiple (un)checked checkboxes in PHP在 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 和逗号。基于此,您可以知道用户更改了哪些复选框。
  • “重新发送”这些标志是否重要?我不明白为什么会这样。

标签: php html mysql checkbox laravel


【解决方案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'));
    

    现在这让我的关系保持同步:)

    【讨论】:

      猜你喜欢
      • 2017-05-29
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      相关资源
      最近更新 更多