php не возвращает все результаты из запроса MySQL в foreach

Привет, ребята, у меня есть небольшая проблема с функцией, которая извлекает данные из базы данных 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; } 

Надеюсь, кто-то может мне помочь? Благодаря!

На данный момент вы просто возвращаете последнюю строку данных. Измените свой код таким образом, чтобы вернуть массив из всех ваших строк из этой функции:

 $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 . В конце вы должны вернуть свой новый массив.

Вы переписываете $ new_data каждую итерацию. Попробуй это

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

Вместо проверки нулевого значения в коде вы можете просто использовать оператор IFNULL в SQL-запросе, это немного отделяет логику, но в этом случае это может стоить.

Функция возвращает только последнюю строку результата, потому что переменная new_data перезаписывается на каждом шаге вашего цикла. Объявите new_data массив в начале вашей функции и добавьте строки в виде элементов массива

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

Каждая итерация 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; } 

Чтобы иметь возможность использовать эту функцию, вы должны изменить код, который использует его для циклического преобразования массива объектов.