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