使用PHP和HTML表单无法删除MySQL数据库记录
问题分析与解决方案
核心问题
你的删除功能失效的直接原因是:表单中的输入框和提交按钮错误使用了num属性,而PHP的$_POST数组依赖表单元素的name属性来获取提交值。这导致$_POST['deleteSubmit']和$_POST['deleteNum']始终不存在,删除逻辑根本没有触发执行。
对比你能正常运行的新增表单,新增功能的输入框和提交按钮都正确使用了name属性,这就是两者的本质区别。
修改后的删除代码
只需将表单中的num属性替换为name属性即可修复:
<?php if (isset($_POST['deleteSubmit'])) { $details = $conn->real_escape_string($_POST['deleteNum']); $deleteSQL = "DELETE FROM userName WHERE id = '$details'"; $result = $conn->query($deleteSQL); if (!$result) { echo 'Error!'; exit($conn->error); } else { header('Location: index.php'); exit; } } ?> <h4>DELETE NAME (DELETE)</h4> <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>"> <label for="num">Enter User Reference to be Deleted:</label><br> <input name="deleteNum" type="number"><br> <input name="deleteSubmit" type="submit" value="Delete"> </form>
额外安全优化建议
虽然real_escape_string能降低SQL注入风险,但更可靠的方案是使用预处理语句,彻底避免将用户输入直接拼接到SQL语句中,示例如下:
if (isset($_POST['deleteSubmit'])) { // 初始化预处理语句 $stmt = $conn->prepare("DELETE FROM userName WHERE id = ?"); // 绑定参数:"i"表示参数为整数类型(对应id字段的自增整数类型) $stmt->bind_param("i", $_POST['deleteNum']); $stmt->execute(); // 判断是否成功删除记录 if ($stmt->affected_rows === 0) { echo '未找到对应ID的记录!'; } else { header('Location: index.php'); exit; } $stmt->close(); }
这种方式不仅能彻底规避SQL注入,还能通过affected_rows判断操作结果,提升交互反馈的准确性。
内容的提问来源于stack exchange,提问作者Shaun
相关产品推荐
相关产品推荐

