Я использую 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; }