Foreach rows as row
Если я выполню это, я получу первую строку arrayarrayarray (…), но вторая пуста. Есть ли способ выполнить это дважды?
РЕДАКТИРОВАТЬ: У меня была опечатка в этом посте, оригинальный вопрос стоит
Решение
$rows является подготовленным объектом заявления. Этот объект реализовать Traversable так что вы можете использовать foreach получать результаты, а не напрямую вызывать метод выборки. Но после того, как вы получили результаты один раз, вы не можете получить их снова. Вам нужно будет выполнить запрос снова или сохранить результаты в массиве во время первой итерации и использовать сохраненные результаты во второй раз, например так:
Кроме того, я не уверен, как echo($row) работает здесь, так как я бы предположил, $row будет массив, но это не относится к делу.
Другие решения
Я чувствую, что это проблема с печатанием и должна быть:
Существует несколько способов формирования результатов запроса:
Массив Результата
result()
Этот метод возвращает результат запроса в виде массива объектов или пустой массив при неудаче. Обычно вы будете использовать этот метод в цикле foreach, например:
Вышеописанный метод является псевдонимом result_object() .
Вы также можете передать строку в result() , который представляет собой класс создания экземпляра для каждого объекта результат (Примечание: этот класс должен быть загружен)
result_array()
Этот метод возвращает результат запроса в виде обычного массива или пустого массива если нет результатов. Обычно вы будете использовать этот метод в цикле foreach, например:
Строки Результата
row()
Этот метод возвращает одну строку результата. Если ваш запрос содержит более одной строки, метод вернет только первую строку. Результат возвращается в качестве объекта. Вот пример использования:
Если вам нужно получить определенную строку, вы можете указать номер строки числом в качестве первого параметра:
Вы также можете добавить вторым параметром строку, которая является именем класса для создания экземпляра строки:
row_array()
Идентичен методу row() выше, кроме того что он возвращает массив. Пример:
Если вам нужно получить определенную строку, вы можете указать номер строки числом в качестве первого параметра:
Кроме того, вы можете перемещаться вперед/назад/начало/конец в ваших результатах, используя эти вариации:
По умолчанию они возвращают объект, пока вы не поместите слово “array” в параметре:
Все эти методы будут загружать весь результат в память (предварительная выборка). Используйте unbuffered_row() для обработки больших наборов результатов.
unbuffered_row()
Этот метод возвращает одну строку результата без предзагрузки всего результат в память в отличии от row() . Если ваш запрос содержит более одной строки, он возвращает текущую строку и сдвигает внутренний указатель данных вперед.
При желании вы можете передать ‘object’ (по умолчание) или ‘array’ для того, чтобы задать тип возвращаемого значения:
Пользовательские Объекты Результата
Вы можете получить результаты запроса как экземпляр пользовательского класса вместо stdClass или массив как позволяют методы result() и result_array() . Требует, чтобы класс уже был загружен в память. Объект будет иметь все значения, возвращаемые из базы данных установленными как свойства. Если они были объявлены и непубличны, то вы должны предоставить __set() метод чтобы их можно было установить.
Помимо уже перечисленных методов, следующие методы также могут иметь имя класса, чтобы вернуть результаты: first_row() , last_row() , next_row() , and previous_row() .
custom_result_object()
Возвращает полный результирующий набор массива экземпляров указанного класса. Единственный параметр — имя класса для инициализации.
custom_row_object()
Возвращает одну строку из результатов запроса. Первый параметр — номер строки результата. Второй параметр — имя класса для инициализации.
Вы также можете использовать метод row() точно таким же образом.
Вспомогательные Методы Результатов Запроса
num_rows()
Количество строк, возвращаемых запросом. Примечание: В этом примере, $query — переменная, которой присваивается объект результата запроса:
Не все драйверы баз данных способны получить общее количество строк в результирующем наборе. В этом случае, все данные кешируются и могут быть подсчитаны вручную методом count() , чтобы достичь того же результата.
num_fields()
Количество ПОЛЕЙ (столбцов) возвращенных запросом. Убедитесь в том, что вызваемый метод, использует результат запроса объекта:
free_result()
Освобождает память связанную с результатом и удаляет ресурс результата ID. Обычно PHP автоматически освобождает память в конце выполнения скрипта. Однако, если вы используете много запросов в скрипте, где вы возможно захотите освободить память после каждого запроса, вам следует использовать этот метод для сокращения потребляемой памяти.
data_seek()
Этот метод устанавливает внутренний указатель на следующую строку, извлеченного результата. Это полезно только в сочетании с unbuffered_row() .
Он принимает положительное целочисленное значение, которое по умолчанию равно 0 и возвращает TRUE при успехе или FALSE в случае неудачи.
Не все драйвера баз данных поддерживают эту функцию и возвращают FALSE. Прежде всего вы не сможете использовать его с PDO.
Справка Класса
>CI_DB_result result( [ $type = ‘object’ ] )
Параметры: |
|
---|---|
Возвращает: |
Массив, содержащий выбранные строки |
Возвращаемый тип: |
Возвращает: | Массив, содержащий выбранные строки |
---|---|
Возвращаемый тип: | массив |
Возвращает результаты запроса в виде массива строк, где каждая строка представляет собой ассоциативный массив.
result_object()
Возвращает: | Массив, содержащий выбранные строки |
---|---|
Возвращаемый тип: | массив |
Возвращает результаты запроса в виде массива строк, где каждая строка представляет собой объект stdClass .
custom_result_object($class_name)
Параметры: |
|
---|---|
Возвращает: |
Массив, содержащий выбранные строки
Возвращает результат запроса в виде массива строк, где каждая строка является экземпляром указанного класса.
row( [ $n = 0 [ , $type = ‘object’ ] ] )
- $n (число) – Индекс строки запроса которая должна быть возвращена
- $type (строка) – Тип требуемого результата — массив, объект или имя класса
Требуемую строку или NULL если таковой не существует
Обертка для row_array() , row_object() и «custom_row_object() методов.
unbuffered_row( [ $type = ‘object’ ] )
- $type (строка) – Тип требуемого результата — массив, объект или имя класса
Следующую строку запроса или NULL если таковой не существует
Выбирает следующую строку результата и возвращает ее в запрошенной форме.
row_array( [ $n = 0 ] )
- $n (число) – Индекс строки запроса которая должна быть возвращена
Требуемую строку или NULL если таковой не существует
Возвращает запрошенный строку результата в виде ассоциативного массива.
row_object( [ $n = 0 ] )
- $n (число) – Индекс строки запроса которая должна быть возвращена
Требуемую строку или NULL если таковой не существует
Возвращает запрошенную строку результата как объект типа stdClass .
custom_row_object($n, $type)
- $n (число) – Индекс строки возвращаемых результатов
- $class_name (строка) – Имя класса для результирующей строки
Требуемую строку или NULL если таковой не существует
Возвращает запрошенную строку результата как экземпляр запрашиваемого класса.
data_seek( [ $n = 0 ] )
- $n (число) – Индекс строки следующей для получения результата
TRUE при успехе, FALSE в случае неудачи
Перемещает внутренний указатель в результатах запроса до нужнного смещения.
set_row($key [ , $value = NULL ] )
- $key (смешанный) – Имя столбца или массив пары ключ/значение
- $value (смешанный) – Значение, присваиваемое столбцу, $key как одно имя поля
Присваивает значение определенному столбцу.
next_row( [ $type = ‘object’ ] )
- $type (строка) – Тип требуемого результата — массив, объект или имя класса
Следующую строку из результирующего набора, или NULL если он не существует
Возвращает следующую строку из результирующего набора.
previous_row( [ $type = ‘object’ ] )
- $type (строка) – Тип требуемого результата — массив, объект или имя класса
Предыдущую строку из результирующего набора, или NULL если он не существует
Возвращает предыдущую строку из результирующего набора.
first_row( [ $type = ‘object’ ] )
- $type (строка) – Тип требуемого результата — массив, объект или имя класса
Первую строку из результирующего набора, или NULL если он не существует
Возвращает первую строку из результирующего набора.
last_row( [ $type = ‘object’ ] )
- $type (строка) – Тип требуемого результата — массив, объект или имя класса
Последнюю строку из результирующего набора, или NULL если он не существует
Возвращает последнюю строку из результирующего набора.
num_rows()
Возвращает количество строк в результирующем наборе.
num_fields()
Возвращает: | Количество полей в результирующем наборе |
---|---|
Возвращаемый тип: | число |
Возвращает количество полей в результирующем наборе.
field_data()
Возвращает: | Массив, содержащий поля мета-данных |
---|---|
Возвращаемый тип: | массив |
Создает массив stdClass объектов содержащий поля мета-данных.
free_result()
Возвращаемый тип: | пустота |
---|
Освобождает результирующий набор.
list_fields()
Возвращает: | Массив имен столбцов |
---|---|
Возвращаемый тип: | массив |
Возвращает массив, содержащий имена полей в результирующем наборе.
© Copyright 2014 — 2020, British Columbia Institute of Technology. Последнее обновление 22 Апреля 2018.
I have a pretty standard database like:
and I want to display it in a table, but every row in the DB needs to be a column in HTML table:
I get all the data in one long column. How do I break the column after every SQL row?
Note: $data is an array of objects that contain properties with the field values (you can probably figure that out from the example).
EDIT:
I found the solution, see my answer, it’s simple and elegant.
6 Answers 6
I figured it out, turns out it’s a pretty simple solution with few cycles and pre-populating an array before writing rows and cells.
I tested it, works like a charm. 😉 It might be useful for someone, so here it is:
Answer has been updated for adjusted original post requirements as follows:
this is a wierd (or elegant) way to get what you want done and it will likely take tweaking to get it to look pretty, but it seems to work as you can see at the following url
it has the php div method on top and does indeed show that the div’s are different sizes as you had hoped would not happen. I have however come up with elegant/ugly solution that works with a table.
i have to admit it is strange, but it keeps your tables with the correct heights .. the next more complicated part would be to set how many columns to show as this method makes it much more complicated to break after 5 columns like the div method I had earlier.