0

嘿伙计们,我有一个从 MySQL 数据库中检索数据的函数的小问题,然后我使用 foreach 循环遍历结果,检查一个值以查看它是否为空,如果是,则将其替换为另一个值。

这个函数的问题是,在返回数据后,我只能查看从数据库中检索到的一条记录。可能是一些简单的事情,但它超出了我的范围。

我想在将其传递给控制器​​或视图之前执行此操作。也许这对于 foreach 循环是不可能的?我错过了什么?

这是我的代码示例。

public function get_basic_user_data(){
    $sql = 'SELECT Account.First_Name, Account.Last_Name, Account.User_Name, Profile_Photos.Thumb_Url 
            FROM Account 
            LEFT JOIN Profile_Photos ON Account.idAccount = Profile_Photos.Account_Id 
            AND Profile_Photos.Active = 1
            WHERE Account.idAccount != ?';
    $account_id = $this->get_account_id();
    $data = $this->db->query($sql, $account_id);

    foreach($data->result() as $row){

            if($row->Thumb_Url == NULL){
                $image = base_url().'assets/images/no_photo_thumb.png';
            }else{
                $image = $row->Thumb_Url; 
            }


    $new_data = new stdClass;
    $new_data->First_Name = $row->First_Name;
    $new_data->Last_Name = $row->Last_Name;
    $new_data->User_Name = $row->User_Name;
    $new_data->Thumb_Url = $image;

    }   

    return $new_data;

}   

希望有人可以帮助我吗?谢谢!

4

4 回答 4

1

目前您只是返回最后一个数据行。像这样更改代码以从该函数返回所有行的数组:

$rows = array()
foreach($data->result() as $row){

    if($row->Thumb_Url == NULL){
        $image = base_url().'assets/images/no_photo_thumb.png';
    }else{
        $image = $row->Thumb_Url; 
    }


    $new_data = new stdClass;
    $new_data->First_Name = $row->First_Name;
    $new_data->Last_Name = $row->Last_Name;
    $new_data->User_Name = $row->User_Name;
    $new_data->Thumb_Url = $image;

    $rows[] = $new_data;
}   

return $rows;

这样,从数据库返回的每一行都将被添加到一个名为$rows. 最后你必须返回你的新数组。

于 2013-01-25T08:02:33.177 回答
0

您正在覆盖 $new_data 每次迭代。试试这个

$new_data = new stdClass
...
$all_data[] = $new_data;

您可以在 SQL 查询中使用 IFNULL 语句,而不是检查代码中的空值,这确实将逻辑分开了一点,但在这种情况下它可能是值得的。

于 2013-01-25T08:03:31.997 回答
0

该函数仅返回结果中的最后一行,因为 new_data 变量在循环的每一步都被覆盖。在函数开头声明 new_data 数组并将行添加为数组元素

...
$new_data[] = new stdClass;
...
于 2013-01-25T08:05:42.217 回答
0

foreach 的每次迭代都会覆盖 $new_data ,因此最终当函数返回时,只会返回最后获取的行。要返回多行,您可以将所有行存储在一个数组中,然后最后返回该数组。它看起来像这样:

public function get_basic_user_data(){
    $sql = 'SELECT Account.First_Name, Account.Last_Name, Account.User_Name, Profile_Photos.Thumb_Url 
            FROM Account 
            LEFT JOIN Profile_Photos ON Account.idAccount = Profile_Photos.Account_Id 
            AND Profile_Photos.Active = 1
            WHERE Account.idAccount != ?';
    $account_id = $this->get_account_id();
    $data = $this->db->query($sql, $account_id);

    $data = array();
    foreach($data->result() as $row){

        if($row->Thumb_Url == NULL){
            $image = base_url().'assets/images/no_photo_thumb.png';
        }else{
            $image = $row->Thumb_Url; 
        }


        $new_data = new stdClass;
        $new_data->First_Name = $row->First_Name;
        $new_data->Last_Name = $row->Last_Name;
        $new_data->User_Name = $row->User_Name;
        $new_data->Thumb_Url = $image;

        $data[] = $new_data;
    }   

return $data;

}   

为了能够使用此函数,您必须更改使用它循环对象数组的代码。

于 2013-01-25T08:11:55.303 回答