AJAX 从数据库中删除项

AJAX delete item from database

提问人:Auri-stack 提问时间:8/12/2021 最后编辑:NcXNaVAuri-stack 更新时间:8/14/2021 访问量:590

问:

我正在尝试使用jQuery / ajax删除内容,该内容是用简单的PHP循环动态添加的,但它不起作用。 我正在使用动态创建来选择项目并通过按 .这就是我到现在为止想到的:<select>optionbutton

j查询:

$(document).on('click', '#rmvBtn', function() {
    // remove the related element
    let del_title = $("#" + $("#selectOpt").val());
        $.ajax({
            type: 'POST',
            cache: false,
            processData: false,
            url: 'delete.php',
            data: {title:del_title},
            success: function(data) {
                if(data) {
                    del_title.remove();
                }
            }
        });
})

PHP删除:

    define("DB_SERVER", "localhost");
    define("DB_USER", "root");
    define("DB_PASSWORD", "");
    define("DB_NAME", "project");

    $mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME);
    if($mysqli->connect_error) {
        echo "Sorry, there's a problem with the website.\n";
        echo 'Error: ' . $mysqli->connect_error . '\n';
        exit();
    }
    if($_POST['title']) {
        $title = mysqli_real_escape_string($_POST['title']);
        $sql = "DELETE FROM photos WHERE title = $title";
        mysqli_query($sql);
    }

要删除项目的 HTML 表单:

<form class='flex-container' id='remove-form'>
     <p>Select and Remove Item</p>
     <select id='selectOpt' name='title'>
         <option value="" selected disabled hidden>Choose Title</option> /*default value*/
          /*here appear the dynamically created options*/
     </select>
     <button id='rmvBtn'>Delete</button>
</form>
php jquery ajax mysqli

评论

0赞 Alex Howansky 8/12/2021
如果是字符串,则查询未正确引用。按原样,您的代码容易受到 SQL 注入攻击。始终使用带有绑定参数的预准备语句。有关一些很好的例子,请参阅此页面这篇文章title
0赞 Auri-stack 8/12/2021
好吧,我使用它只是为了学习,所以我没有考虑注射,但谢谢你通知我
0赞 NcXNaV 8/13/2021
您好,欢迎来到SO!请参观,阅读帮助中心操作方法页面。您的问题可能是由以下原因引起的:del_title 不是有效值,则不会从数据库中删除该项目。因此,当页面刷新时,该项目将重新出现。title:del_titlephp delete
0赞 Auri-stack 8/13/2021
好吧,这只是我通过查找示例想出的,所以我真的不确定如何更改它,因为我需要获得选定的项目$("#" + $("#selectOpt").val())
0赞 NcXNaV 8/13/2021
请改用title:del_title.val()

答:

2赞 Bernhard Beatus 8/12/2021 #1

我创建了这个小例子。

$(document).on('click', '#rmvBtn', function() {
  var del_title = $("#selectOpt").val();
  console.log(del_title);
  // Your Ajax Call
  //$.ajax({
  //    type: 'POST',
  //    cache: false,
  //    processData: false,
  //    url: 'delete.php',
  //    data: {title:del_title},
  // You don't need data because you don't have a return 
  //    success: function() {
           $('#selectOpt option[value=' + del_title + ']').remove();
  //    }
  //});

})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<label for="cars">Choose a car:</label>

<select name="cars" id="selectOpt">
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="mercedes">Mercedes</option>
  <option value="audi">Audi</option>
</select>
<button id='rmvBtn'>Delete</button>

评论

0赞 Auri-stack 8/12/2021
好吧,就是这样,它应该为我处理 DOM 元素(我尝试过类似的东西),但它会自动刷新页面并且元素重新出现。这就是为什么我认为我需要从数据库中删除数据
0赞 Auri-stack 8/12/2021
哦,我错过了这是在阿贾克斯(对不起),稍后再试
0赞 Auri-stack 8/13/2021
我尝试过您的解决方案,但问题是一样的:项目被删除,然后页面刷新并重新出现。
0赞 Bernhard Beatus 8/13/2021
也许我的 github 示例可以为您提供帮助: github.com/bmehler/AjaxExample 这是一个简单的 Ajax 示例。
0赞 Auri-stack 8/13/2021
我真的不确定我做错了什么。我想这与我的有关 - 它没有接收或没有正确删除数据,但我不知道问题出在哪里delete.php
1赞 NcXNaV 8/13/2021 #2

我已经编辑了您的代码,并添加了将成功/失败消息发送回 Ajax 作为调试目的。我已更改为 .我还注意到您的代码中的语法错误:.if 语句的末尾不应有 a。echodata: {title:del_title}data: {title:del_title.val()}phpif($_POST['title']) { }))

j查询:

$(document).on('click', '#rmvBtn', function() {
    // remove the related element
    let del_title = $("#" + $("#selectOpt").val());
        $.ajax({
            type: 'POST',
            cache: false,
            processData: false,
            url: 'delete.php',
            dataType: "json",
            data: {title:del_title.val()},
            success: function(data) {
                if(data.msg == 'Success') {
                    alert(data.msg);
                    del_title.remove();
                }
                else{
                    alert(data.msg);
                }
            }
        });
})

PHP删除:

<?php
    define("DB_SERVER", "localhost");
    define("DB_USER", "root");
    define("DB_PASSWORD", "");
    define("DB_NAME", "project");

    $mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME);
    if($mysqli->connect_error) {
        //echo "Sorry, there's a problem with the website.\n";
        //echo 'Error: ' . $mysqli->connect_error . '\n';
        //exit();
        $arr = ('msg' => 'mysqli Connection Error!');
    }
    if($_POST['title']) {
        $title = mysqli_real_escape_string($_POST['title']);
        $sql = "DELETE FROM photos WHERE title = $title";
        mysqli_query($sql);
        //If delete success
        if (mysqli_query($sql)){
            $arr = ('msg' => 'Success');
        }
        else $arr = ('msg' => 'Delete Item Failed');
    }
    echo json_encode($arr);
?>

用于删除项目的 HTML 表单:

<form class='flex-container' id='remove-form'>
     <p>Select and Remove Item</p>
     <select id='selectOpt' name='title'>
         <option value="" selected disabled hidden>Choose Title</option> /*default value*/
          /*here appear the dynamically created options*/
     </select>
     <button id='rmvBtn'>Delete</button>
</form>

我还建议在使用 Ajax 时处理 MySQL 错误,请参阅此答案

评论

0赞 Auri-stack 8/13/2021
我现在更加困惑:我已经尝试了您的解决方案,但我得到的是:在页面重新加载之前,项目不会从 DOM 中删除,但我得到了(我可以向删除按钮发送垃圾邮件以获得相同的消息)。还有:项目保留在数据库中。xhr 200 OK
0赞 Auri-stack 8/13/2021
是的,我很久以前就知道,刷新后该项目不会从 DOM 中删除,因为它仍在数据库中。但就是这样,为什么我不能从数据库中删除它?例如:上传文件会搞砸事情是我的循环吗?我问是因为我在兜圈子。
0赞 NcXNaV 8/13/2021
我在代码的任何地方都没有看到任何上传。但我不认为这是问题所在
0赞 Auri-stack 8/13/2021
是的,我知道你在这里没有看到它,但我只是猜测(这是一个简单的 while 循环,每个 echo 5 个项目,并在添加 5 个项目后添加一个计数器)<div><div>
0赞 Auri-stack 8/13/2021
现在另一个问题:应该给我一个消息是吗?因为我在任何地方都看不到它(也许我不知道去哪里看)。echo $arr