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

实现从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:15:02