Удалить несколько строк с помощью ajax-вызова в PHP

Я использую Bootstrap Data Table и хочу удалить нескольких пользователей из базы данных. Я могу удалить 1 пользователя одновременно без каких-либо проблем, но как только я попытаюсь удалить более одного, я столкнулся с проблемами, и я не могу найти никаких ошибок.

Вот код 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-адресе будут userID = 1,2

Вот код remove-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(); } } 

Когда я проверяю несколько пользователей, первый пользователь получит delete, но не остальные. Есть ли ошибки в моем коде?

Опять же, я хочу удалить несколько пользователей, выбрав их из таблицы и передав значение скрытого ввода, которое содержит несколько идентификаторов, таких как userID = 1,2. Когда я remove-user.php непосредственно на страницу remove-user.php и эхо GET, оно отображается как 1,2 без кавычек. Если я изменю свое удаление, чтобы указать идентификаторы вместо привязки параметра, все будет работать нормально. Я действительно не знаю, почему он не работает.

Пожалуйста, дайте мне знать, если мне нужно дать больше информации.

Проблема в том, как вы передаете данные в 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. 

В вашем SQL-запросе :userID параметр :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); 

вместо.

Поэтому я наконец смог найти решение, которое, как я думал, я пробовал. Я думаю, что причина, по которой он не работал, может иметь какое-то отношение ко мне, пытающееся использовать 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; }