如何用PHP结合SQL COUNT函数统计近24小时用户发帖次数(限60条)
问题修正:统计近24小时用户发帖次数
需求说明
- 从
super_table表中筛选近24小时内的数据 - 统计每位用户的发帖次数
- 最多返回60条结果
表结构示例
id username date_post --------------------- 11 james 111105487 10 luke 110105474 9 james 110105400 8 john 111105486 7 james 111100487 6 luke 110105174 5 john 110205474
期望输出格式
james(3) luke(2) john(2)
现有代码问题分析
- 时间逻辑错误:
原代码用strtotime("+1 day")取明天的时间,条件写date_post < '$delay_search',这会筛选所有早于明天的数据,完全不符合“近24小时”的要求。正确应该是取当前时间往前推24小时,用strtotime("-1 day"),条件改为date_post > ?(表示发帖时间在近24小时内)。 - 排序逻辑错误:
原代码按id DESC排序,这是按帖子ID倒序,不是按用户发帖次数排序。应该按统计出的发帖次数从多到少排序,即ORDER BY count DESC。 - 输出格式不符:
原代码输出带User :前缀,且没有换行,和期望的格式不一致。需要直接输出用户名(次数),每条结果后换行。 - SQL注入风险:
直接将变量拼入SQL语句,存在安全隐患,应该使用预处理语句绑定参数。
修正后的代码
<?php // 获取当前时间往前推24小时的时间戳 $delay_search = strtotime("-1 day"); $max_user_get = 60; // 使用预处理语句避免SQL注入,同时修正时间条件和排序逻辑 $sql_total = " SELECT username, COUNT(*) as count FROM super_table WHERE date_post > ? GROUP BY username ORDER BY count DESC LIMIT ?; "; // 初始化预处理语句 $stmt = $conn->prepare($sql_total); // 绑定参数,i表示整数类型 $stmt->bind_param("ii", $delay_search, $max_user_get); // 执行查询 $stmt->execute(); // 获取结果集 $result_total = $stmt->get_result(); $temp = ''; while ($row = $result_total->fetch_assoc()) { $username = $row["username"]; $total_post = $row['count']; // 按期望格式拼接,每条结果后添加换行符 $temp .= $username . '(' . $total_post . ')' . "\n"; } echo $temp; // 关闭语句和连接(可选,根据上下文处理) $stmt->close(); // $conn->close(); ?>
内容的提问来源于stack exchange,提问作者Lorenzo
相关产品推荐
相关产品推荐

