如何限制foreach循环仅显示指定用户的单条Enrolled/Not Enrolled日期?
解决用户特定注册日期展示的问题
嘿,我来帮你捋捋这个问题!你现在的核心需求是让每个用户只能看到自己的Enrolled Since和Not Enrolled Since,而不是所有用户的,同时还要解决行查询时的报错问题,下面分方案给你说明:
方案一:数据库查询阶段直接过滤(推荐)
从数据库层面直接筛选当前用户的数据是最优解,既减少数据传输量,又避免后续循环处理的冗余逻辑。结合你遇到的报错,大概率是用了CodeIgniter框架,这里给你正确的写法:
解决报错的关键:区分row_array()和result_array()
你遇到的Uncaught Error: Call to a member function result_array() on array,原因是把数组当成了查询结果对象来调用方法,或者用错了获取单条记录的方法:
result_array():返回多条记录的二维数组,适用于批量数据row_array():返回单条记录的一维数组,正好匹配你的需求
正确的查询代码:
// 第一步:获取当前登录用户的ID(假设从session中获取,根据你的实际逻辑调整) $current_user_id = $this->session->userdata('user_id'); // 第二步:只查询当前用户的注册日期数据 $user_enrollment = $this->db->select('enrolled_since, not_enrolled_since') ->from('users') // 替换成你的表名 ->where('user_id', $current_user_id) // 用当前用户ID过滤 ->get() ->row_array(); // 用row_array()获取单条记录
输出数据
因为已经拿到了当前用户的单条数据,直接输出即可,不需要foreach循环:
if (!empty($user_enrollment)) { echo "Enrolled Since: " . $user_enrollment['enrolled_since']; echo "<br>"; echo "Not Enrolled Since: " . $user_enrollment['not_enrolled_since']; }
方案二:循环时通过if判断过滤
如果因为某些场景无法在查询阶段过滤,也可以先获取所有用户数据,再在循环中只显示当前用户的记录:
// 获取所有用户数据 $all_users = $this->db->select('user_id, enrolled_since, not_enrolled_since') ->from('users') ->get() ->result_array(); $current_user_id = $this->session->userdata('user_id'); // 循环遍历,只输出当前用户的记录 foreach ($all_users as $user) { if ($user['user_id'] === $current_user_id) { echo "Enrolled Since: " . $user['enrolled_since'] . "<br>"; echo "Not Enrolled Since: " . $user['not_enrolled_since'] . "<br>"; break; // 找到当前用户后就跳出循环,提升效率 } }
总结
优先选择方案一,不仅性能更好,逻辑也更清晰,彻底避免“所有用户看到同一条记录”的问题——因为每个用户查询的都是自己ID对应的数据。方案二作为备选,适合特殊场景下的临时处理。
内容的提问来源于stack exchange,提问作者user8792746
相关产品推荐
相关产品推荐

