在Handsontable中删除一行时,我希望它也将其删除在mysql数据库中

When removing a row in Handsontable, I want it to remove it in mysql database too

提问人:zahq 提问时间:9/1/2023 最后编辑:marc_szahq 更新时间:10/16/2023 访问量:86

问:

我一直在尝试从我的 handsontable(显示我的数据库中的行)中删除行,但我找不到使用“删除行”选项删除它们的解决方案。计划是当我单击一行并删除该行时,我希望它进入delete_com.php并从数据库中删除该行。这应该通过获取您在 handsontable 上要删除的行上的 ID 来完成,然后使用它应该从数据库中删除的 ID。

我尝试使用 ajax 并将表中的 ID 传递到另一个文件以在数据库中删除,但没有任何内容被删除。

function deleteRowsFromDatabase(rowToDelete) {
    var idToDelete = rowToDelete[0];
    $.ajax({
        type: 'POST',
        url: 'delete_com.php',
        data: { ids: [idToDelete] }, 
        success: function(response) {
            console.log('Rows deleted successfully:', response);

            if (response.length > 0 && response[0].ID) {
                var deletedID = response[0].ID;
                var rowIndex = hot.getData().findIndex(function(row) {
                    return row[0] === deletedID;
                });

                if (rowIndex !== -1) {
                    hot.alter('remove_row', rowIndex);
                }
            }
        },
        error: function(xhr, status, error) {
            console.error('Error deleting rows:', error);
        }
    });

    var rowIndex = hot.getSourceData().indexOf(rowToDelete);
    if (rowIndex !== -1) {
        hot.alter('remove_row', rowIndex);
    }
}
    
    hot.addHook('afterRemoveRow', function(index, amount) {
    var removedRows = loadedData.slice(index, index + amount); 
    console.log('amount', amount, 'index',  index)
    deleteRowsFromDatabase(removedRows);
});

编辑:

我发现,如果我删除下面有另一行的行,它会发送此数据,但它会发送已删除行下方的行。

例如:我删除了 ID 为 5 的行。 它将从表中删除它(暂时),并在控制台日志中显示它正在尝试删除 ID:6 的行。

解决了索引行问题:

hot.addHook('beforeRemoveRow', function (index, amount) {
    var removedRows = loadedData.slice(index, index + amount);
    console.log('amount', amount, 'index', index);

    hot.addHookOnce('afterRemoveRow', function () {
        deleteRowsFromDatabase(removedRows);
    });
});
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_POST['ids'])) {
        $ids = $_POST['ids'];
        
        $idList = implode("','", $ids);
        $stmt = $conn->prepare("DELETE FROM com WHERE ID IN ('$idList') AND company = ?");
        $stmt->bind_param("i", $compid);
        $stmt->execute();
        $stmt->close();

        echo "Rows deleted successfully", $idList;
    } else {
        echo "No IDs sent";
    }
}

这是delete_com.php内部的PHP代码。它应该删除具有已选择 ID 的行,但它只是传递此代码并在控制台中说“Rows deleted succesfullyArray”,但事实并非如此。

javascript php mysqli handsontable

评论

0赞 Alive to die - Anant 9/1/2023
欢迎来到 StackOverflow。您应该首先尝试解决问题。请更新您的问题,以在最小的可重复示例中显示您已经尝试过的内容。有关更多信息,请参阅如何提问,并参加导览:)
0赞 ADyson 9/1/2023
您可能应该在 开始调试。指数和金额是否包含您期望的内容?是否包含您之后所期望的?里面有什么?你的问题缺少很多东西。请记住,除非您提供问题的最小可重现示例,否则我们无法运行您的代码(即使如此,也并非总是如此)。var removedRows = loadedData.slice(index, index + amount); removedRowsloadedData
0赞 ADyson 9/1/2023
这真的与PHP无关。正如你自己所说,问题是 ID 没有正确发送到 PHP。因此,问题在涉及PHP代码之前就发生了。你向我们展示的所有代码都是 JavaScript,所以我用它重新标记了它。如果你准确地标记了你的问题,你就更有可能获得 a) 对你的主题感兴趣和 b) 有专业知识来帮助你的人。另请参阅教程如何询问什么是标签,以及我应该如何使用它们?
0赞 zahq 9/1/2023
感谢您的回复@ADyson。索引和金额都包含我所期望的(索引是表中的哪一行被删除,金额是多少)。loadedData 包含表的行,不包括已删除的行。
0赞 CBroe 9/1/2023
“loadedData 包含表的行,不包括已删除的行” - 但删除的行是您要查找的行 - 那么为什么要通过尝试切片此时已经不再包含它的数据集来寻找它呢?

答:

0赞 zahq 9/1/2023 #1
    function deleteRowsFromDatabase(idToDelete) {
        $.ajax({
            type: 'POST',
            url: 'delete_com.php',
            data: { ids: idToDelete }, // Send only the ID
            success: function (response) {
                console.log('Row deleted successfully:', response);
            },
            error: function (xhr, status, error) {
                console.error('Error deleting row:', error);
            }
        });
    }

    hot.addHook('beforeRemoveRow', function (index, amount) {
        var removedRowIds = [];
        for (var i = index; i < index + amount; i++) {
            var row = hot.getDataAtRow(i);
            removedRowIds.push(row[0]);
        }

        hot.addHookOnce('afterRemoveRow', function () {
            for (var i = 0; i < removedRowIds.length; i++) {
                deleteRowsFromDatabase(removedRowIds[i]);
            }
        });
    });

我已将 hot.addHook('afterRemoveRow') 更改为 hot.addHook('beforeRemoveRow'),因为我想删除的行在发送到delete_com.php之前被切片。我已经这样做了,所以它在将数据发送到delete_com.php后对其进行切片。我也这样做了,所以它只从行而不是整行收集 ID,因为 ID 是唯一需要的东西。

include "sessions.php";
include "../../db/conn.php";
$compid = $_SESSION['company'];

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_POST['ids'])) {
        $idToDelete = $_POST['ids'];
        
        $stmt = $conn->prepare("DELETE FROM com WHERE ID = ? AND company = ?");
        $stmt->bind_param("si", $idToDelete, $compid);
        $stmt->execute();
        $stmt->close();

        echo "Row deleted successfully: $idToDelete";
    } else {
        echo "No ID sent";
    }
}
$conn->close();

这是delete_com.php,我已经删除了 sql 语句中的 WHERE IN,因为它不需要。它现在将使用 $_POST['ids'](仅是行的 ID)中发送的数据。如果此 ID 在数据库中,它将被删除。

评论

0赞 Your Common Sense 9/1/2023
这个答案没有社区价值,因为最初的问题太宽泛了