使用新复选框值更新表,覆盖旧复选框值

时间:2016-05-12 00:51:30

标签: php mysql

我正在尝试编写最简单的代码,仅使用mysql更新复选框值。

包含一些预定义值的数据库的现有示例:

id | checked
----------
1  | 1
2  | 0
3  | 1

HTML:

使用现有数据库值生成HTML,稍后由用户修改并更新。

<input type="checkbox" name="check[1]" checked="checked">
<input type="checkbox" name="check[2]">
<input type="checkbox" name="check[3]" checked="checked">

POST仅返回 检查的ID的数组,而不是所有这些(不包括&#34; off&#34;值的那些)。

现在,我想更新整个表格,但就像我说的那样,我只能使用已检查(开启)值进行操作。

我最初的做法是更新整个表格并检查&#39; = 0,然后将我保留在数组中的所有ID设置为&#39;检查&#39; = 1。

UPDATE -> set all to 0
UPDATE -> set checked (values from array) to 1

是否有更优雅的查询解决方案来实现这一目标?

我知道首先选择所有id的选项,将它们与php中的新数组进行比较,然后进行更新,但我们希望避免这种情况。

1 个答案:

答案 0 :(得分:1)

您需要一个条件UPDATE操作,如下所示:

// When first and third checkboxe is checked
UPDATE checkbox_table SET checked = CASE WHEN id IN (1,3) THEN 1 ELSE 0 END;

或者

// When second and third checkbox is checked
UPDATE checkbox_table SET checked = CASE WHEN id IN (2,3) THEN 1 ELSE 0 END;

就像那样......

示例将是这样的:

<强> HTML:

<form method="post">
    <input type="checkbox" name="check[1]">
    <input type="checkbox" name="check[2]">
    <input type="checkbox" name="check[3]">
    <input type="submit" name="submit" value="submit" />
</form>

<强> PHP:

表单提交后,使用array_keys()函数获取所选复选框值,然后执行条件UPDATE操作。

if (isset($_POST['submit'])){
    if(isset($_POST['check'])){
        $checked_keys = array_keys($_POST['check']);
        $query = "UPDATE checkbox_table SET checked = CASE WHEN id IN (" . implode(',', $checked_keys) . ") THEN 1 ELSE 0 END";
    }else{
        $query = "UPDATE checkbox_table SET checked = 0";
    }
    // Now execute this $query
}