【问题标题】:AJAX delete item from databaseAJAX 从数据库中删除项目
【发布时间】:2021-10-15 22:11:50
【问题描述】:

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

jQuery:

$(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>

【问题讨论】:

  • 如果title 是一个字符串,那么您的查询没有被正确引用。照原样,您的代码容易受到SQL injection 攻击。始终使用 prepared statementsbound parameters。请参阅 this pagethis post 了解一些很好的示例。
  • 嗯,我用这个只是为了学习,所以我没有考虑注射,但谢谢你通知我
  • 您好,欢迎来到 SO!请使用tour,阅读help centerhow-to-ask 页面。您的问题可能是由title:del_title 引起的,del_title 不是有效值,您的php delete 不会从数据库中删除该项目。因此,当页面刷新时,该项目会重新出现。
  • 嗯,这正是我通过查找示例得出的结果,所以我不确定如何更改它,因为我需要$("#" + $("#selectOpt").val()) 来获取所选项目
  • 改用title:del_title.val()

标签: php jquery ajax mysqli


【解决方案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>

【讨论】:

  • 嗯,就是这样,它应该适用于我的 DOM 元素(我曾尝试过类似的东西)但它会自动刷新页面并且元素重新出现。这就是为什么我认为我需要从数据库中删除数据
  • 哦,我错过了这是在 Ajax 中(抱歉),稍后再试
  • 我试过你的解决方案,但问题是一样的:项目被删除,然后页面刷新并重新出现。
  • 也许我的 github 示例可以帮助您:github.com/bmehler/AjaxExample 这是一个简单的 Ajax 示例。
  • 我真的不确定我做错了什么。我想这与我的delete.php 有关 - 它没有接收或没有正确删除数据,但我不知道问题出在哪里
【解决方案2】:

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

jQuery:

$(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 错误,请参阅此answer

【讨论】:

  • 我现在更加困惑:我已经尝试过你的解决方案,但我得到的是:在页面重新加载之前项目没有从 DOM 中删除,但我得到了xhr 200 OK(我可以向删除按钮发送垃圾邮件以获得相同的消息)。还有:项目保留在数据库中。
  • 是的,我很久以前就知道了,刷新后该项目不会从 DOM 中删除,因为它仍在数据库中。但这就是问题所在,为什么我不能从数据库中删除它?例如:可能是我的循环上传了搞砸的文件吗?我在问,因为我在兜圈子。
  • 我在代码中的任何地方都没有看到任何上传。但我不认为这是问题
  • 是的,我知道你在这里看不到它,但我只是在猜测(这是一个简单的 while 循环,每个 &lt;div&gt; 回显 5 个项目,然后有一个计数器添加额外的 &lt;div&gt;添加了 5 项)
  • 现在还有一个问题:echo $arr 应该给我一个消息是吗?因为我在任何地方都看不到它(也许我不知道在哪里看)。
猜你喜欢
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 2020-05-30
  • 1970-01-01
相关资源
最近更新 更多