提问人:zahq 提问时间:9/1/2023 最后编辑:marc_szahq 更新时间:10/16/2023 访问量:86
在Handsontable中删除一行时,我希望它也将其删除在mysql数据库中
When removing a row in Handsontable, I want it to remove it in mysql database too
问:
我一直在尝试从我的 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”,但事实并非如此。
答:
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 在数据库中,它将被删除。
评论
var removedRows = loadedData.slice(index, index + amount);
removedRows
loadedData