2015-01-20 49 views
1

我正在使用Bootstrap Data Table並希望從數據庫中刪除多個用戶。我可以一次刪除1個用戶,沒有任何問題,但是一旦我嘗試刪除多個用戶時遇到問題,並且找不到任何錯誤。使用PHP中的ajax調用刪除多行

這裏是AJAX代碼:

function removeRow(){ 

    var url = 'remove-user.php'; 
    var id = document.getElementById("user-id").value; 
    var data = 'userID=' + id; 

    $.ajax({ 
      url: url, 
      data: data, 
      cache: false, 
      error: function(e){ 
        alert(e); 
       }, 
      success: function() { 
       alert(data); 
       var selects = $('#users-table').bootstrapTable('getSelections'); 
        ids = $.map(selects, function (row) { 
         return row.id; 
        }); 

       $('#users-table').bootstrapTable('remove', { 
        field: 'id', 
        values: ids 
       });     
      } 
      }); 

    } 

實施例:在URL中的數據將是用戶ID = 1,2

這裏是刪除-user.php的代碼:

require("../config.php"); 
if(isset($_GET['userID'])) { 
    try{ 
    $userID = $_GET['userID']; 
    $query = "DELETE FROM users WHERE user_id IN (:userID)"; 
    $stmt = $db->prepare($query); 
    $stmt->bindParam(":userID", $userID, PDO::PARAM_INT); 
    $stmt->execute(); 
    $user_removed = 'User was successfully deleted.'; 
    $_SESSION['user_removed'] = $user_removed; 
    } catch (Exception $e){ 
    echo 'The following error occured: <br/>'.$e->getMessage(); 
    } 
} 

當我檢查多個用戶時,第一個用戶將得到刪除,但不是其他用戶。我的代碼中是否有錯誤?

同樣,我正在尋找的是通過從表中選擇它們並傳遞隱藏輸入的值來刪除多個用戶,該隱藏輸入包含像這樣的多個id - userID = 1,2。當我直接進入remove-user.php頁面並回顯GET時,它顯示爲1,2沒有引號。如果我更改我的刪除指定ID而不是綁定參數一切正常。我真的不知道爲什麼它不工作。

如果我需要提供更多信息,請讓我知道。

+0

是什麼'$ _GET [ '用戶ID']'包含哪些內容? – 2015-01-20 22:32:34

+0

您可以通過DOM-id選擇該ID。但是隻能有一個ID。 – 2015-01-20 22:35:07

+0

@JayBlanchard它包含所有選中的複選框的ID並作爲URL中的參數傳遞 - userID = 1,2 – iamthestreets 2015-01-23 15:12:54

回答

0

所以我終於能夠找到一個我認爲我嘗試過的解決方案。我認爲它不工作的原因可能與我嘗試使用bindParam有關。

這是我改變了我的remove-user.php代碼:

try{ 
    $ids = array($_GET['userID']); 
    $inQuery = implode(',', $ids); 
    $stmt = $db->prepare(
     'DELETE 
     FROM users 
     WHERE user_id IN(' . $inQuery . ')' 
    ); 
    $stmt->execute($ids); 
    $count = $stmt->rowCount(); 
    $user_removed = ''.$count.' user(s) deleted successfully.'; 
    $_SESSION['user_removed'] = $user_removed; 
} catch (Exception $e){ 
    $error = '<strong>The following error occured:</strong>'.$e->getMessage(); 
    $_SESSION['error'] = $error; 
} 
0

問題在於如何將數據傳遞到PDOStatement。

// assign :userID to $userID which should be cast into an int. 
$stmt->bindParam(":userID", $userID, PDO::PARAM_INT); 

這是怎麼了,我可能接近相似(假設你已經檢查相應的權限):

$ids_in = $_GET['userID']; 
$ids_cast = array(); 
foreach(explode(',', $ids_in) as $id) { 
    // casting to an int means that SQL injection can't work, though I wonder if 
    // allowing a user to delete an arbitrary number of IDs is a good thing. 
    $ids_cast[] = intval($id); 
} 
// gets rid of bad strings &ct. 
$ids_filtered = implode(',',array_filter($ids_cast)); 
if(!$ids_filtered) die('No valid IDs'); 
$query = "DELETE FROM users WHERE user_id IN ($ids_filtered)"; 
// run query. 
+0

它如何防止刪除任意數量的ID? – zavg 2015-01-20 22:41:38

+0

@zavg'userID = 1,2,3,4,5,6,7,8,9,20,11,12,13,14,25'似乎具有破壞性。 – cwallenpoole 2015-01-20 22:42:39

+0

但你的代碼如何防止它? – zavg 2015-01-20 22:43:16

0

在您的SQL查詢:userID參數是包含用逗號分隔的編號序列(例如字符串, 1,2)。

$query = "DELETE FROM users WHERE user_id IN (:userID)";

但結合定義你的參數作爲整數傳遞PDO::PARAM_INT論點bindParam功能時。

$stmt->bindParam(":userID", $userID, PDO::PARAM_INT); 

嘗試使用

$stmt->bindParam(":userID", $userID, PDO::PARAM_STR); 

代替。

+0

我試過上面的答案,它仍然只刪除選擇的第一個用戶不是全部。 – iamthestreets 2015-01-21 21:12:13

+0

你能確認,GET ['userId']確實包含字符串「1,2」而非僅僅是意圖。 你可以通過getElementById來選擇id,它通常只有一個元素。你如何連接並提供預期的元素到字符串? – 2015-01-21 22:57:05

+0

此外,PDO :: PARAM_INT是definitivly錯誤的數據類型。繼續PDO :: PARAM_STR – 2015-01-21 22:58:08