如何根据ID显示指定文章?PHP文章页面关联查询问题修复
文章详情页显示异常的修复方案
问题现象
- 点击右侧栏文章链接(如“What are SMTP, IMAP etc”)时,
article.php页面未展示对应ID的文章,反而输出所有文章内容 - 尝试在SQL语句中添加固定条件
WHERE article_id=1后,所有链接跳转后均显示同一篇文章
修复步骤
优化article.php的查询逻辑
核心思路是根据URL传递的articleID参数,精准查询对应文章,同时通过参数化查询避免安全风险,修改后的代码如下:
<div class="article-info"> <?php // 先校验URL参数是否存在 if(isset($_GET["articleID"])) { $article_id = $_GET["articleID"]; // 使用参数化预处理语句,避免SQL注入,同时精准查询目标文章 $sql = "SELECT * FROM articles INNER JOIN users ON articles.author = users.user_name WHERE articles.article_id = ?"; $stmt = $conn->prepare($sql); // 绑定整数类型参数(i代表integer) $stmt->bind_param("i", $article_id); $stmt->execute(); $result = $stmt->get_result(); if($result->num_rows > 0) { $row = $result->fetch_assoc(); // 直接输出目标文章内容 echo '<h2>'.$row["title"].'</h2>'; echo '<p>Created '.$row["publish_date"].' || By '.$row["first_name"].' '.$row["last_name"].' ('.$row["role"].')</p>'; echo $row["text"]; } else { echo "<p>抱歉,该文章不存在或已被删除</p>"; } // 关闭预处理语句 $stmt->close(); } else { echo "<p>请选择要查看的文章</p>"; } ?> </div>
关键修改点说明
- 精准查询:不再查询所有文章,而是通过
WHERE articles.article_id = ?只获取对应ID的文章,解决了显示全部文章的问题 - 参数化查询:使用预处理语句绑定参数,避免直接拼接SQL带来的SQL注入风险,同时适配任意合法的文章ID,不用硬编码判断条件
- 参数校验:增加了
articleID参数的存在性判断,以及文章不存在时的提示,提升页面健壮性和用户体验
原代码问题复盘
- 原SQL查询了所有文章数据,再通过循环判断ID输出,逻辑冗余且性能低下
- 硬编码
id == 1、id == 2的判断条件,无法适配更多文章ID,扩展性极差 - 未做SQL注入防护,存在数据安全隐患
内容的提问来源于stack exchange,提问作者pistachio
相关产品推荐
相关产品推荐

