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
相关产品推荐
相关产品推荐

