如何利用Session从多表取数并实现文章详情页布局?
问题分析与解决方案
咱们先把问题拆明白:现在点击“read more”的时候,根本没告诉博客页你到底选中了哪篇文章——只靠Session里的用户ID,博客页只能查出这个用户的所有文章,自然就会全部渲染出来。所以核心是要传递选中文章的唯一ID,然后在博客页区分“选中的那篇”和“剩下的文章”。
第一步:给主页的“read more”按钮加文章ID参数
原来的表单只提交到blog.php,没带任何文章标识,咱们得加个隐藏字段把当前文章的ID传过去。修改主页里的表单部分:
<form action="blog.php" method="GET"> <!-- 新增隐藏字段,把当前文章的ID传去博客页 --> <input type="hidden" name="article_id" value="<?php echo $ar['article_id']; ?>" /> <input type="submit" class="btn btn-info" name="read" value="read more" /> </form>
⚠️ 注意:这里的article_id要替换成你文章表里实际的文章主键字段名(找那个唯一标识单篇文章的字段)。
第二步:重构博客页代码,分别渲染选中文章和其余文章
现在博客页能拿到两个关键信息:用户ID(从Session)和选中的文章ID(从GET参数)。咱们分两次查询:一次查选中的文章,一次查排除这篇之外的其他文章,然后分别渲染左侧和右侧。
修改后的博客页代码示例:
<div class="container"> <?php session_start(); // 拿到用户ID和选中的文章ID $user_id = $_SESSION['id']; $selected_article_id = $_GET['article_id']; // 数据库连接(提醒:mysql_*函数已经废弃,建议换成mysqli或PDO!) $con = mysql_connect("localhost","root",""); mysql_select_db("demo_db",$con); // 查询选中的那篇文章(同时验证属于当前用户) $sql_selected = "SELECT * FROM article_tb WHERE id = $user_id AND article_id = $selected_article_id"; $res_selected = mysql_query($sql_selected); $selected_article = mysql_fetch_array($res_selected); // 查询用户的其他文章(排除选中的那篇) $sql_others = "SELECT * FROM article_tb WHERE id = $user_id AND article_id != $selected_article_id"; $res_others = mysql_query($sql_others); ?> <!-- 左侧区域:展示选中的完整文章 --> <div class="row"> <div style="border:1px solid #005212;" class="col-sm-8 col-md-8 col-lg-8"> <div class="row"> <center><img style="margin-top:10px;" src="uploads/<?php echo $selected_article[3]; ?>" /></center> <div class="col-sm-12 col-md-12 col-lg-12"> <h4><b><?php echo $selected_article[1]; ?></b></h4> <p><?php echo $selected_article[2]; ?></p> </div> </div> </div> <!-- 右侧区域:展示用户的其他文章 --> <div class="col-sm-4 col-md-4 col-lg-4"> <h3>Other Articles by You</h3> <hr> <?php while($other_article = mysql_fetch_array($res_others)) { ?> <h4><b><?php echo $other_article[1]; ?></b></h4> <div class="row"> <div class="col-sm-6 col-lg-6 col-md-6"> <img src="uploads/<?php echo $other_article[3]; ?>" width="170px" height="88" /> </div> <div class="col-sm-6 col-md-6 col-lg-6"> <?php echo $other_article[5]; ?> <!-- 给其他文章也加read more按钮,同样传递文章ID --> <form action="blog.php" method="GET"> <input type="hidden" name="article_id" value="<?php echo $other_article['article_id']; ?>" /> <input type="submit" class="btn btn-info" name="read" value="read more" /> </form> </div> </div> <hr> <?php } ?> </div> </div> </div>
几个必须提的重要提醒
- 废弃函数警告:你现在用的
mysql_*系列函数已经被PHP官方淘汰了,不仅没有维护,还存在SQL注入风险,建议尽快换成mysqli或者PDO,并且一定要用预处理语句来防注入! - 字段名适配:代码里的
article_id是假设的文章主键,一定要替换成你自己文章表里的实际字段名(找那个唯一的文章ID字段)。 - 安全验证:要确保Session里的
id是已登录用户的合法ID,最好加个登录状态判断,防止未授权用户访问。
内容的提问来源于stack exchange,提问作者Helen
相关产品推荐
相关产品推荐

