我正在使用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
});
}
});
}
示例:网址中的数据为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();
}
}
当我检查多个用户时,第一个用户将被删除,而不是其他用户。我的代码中有错误吗?
同样,我要做的是删除多个用户,方法是从表中选择它们并传递包含多个ID的隐藏输入的值 - userID = 1,2。当我直接进入remove-user.php
页面并回显GET时,它显示为1,2没有引号。如果我更改我的删除以指定ID而不是绑定参数一切正常。我真的不确定为什么它不起作用。
如果我需要提供更多信息,请告诉我。
答案 0 :(得分: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.
答案 1 :(得分:0)
在SQL查询中:userID
参数是包含以逗号分隔的ID序列的字符串(例如,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);
代替。
答案 2 :(得分: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;
}