无法实现PHP主/详情页功能,请求技术指导
解决PHP主/详情页(Master/Detail)开发问题
兄弟,我看了你这段主详情页的代码,发现几个关键问题导致功能跑不起来,咱们一个个来梳理修正:
1. 跳转链接的两个核心错误
你现在的链接代码是:
<a href="index.php?detail=<?php echo $row["id"]; ?>">
这里有两个明显的逻辑错误:
- 跳转目标错了:应该跳转到
detail.php而不是index.php,不然点击后还是停留在列表页,根本进不了详情页 - 参数名不匹配:detail.php里是通过
$_GET["id"]获取详情ID,但链接里传的参数名是detail,两者完全对不上
修正后的链接应该是:
<a href="detail.php?id=<?php echo $row["id"]; ?>">查看文章详情</a>
2. 文件引入顺序错误
detail.php里先引入了header.php再引入config.php,如果header.php里用到了数据库连接(比如导航栏要查询分类数据),就会直接报错——因为数据库连接对象$conn还没初始化。
正确的引入顺序必须先加载配置文件:
<?php // 先加载数据库配置,确保连接先建立 require "includes/config.php"; // 再加载页面头部 require "includes/header.php"; ?>
3. 严重的SQL注入风险
你直接把$_GET["id"]拼进SQL语句里,这是非常危险的操作,黑客可以通过构造恶意参数直接篡改你的数据库。必须用预处理语句来解决这个问题,同时还要先验证参数的合法性。
修正后的detail.php完整顶部代码:
<?php require "includes/config.php"; require "includes/header.php"; // 先验证id参数是否存在且为有效数字 if (!isset($_GET["id"]) || !is_numeric($_GET["id"])) { // 参数无效,跳回列表页 header("Location: index.php"); exit; } $detail_id = $_GET["id"]; // 使用mysqli预处理语句防止SQL注入 $stmt = mysqli_prepare($conn, "SELECT * FROM post WHERE id = ?"); // 绑定参数:"i"表示整数类型,对应$detail_id mysqli_stmt_bind_param($stmt, "i", $detail_id); // 执行查询 mysqli_stmt_execute($stmt); // 获取结果集 $result = mysqli_stmt_get_result($stmt); // 取出详情数据 $row_detail = mysqli_fetch_array($result); // 如果没找到对应文章,友好提示 if (!$row_detail) { echo "<div style='padding: 20px;'>抱歉,找不到对应的文章!</div>"; exit; } ?>
4. 可选优化:列表页的查询(index.php)
虽然列表页的查询暂时没问题,但如果后续要加筛选条件,也建议用预处理语句,保持代码的安全性一致性。当前代码可以调整成更规范的写法:
<?php require "includes/config.php"; require "includes/header.php"; // 查询所有文章,按id倒序排列 $query = mysqli_query($conn, "SELECT * FROM post ORDER BY id DESC"); // 可以加个判断,如果没有文章的话提示 if (mysqli_num_rows($query) === 0) { echo "<p>暂无文章</p>"; } ?>
按照上面的修改,你的主详情页就能正常工作了,而且安全性也有保障。
内容的提问来源于stack exchange,提问作者Aqwam Hizbal
相关产品推荐
相关产品推荐

