【问题标题】:Delete Entry From MySQL Table Using AJAX使用 AJAX 从 MySQL 表中删除条目
【发布时间】:2011-12-28 14:04:25
【问题描述】:

正如我在这里的另一个问题中所说,我正在创建一个登录类,但我正在为它做一些额外的选择。

其中之一是删除用户。我将向您展示我用来执行此操作的代码。

首先我列出所有使用此功能的用户:

public function listUsers() {
    $sql = "SELECT username FROM user";
    if($stmt = $this->conn->prepare($sql)) {
        $stmt->bind_result($usrn);
        $stmt->execute();

        while ($row = $stmt->fetch()) {
            $stmt->bind_result($usrn);
            echo    '<form name="delete-user" id="'.$usrn.'" class="delete-user" method="post" action="#">'.
                        '<fieldset class="user-wrapper">'.
                            '<label for="user" class="user-label">User</label>'.
                            '<input type="text" name="user" class="user" value="'.$usrn.'" autocomplete="off" readonly="readonly" />'.
                        '</fieldset>'.
                        '<fieldset class="delete-wrapper">'.
                            '<button type="submit" name="delete" class="delete">Delete</button>'.
                        '</fieldset>'.
                    '</form>';
        }
        $stmt->close();
        echo '<div class="message-handling"></div>';
    }
        else {
            $error = true;
            $message['error'] = true;
            $message['message'] = "The Users Could Not Be Listed";
            return json_encode($message);       
        }
}

如你所见,这个函数在 HTML 中的结果是这样的:

<form name="delete-user" id="altceva" class="delete-user" method="post" action="#"> 
    <fieldset class="user-wrapper">
        <label for="user" class="user-label">User</label>
        <input type="text" name="user" class="user" value="altceva" autocomplete="off" readonly="readonly" />
    </fieldset>
    <fieldset class="delete-wrapper">
        <button type="submit" name="delete" class="delete">Delete</button>
    </fieldset>
</form>

表单的 id 实际上是每个用户的名称(对于每个用户,都会使用用户的 id 创建一个表单)。输入的值也有用户名,因为我需要将它传递给另一个函数,以便我可以删除该用户。

接下来我尝试使用 AJAX 来删除我想要删除的用户。到目前为止我有这个功能:

var ids = $('.delete-user-content form[id]').map(function(){
    return this.id;
}).get();

jQuery.each(ids, function() {
    console.log("#" + this + ' .delete');

    $("#" + this + ' .delete').click(function() {

    $('.delete-user-content .message-handling').fadeOut();

    $.ajax({
        type: 'POST',
        url: 'assets/class/login/process.php',
        dataType: 'json',
        data: {
            delusername:    $('.delete-user input.user').val()
        },
        success:function(data) {
            if(data.error === true) {
                $('.delete-user-content .message-handling').text(data.message).fadeIn();
                console.log(data.message);
                setTimeout(function () {
                    $('.delete-user-content .message-handling').fadeOut();
                }, 15000);
            }
                else {
                    $('.delete-user-content .message-handling').text(data.message).fadeIn();
                    console.log(data.message);
                    $('#'+id).fadeOut();
                    array.splice(index, 1);
                    setTimeout(function () {
                        $('.delete-user-content .message-handling').fadeOut();
                    }, 15000);
                }
        },
        error:function(XMLHttpRequest,textStatus,errorThrown) {
            $('.delete-user-content .message-handling').text('Error | Check PHP log for information').fadeIn();
            console.log('Error | Check PHP log for information');
        }
    });
    return false;

});
});

而处理动作的PHP函数就是这个:

public function deleteUser($user) {
    $sql = "DELETE FROM user WHERE username = '$user'";
    if($stmt = $this->conn->prepare($sql)) {
        $stmt->execute();
        $stmt->close();
        $error = false;
        $message['error'] = false;
        $message['message'] = "The User ".$user." Has Been Deleted";
        return json_encode($message);
    }
        else {
            $error = true;
            $message['error'] = true;
            $message['message'] = "The User Could Not Be Deleted";
            return json_encode($message);       
        }
}

但问题是这不能正常工作。一个问题是,如果我删除最后一个列出的用户,它实际上会删除第一个用户。然后在我进行一次删除后,如果我单击另一个删除,则不会删除任何其他内容,它只会告诉我与第一次删除的用户相同。

现在,我知道这是很多代码,很难理解,但有人可以帮我解决吗?

【问题讨论】:

  • 由于参照完整性,出于历史跟踪、统计和其他原因,通常不会实际删除记录,而是将其禁用或不活动。这也可能解决您当前的部分问题。
  • 好的。那么如何使它们不活动而不是删除它们呢?当我创建新用户时,这不会导致问题吗?
  • 附注:如果您已经将paylod数据($user)放入sql查询中,您必须对数据进行清理/编码/转义。仅当您使用占位符/参数然后将有效负载“分配”给这些参数时,准备好的语句才能将您从该部分中解放出来。
  • @Roland 只需添加一个名为 status 或 summin 的字段,使用某种枚举,如 inactive、active、band、review 将其设置为默认值并记住对其进行查询,然后根据需要进行更新。
  • 要禁用记录或使其处于非活动状态,您可以在数据库表中添加一个布尔列。然后,代替 DELETE,您使用 UPDATE 在 0 和 1 或 Y 和 N 之间切换。当您插入新用户时,您启用它们。这是一种非常常见的数据库设计,不仅用于用户,还用于更多领域。客户、产品、任务,等等——没有任何东西真正被删除得无影无踪。

标签: php javascript jquery mysql ajax


【解决方案1】:

您似乎正在使用一种非常复杂的方法来确定您的用户 ID。为什么不向表单添加一个隐藏字段并将事件处理程序附加到表单?这将消除对map 和each 的需求,从而加快处理过程中的一切。

所以你的形式会是这样的:

<form name="delete-user" class="delete-user" method="post" action="#"> 
  <input type="hidden" name="user_id" value="PHP_ECHO_USER_ID" />
  <fieldset class="user-wrapper">
  ...

您的 jquery 将被简化为:

$("form.delete_user").submit(function() {
  var user_id = $(this).find('[name="user_id"]').val();    // on the top of my head, untested...
  console.log(user_id);     // make sure you get the right user ID before doing anything else
  ...
  return false;
});

【讨论】:

  • 好吧,我一直在尝试不同的方法。但我得到相同的结果。问题是我为表中的每个用户都有一个表单。当我单击其中一个删除时,它会删除表中的第一个条目。此外,在一次删除后,所有下一次删除都返回相同的操作和消息,即再次删除先前删除的用户。我似乎无法做到这一点......
  • @Roland 在我看来,您没有获得正确的用户 ID。如果您使用我在回答中描述的简化版本,首先要做的是在设置它的行之后添加一个console.log(user_id);,然后退出函数而不进行ajax调用。只要您确定始终选择正确的用户 ID,就可以开始添加其他内容。
  • 我正在使用我的版本。让我试试你的。
  • 现在可以使用了 :) 再次感谢@jeroen!尽管进行所有这些更改使我遇到了您在此处回答的一些先前问题的其他麻烦。这是关于更改用户密码的事情。我很快就会在这里发布问题,或者如果你想帮助我,我们可以聊天。
  • @Roland 没问题,很高兴为您提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 2013-08-27
  • 2012-02-16
  • 2013-06-27
  • 1970-01-01
相关资源
最近更新 更多