实现从MySQL library表取数的PHP下拉列表及记录删除功能

问题修正与功能实现方案
现有代码核心错误
- HTML结构非法:
<select>、<option>是表单元素,不能嵌套在<table>、<tr>等表格标签内部,浏览器无法正常解析该结构,导致下拉列表无法显示。 - 删除逻辑放置错误:列表页顶部直接写了DELETE语句,只要打开页面就会尝试执行删除,没有参数校验,极易造成误删。
- SQL语法错误:DELETE语句中字段名
Book_ID被单引号包裹,单引号仅用于标识字符串,字段名需要用反引号包裹或者不使用引号。 - 数据库连接对象混用:代码中同时使用
$conn和$mysqli两个连接对象,会导致查询执行失败。 - 下拉列表无数据渲染:仅写了一个空的
<option>标签,没有遍历数据库返回的图书数据生成选项。 - 存在SQL注入风险:直接将未过滤的
$_GET参数拼接进SQL语句,恶意用户可通过构造特殊参数删除整表数据。 - 删除按钮重复冗余:同一表格行内写了两个删除链接,参数名不一致,第二个传参为
id的链接在deleteProcess.php中无法被识别。
功能实现代码
1. 图书列表与下拉列表页代码
<?php // 引入数据库连接 include_once ('database.php'); // 查询所有图书数据 $result = mysqli_query($conn, "SELECT * FROM library"); ?> <!-- 下拉列表:展示所有馆藏图书 --> <select name="book_select" id="book_select"> <option value="">请选择图书</option> <?php while($row = mysqli_fetch_array($result)): ?> <option value="<?php echo htmlspecialchars($row['Book_ID']); ?>"> <?php echo htmlspecialchars($row['Book'] . ' - ' . $row['Author']); ?> </option> <?php endwhile; ?> </select> <!-- 图书列表表格 --> <table border="1" cellpadding="8" cellspacing="0"> <thead> <tr> <td>Book_ID</td> <td>Author</td> <td>Author_Age</td> <td>Author_Genre</td> <td>Genre</td> <td>Book</td> <td>Year</td> <td>Age_Group</td> <td>Author_ID</td> <td>操作</td> </tr> </thead> <tbody> <?php // 重置查询结果指针,复用之前的查询结果渲染表格 mysqli_data_seek($result, 0); while($row = mysqli_fetch_array($result)): ?> <tr> <td><?php echo htmlspecialchars($row['Book_ID']); ?></td> <td><?php echo htmlspecialchars($row['Author']); ?></td> <td><?php echo htmlspecialchars($row['Author_Age']); ?></td> <td><?php echo htmlspecialchars($row['Author_Genre']); ?></td> <td><?php echo htmlspecialchars($row['Genre']); ?></td> <td><?php echo htmlspecialchars($row['Book']); ?></td> <td><?php echo htmlspecialchars($row['Year']); ?></td> <td><?php echo htmlspecialchars($row['Age_Group']); ?></td> <td><?php echo htmlspecialchars($row['Author_ID']); ?></td> <td> <a href="deleteProcess.php?Book_ID=<?php echo htmlspecialchars($row["Book_ID"]); ?>" onclick="return confirm('确定要删除该图书吗?')">Delete</a> </td> </tr> <?php endwhile; ?> </tbody> </table>
2. 优化后的deleteProcess.php代码(修复SQL注入风险)
<?php include_once ('database.php'); // 校验参数是否存在 if (!isset($_GET["Book_ID"]) || empty($_GET["Book_ID"])) { die("参数错误,缺少图书ID"); } // 使用预处理语句防止SQL注入 $stmt = mysqli_prepare($conn, "DELETE FROM library WHERE Book_ID = ?"); mysqli_stmt_bind_param($stmt, "s", $_GET["Book_ID"]); if(mysqli_stmt_execute($stmt)){ echo "Record deleted successfully"; // 删除成功后跳转回列表页,替换成你自己的列表页文件名 header("Location: book_list.php"); exit(); } else{ echo "Error deleting record: " . mysqli_error($conn); } mysqli_stmt_close($stmt); mysqli_close($conn); ?>
额外注意事项
- 生产环境建议使用POST请求执行删除操作,GET请求容易被爬虫、浏览器预加载触发导致误删。
- 输出到页面的内容统一用
htmlspecialchars过滤,防止XSS攻击。
内容的提问来源于stack exchange,提问作者user14310306
相关产品推荐
相关产品推荐

