You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP实现点击动态列表删除按钮获取ID并删除数据库对应数据

解决方案

方法一:同步表单提交(最简单的实现)

单个提交按钮没法直接把ID传给后端,所以我们需要给每个删除按钮套一个独立的表单,把要删除的ID通过隐藏字段传递。同时一定要注意SQL注入的问题,绝对不能直接把用户输入拼进SQL语句里!

修改后的完整代码如下:

<?php
// 先处理删除请求,再渲染列表
$dbh = new PDO("sqlite:database.sdb"); 

// 检查是否有删除按钮提交
if (isset($_POST['del_btn']) && !empty($_POST['delete_id'])) {
    $deleteId = $_POST['delete_id'];
    // 使用PDO预处理语句,彻底避免SQL注入
    $stmt = $dbh->prepare("DELETE FROM clip WHERE id = ?");
    $stmt->execute([$deleteId]);
    
    // 可选:添加删除成功提示
    echo "<p>ID为 {$deleteId} 的记录已成功删除</p>";
}

// 渲染动态列表
$sql = "SELECT * FROM clip"; 
foreach ($dbh->query($sql) as $row) { 
    echo "Id: ". $row['id'] ."<br />"; 
    // 给每个删除按钮包裹表单,传递ID
    echo '<form method="POST" action="">';
    echo '<input type="hidden" name="delete_id" value="'. $row['id'] .'">';
    echo '<input type="submit" value="delete" name="del_btn">';
    echo '</form><hr>';
}

方法二:AJAX异步删除(无刷新体验)

如果不想每次删除都刷新页面,可以用JavaScript实现AJAX异步提交,用户体验更好:

第一步:修改列表渲染代码

给按钮添加自定义属性存储ID,绑定点击事件:

<?php
$dbh = new PDO("sqlite:database.sdb"); 
$sql = "SELECT * FROM clip"; 
foreach ($dbh->query($sql) as $row) { 
    // 给列表项加个容器,方便删除后移除
    echo "<div class='item'>Id: ". $row['id']; 
    // 用data-id存储要删除的ID
    echo '<button class="delete-btn" data-id="'. $row['id'] .'">delete</button></div>';
}

第二步:添加JavaScript代码(原生JS)

// 获取所有删除按钮
const deleteBtns = document.querySelectorAll('.delete-btn');

deleteBtns.forEach(btn => {
    btn.addEventListener('click', function() {
        const deleteId = this.dataset.id;
        
        // 先弹出确认框,防止误删
        if (confirm(`确定要删除ID为 ${deleteId} 的记录吗?`)) {
            // 创建AJAX请求
            const xhr = new XMLHttpRequest();
            xhr.open('POST', 'handle_delete.php', true);
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            
            xhr.onload = function() {
                if (this.status === 200 && this.responseText === 'success') {
                    // 删除成功后,移除当前列表项
                    btn.closest('.item').remove();
                    alert('删除成功!');
                } else {
                    alert('删除失败,请重试');
                }
            };
            
            // 发送要删除的ID
            xhr.send(`delete_id=${deleteId}`);
        }
    });
});

第三步:新建handle_delete.php处理删除请求

<?php
$dbh = new PDO("sqlite:database.sdb"); 

if (isset($_POST['delete_id']) && !empty($_POST['delete_id'])) {
    $deleteId = $_POST['delete_id'];
    $stmt = $dbh->prepare("DELETE FROM clip WHERE id = ?");
    $stmt->execute([$deleteId]);
    
    echo 'success';
} else {
    echo 'error';
}

关键注意事项

  • 永远不要用exec()直接拼接SQL:你的原始代码里直接把ID拼进SQL的方式会导致严重的SQL注入漏洞,必须用PDO的预处理语句(prepare() + execute())。
  • 如果是公开网站,记得添加权限验证,确保只有有权限的用户才能执行删除操作。

内容的提问来源于stack exchange,提问作者lovekrand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:29:21