如何选择多个复选框并在db中更新

问题描述:

我有一个表单,并且每一行都显示在我的页面上。它也存在每个项目的复选框,当我点击它时,如果它未被选中,它会被检查并保存在db值1或值0中,否则。但我想知道如何选择多个未经检查的复选框并在我的数据库中全部更新,而不是一对一地将它们一一对应。任何建议如何做到这一点?如何选择多个复选框并在db中更新

$displayChecked = $row['publish'] == 1 ? 'checked' : ''; 
    $check = $row['publish'] == 1 ? 'true' : 'false'; 
    (...) 
    <?php if ($check == "true") {echo "Publish";} else {echo "Unpublished";}?> 
    <input type="checkbox" name="check" value = "<?php echo $check; ?>" <?php echo $displayChecked; ?> OnClick="doAction(<?php echo $check;?>, <?php echo $id;?>);" > 

doAction:

function doAction(check,id){ 
$.ajax({ 

     type: "GET", 
     url: "file.php", 
     data: "check=" + check + "&id=" + id, 
     success: function(msg){ 
       alert("Data Saved: " + msg); 
       } 
}); 
} 

file.php

<?php 
require_once("connectionfile.php"); 

     $id = $_GET['id']; 
     $check = $_GET['check']; 
     if ($check == "false"){ 
      $query = mysql_query("update article set publish = 1 where id =" . $id); 

      echo "Published"; 
     } 
     else { 
      $query = mysql_query("update article set publish = 0 where id =" . $id); 
      echo "Unpublished"; 
     } 

?> 
+1

我不明白你的意思。你的意思是做一个复选框,如果选中,则检查页面上的所有复选框并更新所有复选框的数据库? – Syncro

+1

我认为他意味着批量更新。就像在选择多个复选框中一样,以各种方式提交所有这些复选框。就目前而言,他正在为一个复选框进行一次更新。鉴于这是OP想要的,实现起来相当微不足道。但OP必须首先澄清。 – Andrew

+0

@andrew正好 – johnwilliam25

而不是一个单一的ID,传递一个数组的当前在您的文件签IDS您doAction和循环他们。 PHP。

您可以构建一个字符串,其中包含所有检查状态和另一个字符串与所有ID。让我们来创建新的功能“白水”:现在你都显示与ID作为参数“doAction”复选框

function saveAll() { // ◄■■■■■ PARAMETERS UNNECESSARY. 
// CONSTRUCT STRINGS WITH CHECKS AND IDS OF ALL THE CHECKBOXES. 
    var checkboxes = $("[name=check]"); // ARRAY OF CHECKBOXES NAMED "CHECK". 
    var checks = ""; // EXAMPLE : "0,1,1,0,0," (COMMA SEPARATED). 
    var ids = ""; // EXAMPLE : "2,14,21,33,40," (COMMA SEPARATED). 
    for (i = 0; i < checkboxes.length; i++) 
    { checks += (checkboxes[ i ].checked) ? "1," : "0,"; // COMMA SEPARATED. 
    ids += checkboxes[ i ].id + ","; // COMMA SEPARATED. 
    } 
$.ajax({ 
     type: "GET", 
     url: "save_all.php", // ◄■■■■■ NEW PHP CODE. 
     data: "checks=" + checks + "&ids=" + ids, // ◄■■■■■ PLURAL VARIABLES. 
     success: function(msg){ 
       alert("Data Saved: " + msg); 
       } 
}); 
} 

<input type="checkbox" name="check" value = "<?php echo $check; ?>" 
      <?php echo $displayChecked; ?> 
      OnClick="doAction(<?php echo $check;?>, <?php echo $id;?>);" > ◄■■■■■ 

公告实施新功能“白水”要求复选框有“名”和“ID”,所以让我们改变一点点的代码前面的块:

<input type="checkbox" name="check" value = "<?php echo $check; ?>" 
      <?php echo $displayChecked; ?> id="<?php echo $id;?>" ◄■■■■■ 
      OnClick="doAction(<?php echo $check;?>, <?php echo $id;?>);" > 

现在新功能“白水”可以得到所有的检查状态的checkbo的所有ID XES,建立与他们的字符串,并将它们发送到新的PHP代码“save_all.php”,看起来像这样:

<?php 
if (isset($_GET["checks"]) && isset($_GET["ids"])) 
    { $checks = explode(",", $_GET["checks"]); // IGNORE LAST ITEM. 
    $ids = explode(",", $_GET["ids"] ); // IGNORE LAST ITEM. 
    for ($i = 0; $i < (count($ids)-1); $i++) 
     $query = mysql_query("update article set publish=" . 
          $checks[$i] . " where id=" . $ids[$i]); 
    } 
