PHP从HTML表单获取邮箱并删除数据库记录的代码修正求助
问题排查与代码修正
核心问题分析
- 变量名不匹配:PHP中获取的是
$semail = $_REQUEST['semail'];,但SQL语句里误用了未定义的$email,导致SQL语法错误,若错误输出未开启则页面无内容。 - SQL注入风险:直接拼接用户输入到SQL语句中,存在严重安全漏洞。
- 表单未闭合:HTML的
<form>标签缺少</form>闭合,可能导致表单提交异常。 - 输入校验缺失:未判断
semail是否通过POST提交,无输入时会触发未定义索引错误。 - 错误显示未开启:PHP默认可能关闭错误输出,代码出错时无提示。
修正后的HTML表单
<html> <head> <title>Subscribe</title> </head> <body> <form method="post" action="delete-subs.php"> Email:<input type="Text" id="semail" name="semail"><br> <input type="Submit" name="submit" value="delete"> </form> <!-- 补充表单闭合标签 --> </body> </html>
修正后的delete-subs.php
<html> <head> <title>Delete subscribe</title> </head> <body> <center> <?php // 开发环境开启错误显示,生产环境需关闭 error_reporting(E_ALL); ini_set('display_errors', 1); include 'db/config.php'; // 补充空格避免解析问题 // 检查邮箱输入是否存在且非空 if(isset($_POST['semail']) && !empty(trim($_POST['semail']))){ $semail = trim($_POST['semail']); // 使用预处理语句防止SQL注入 $sql = "DELETE FROM sbscribers WHERE semail = ?"; $stmt = $conn->prepare($sql); $stmt->bind_param("s", $semail); // "s"表示参数为字符串类型 if ($stmt->execute()) { echo "<h1 style='color: red;'>Thank you</h1><br>Successfully deleted."; } else { echo "Error: " . $stmt->error; } $stmt->close(); } else { echo "请输入要删除的邮箱地址"; } $conn->close(); ?> </center> </body> </html>
关键修改说明
- 统一变量名,将SQL中的
$email改为$semail,匹配获取到的输入变量。 - 改用预处理语句绑定参数,彻底规避SQL注入风险。
- 补充HTML表单闭合标签,确保表单正常提交。
- 增加输入校验,判断邮箱是否提交且非空,避免未定义索引错误。
- 开启PHP错误显示,方便开发阶段排查问题。
- 替换
$_REQUEST为$_POST,符合表单提交方法的语义,更严谨。
内容的提问来源于stack exchange,提问作者Thejan Vishmitha
相关产品推荐
相关产品推荐

