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

如何使用PHP+MySQL删除数据记录?附代码片段

PHP+MySQL 删除数据记录:从你的代码到完整实现

嘿,我看了你这段删除数据的代码,先给你拆解下它的逻辑,再补上你缺失的前端触发部分,顺便把关键的安全问题给你搞定——毕竟直接拼用户输入到SQL里是真的容易踩大坑!

先分析你现有代码的作用与问题

你的这段代码核心是做这几件事:

  • 引入数据库连接文件db.php
  • 从请求中获取id参数($_REQUEST会同时接收GET/POST两种请求的参数)
  • 拼接DELETE语句,删除new_record表中对应id的记录
  • 执行SQL,出错就输出错误信息
  • 删除完成后跳转到view.php页面

但这里有个致命的安全漏洞:直接把用户传入的id拼进SQL语句,会引发SQL注入攻击。比如有人恶意传入id=1 OR 1=1,你的整张表数据都会被清空,这绝对是要避免的!

安全优化后的PHP代码(使用预处理语句)

我们改用mysqli的预处理语句来执行删除,彻底防范SQL注入,同时优化错误处理和跳转逻辑:

<?php
require('db.php');

// 先校验ID参数的合法性,避免非法请求
if (!isset($_REQUEST['id']) || !is_numeric($_REQUEST['id'])) {
    die('无效的ID参数,请返回重试');
}

// 强制转为整数,进一步避免非法值
$id = (int)$_REQUEST['id'];

// 使用预处理语句,?是参数占位符
$query = "DELETE FROM new_record WHERE id = ?";
$stmt = mysqli_prepare($con, $query);

// 绑定参数:"i"表示参数是整数类型,对应后面的$id
mysqli_stmt_bind_param($stmt, "i", $id);

// 执行删除操作
$execute_result = mysqli_stmt_execute($stmt);

if ($execute_result) {
    // 删除成功,跳转到列表页并带上提示参数
    header("Location: view.php?msg=删除记录成功");
    exit; // 跳转后必须exit,防止后续代码继续执行
} else {
    // 输出更精准的错误信息
    die('删除失败:' . mysqli_stmt_error($stmt));
}

// 关闭语句与连接(脚本结束会自动关闭,但养成好习惯)
mysqli_stmt_close($stmt);
mysqli_close($con);
?>

这里的优化点:

  • 先校验ID的合法性,确保是有效数字
  • 预处理语句+参数绑定,从根源上避免SQL注入
  • 跳转时加上成功提示,方便前端展示反馈
  • 用mysqli_stmt_error()获取更精准的预处理语句错误信息

补上你缺失的前端触发部分

要触发删除操作,你需要在列表页(比如view.php)给每条记录加上删除按钮/链接,这里给你两种常用方式:

方式1:GET请求链接(简单直观)

在每条记录的操作栏添加删除链接,加上确认提示避免误触:

<a href="delete.php?id=<?php echo $row['id']; ?>" onclick="return confirm('确定要删除这条记录吗?');">删除</a>

这里delete.php就是你存放上面那段PHP代码的文件,点击链接会弹出确认框,确认后就会发送GET请求执行删除。

方式2:POST请求表单(更安全,推荐)

用表单提交POST请求,避免爬虫或误触触发删除:

<form action="delete.php" method="post" style="display: inline-block;">
    <input type="hidden" name="id" value="<?php echo $row['id']; ?>">
    <button type="submit" onclick="return confirm('确定要删除这条记录吗?');">删除</button>
</form>

如果用这种方式,PHP代码里可以把$_REQUEST['id']改成$_POST['id'],更严谨地对应请求类型。

额外注意事项

  • 确保db.php里的数据库连接使用mysqli扩展,且连接参数(主机、用户名、密码、库名)正确
  • 数据库操作的用户需要拥有DELETE权限,否则会执行失败
  • 如果跳转时出现headers already sent错误,检查header()之前有没有输出任何内容(包括空格、HTML标签)

内容的提问来源于stack exchange,提问作者Jim Adjei-Wiredu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:24:13