PHP+MySQL实现博客侧边栏归档:展示月份及对应文章数
实现PHP+MySQL文章计数与博客侧边栏归档功能
嘿,我来帮你搞定这个需求!先指出你现有代码里的一个小问题:用单引号包裹SQL语句时,里面的$y和$m变量不会被PHP解析,而且直接拼接变量存在SQL注入风险,咱们换成更安全的写法来实现。下面分两部分补全代码:
一、输出当月文章计数
$y = date("Y"); $m = date("m"); $conn = new mysqli("localhost","root","","yomadsdata"); // 使用预处理语句避免SQL注入,同时确保变量正确解析 $sql = 'SELECT count(*) AS post_count FROM blogposts WHERE YEAR(post_created) = ? AND MONTH(post_created) = ?'; $stmt = $conn->prepare($sql); $stmt->bind_param("ss", $y, $m); $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); // 输出当月文章数量,你可以根据页面布局调整输出方式 echo "<p>当月文章数:{$row['post_count']}</p>";
二、实现侧边栏归档功能
要实现按月份归档并显示对应文章数量,我们需要查询所有存在文章的年月,分组统计数量,再把数字月份转换为英文月份名称:
// 查询归档数据:按年月分组,统计每个月的文章总数,并按时间倒序排列 $archiveSql = 'SELECT YEAR(post_created) AS post_year, MONTH(post_created) AS post_month, count(*) AS post_count FROM blogposts GROUP BY post_year, post_month ORDER BY post_year DESC, post_month DESC'; $archiveResult = $conn->query($archiveSql); // 渲染侧边栏归档模块,你可以根据自己的CSS样式调整HTML结构 echo '<div class="sidebar-archive">'; echo '<h3>文章归档</h3>'; echo '<ul>'; while ($archiveRow = $archiveResult->fetch_assoc()) { // 将数字月份转换为英文月份名称(比如3转为March) $monthName = date("F", mktime(0, 0, 0, $archiveRow['post_month'], 1)); // 按照要求的格式输出:March(17) echo "<li>{$monthName}({$archiveRow['post_count']})</li>"; } echo '</ul>'; echo '</div>'; // 记得关闭数据库连接 $conn->close();
一些实用提示
- 如果你的
post_created字段是字符串格式(比如类似2024_05_12的格式),那需要调整SQL语句,比如用LEFT(post_created, 7) = ?,然后绑定参数为$y . '_' . $m,适配你的日期存储格式。 - 要是想让归档项可点击跳转至对应月份的文章列表,可以给
<li>里的内容添加链接:echo "<li><a href='archive.php?year={$archiveRow['post_year']}&month={$archiveRow['post_month']}'>{$monthName}({$archiveRow['post_count']})</a></li>"; - 建议给数据库操作添加错误处理,比如检查
$conn->connect_error或者$stmt->error,方便排查问题。
内容的提问来源于stack exchange,提问作者Goldensquare
相关产品推荐
相关产品推荐

