获取消息:表中没有记录时为foreach()提供了无效的参数

时间:2019-02-21 05:12:55

标签: php mysqli codeigniter-3

我有两个带有记录的表。在第一个表中,我正在显示个人信息,在第二个表中,我正在添加活动详细信息。

现在,我正在尝试使用联接显示记录。所以下面的代码,我在模型中使用

public function getMemberActivity($gotMemberId){
$getDetails = array('members.member_id'=>$gotMemberId,'member_activity.activity_status'=>1,'members.is_Approved'=>1);
$result = $this->db->where($getDetails)
 ->from('members')
 ->join('member_activity', 'members.member_id = member_activity.member_id','LEFT')
 ->get()
 ->result();
//echo $this->db->last_query();
//print_r($result);
    if($result)
    {
         return $result;  
    }
    else 
    {
       return 0;  
    }

  }

控制器

注意:我在这里得到多个成员ID,因为上面有更多逻辑。这就是我为每个人使用的原因。

$ActivityData=[];
foreach ($data['getAllMember'] as $key => $m_id) {
$ActivityData[] = $this->Access_model->getMemberActivity($m_id->member_id);
   }
$data['MemberActivity'] = $ActivityData;

现在,如果我在辅助表中找到与成员ID相关的记录,那么我将得到输出,但如果在第二个表中未找到记录,那么我将得到错误Message: Invalid argument supplied for foreach()

如果我从'member_activity.activity_status'=>1子句中删除了where,则我的联接查询正在运行。我的意思是我正在获取会员记录。

 ->join('member_activity', 'members.member_id = member_activity.member_id','LEFT')

查看

$SActivity=$MemberActivity; 

//print_r($SActivity);
if($SActivity){

  foreach ($SActivity as $sec_1) {

  foreach ($sec_1 as $sec_activities) {
     //list here

  }

}

}
else{echo"no data availalbe";}

所以我的预期输出是,如果没有找到第二张表,我必须显示记录,然后显示成员表记录。

您能帮我吗?

3 个答案:

答案 0 :(得分:2)

按如下所示在'member_activity.activity_status'=>1中移动您的条件JOIN

$public function getMemberActivity($gotMemberId){
$getDetails = array('members.member_id'=>$gotMemberId,'members.is_Approved'=>1);
$result = $this->db->where($getDetails)
 ->from('members')
 ->join('member_activity', 'members.member_id = member_activity.member_id AND member_activity.activity_status = 1','LEFT')
 ->get()
 ->result();
//echo $this->db->last_query();
//print_r($result);
    if($result)
    {
         return $result;  
    }
    else 
    {
       return 0;  
    }

  }

希望这会对您有所帮助。

最终查询如下:

SELECT members.*,member_activity.* FROM members LEFT JOIN member_activity ON members.member_id = member_activity.member_id AND member_activity.activity_status = 1 
WHERE 'members.member_id' = $gotMemberId AND 'members.is_Approved' = 1;

答案 1 :(得分:1)

问题出在您的模型函数getMemberActivity上。如果没有记录,那么您将返回0,而当您foreach时,将得到错误,因为它不是数组。因此您可以简单地返回$result,因为codeigniter返回默认数组。

public function getMemberActivity($gotMemberId)
{
    $getDetails = array('members.member_id' => $gotMemberId, 'members.is_Approved' => 1);
    $result = $this->db->where($getDetails)
        ->from('members')
        ->join('member_activity', 'members.member_id = member_activity.member_id AND member_activity.activity_status = 1', 'LEFT')
        ->get()
        ->result();
    return $result;

}

第二个选项是您可以在!empty之前检查foreach

答案 2 :(得分:0)

希望这对您有所帮助

foreach ($SActivity as $sec_1) {
    if (!empty($sec_1)):
        foreach ($sec_1 as $sec_activities) {
            //list here
            print_r($sec_activities);  
        }
    endif;
}