2016-07-29 48 views
1

我有一個表單,並且每一行都顯示在我的頁面上。它也存在每個項目的複選框,當我點擊它時,如果它未被選中,它會被檢查並保存在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

回答

0

而不是一個單一的ID,傳遞一個數組的當前在您的文件籤IDS您doAction和循環他們。 PHP。

0

您可以構建一個字符串,其中包含所有檢查狀態和另一個字符串與所有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> 
0

,因爲它們是由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) 

這將讓你更新一次過的所有記錄,而不遍歷結果並沒有被強制執行一個查詢每個複選框。


至於前端部分爲用戶的體驗,我想在更新完成且成功,你可以簡單地閃爍,警報,否則只是顯示錯誤。