PHP调用MYSQL执行DELETE操作误删全表,如何仅删除指定单行数据?
问题根源
- 字段类型隐式转换导致WHERE条件失效:你的
TBL_PUBLISHER_CODE字段大概率是字符串类型(比如编码包含字母、前缀等),但你在delete.php中用intval()将传入的编码强制转为整数,非数字开头的字符串经过intval转换后结果为0。MySQL中字符串和数字比较时,会自动将字符串转为数字再比较,所有非数字开头的TBL_PUBLISHER_CODE转数字后都是0,等于WHERE条件对所有行都成立,最终导致全表被删除。 - 存在SQL注入风险:直接将用户传入的参数拼接进SQL语句,容易被恶意构造参数攻击,同时也是本次问题的直接诱因。
修复方案
直接替换delete.php的代码为以下版本,使用预处理语句规避类型问题和注入风险:
if(isset($_GET['del-pub'])) { include_once 'dbconnect.php'; // 补充引入数据库连接,原代码漏写该逻辑会导致删除操作异常 $pubCode = $_GET['del-pub']; // 用预处理语句执行删除 $stmt = mysqli_prepare($conn, "DELETE FROM tbl_publisher WHERE TBL_PUBLISHER_CODE = ?"); mysqli_stmt_bind_param($stmt, "s", $pubCode); // s表示传入参数是字符串类型,和字段类型匹配 $execResult = mysqli_stmt_execute($stmt); if ($execResult) { header("Location: publisher.php"); exit; // 执行跳转后必须加exit终止后续代码执行 } else { echo "<script>alert('Publisher was not deleted.');</script>"; header("Location: publisher.php"); exit; } }
额外校验点
确认TBL_PUBLISHER_CODE是tbl_publisher表的唯一主键/唯一键,保证单个编码只会匹配到一行数据即可。
内容的提问来源于stack exchange,提问作者Taniyow
相关产品推荐
相关产品推荐