?> 

$checks$ids是数组。我们必须忽略每个数组的最后一个元素,因为这些字符串以逗号结尾,所以最后一个元素是空的。

现在,你只需要一个按钮,使一切工作:

<button onclick="saveAll()">Save all</button> 

,因为它们是由PHP 5.5.x弃用,并将于removed in the future您应该避免使用mysql_*功能。

我真的建议朝着PDO走,因为它是更多的面向对象或者如果你更喜欢旧的程序方式,那么mysqli是要走的路。


现在,随着中说:

让我们开始与HTML/JavaScript的一部分:

<!doctype html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Title be here</title> 

    <script src="https://code.jquery.com/jquery-3.1.0.min.js"></script> 
</head> 
<body> 
    <form action="" method="post" id="_form"> 
     <div class="row"> 
      <?php for($i = 1; $i <= 10; $i++):?> 
      <label for="id_<?php echo $i; ?>">Checkbox <?php echo $i; ?></label> 
      <input type="checkbox" id="id_<?php echo $i; ?>" name="ids[<?php echo $i; ?>]"><!-- here we assume $i is $id --> 
      <br /> 
      <?php endfor; ?> 
      <input type="submit" value="Submit" name="submit" id="_submit"> 
     </div> 
    </form> 


    <script type="text/javascript"> 
     $(document).ready(function(){ 

      $('#_submit').on('click', function(e){ 
       e.preventDefault(); 

       $.ajax({ 
        type: "post", 
        url: "file.php", 
        data: $('#_form').serialize(), 
        success: function(data){ 
         if(data.success == true){ 
          // do stuff here 
         }else{ 
          // do other stuff here 
         } 
        } 
       }); 
      }); 
     }); 
    </script> 
</body> 
</html> 

并让继续与PHP的一部分:

<?php 

if(isset($_POST['ids'])) 
{ 
    $input = $_POST['ids']; 

    // Lets take care of the query here 

    $query = ' UPDATE `article` SET `publish` = CASE'; 

    foreach($input as $key => $value) 
    { 
     $query .= ' WHEN `id` = ' . /* typecast to int just in case */ (int) $key . ' THEN '; 
     if($value == 'on') 
     { 
      $query .= '1'; 
     } 
     else 
     { 
      $query .= '0'; 
     } 
    } 

    $query .= ' END WHERE `id` IN (' . implode(',', array_keys($input)) . ')'; 

    // update stuff using the database handler here 

    // return a json response here or just echo out whatever you need 
} 
else 
{ 
    // return a response here 
} 

注意我已将name="ids[<?php echo $i; ?>]"作为一个数组。PHP将实际解释,作为一个阵列,它看起来就像这样:

Array 
(
    [2] => on 
    [4] => on 
    [5] => on 
    [6] => on 
    [7] => on 
    [8] => on 
) 

注意,关键是不是随机的,他们是我们的IDS。

但是,您还会注意到某些ID缺失,即没有选中复选框的ID。这将是一个问题。一个简单的解决方法是做到以下几点:

<input type="hidden" name="ids[<?php echo $i; ?>]" value="off"> 
<!-- Add a hidden filed with the exact same id BUT with off as a value --> 
<!-- In case the user checks the checkbox, then it will overwrite the hidden field --> 
<!-- The order of the fields in very important here. Hidden field MUST come first --> 

<input type="checkbox" id="id_<?php echo $i; ?>" name="ids[<?php echo $i; ?>]"><!-- here we assume $i is $id --> 

所以,现在我们的阵列看起来是这样的:

Array 
(
    [1] => off 
    [2] => off 
    [3] => off 
    [4] => off 
    [5] => on 
    [6] => off 
    [7] => off 
    [8] => on 
    [9] => off 
    [10] => off 
) 

从那里它是建立查询和更新表的一个简单的事情。

查询将是这个样子:

UPDATE `article` SET `publish` = CASE WHEN `id` = 4 THEN 1 WHEN `id` = 5 THEN 1 WHEN `id` = 6 THEN 1 END WHERE `id` IN (4,5,6) 

这将让你更新一次过的所有记录,而不遍历结果并没有被强制执行一个查询每个复选框。


至于前端部分为用户的体验,我想在更新完成且成功,你可以简单地闪烁,警报,否则只是显示错误。