使用PHP中的ajax调用删除多行

时间:2015-01-20 22:30:33

标签: php jquery ajax

我正在使用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而不是绑定参数一切正常。我真的不确定为什么它不起作用。

如果我需要提供更多信息,请告诉我。

3 个答案:

答案 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;
}