208 похожих чатов

Добрый день, мне нужно перебрать всех пользователей, сделал код $i =

1;
while (true) {
$arRes = \CUser::GetList(
$by = "ID",
['id' => 'desc'],
['>ID' => 0],
['SELECT' => ['*', 'UF_*'],
'NAV_PARAMS' => ['nPageSize' => 30, 'iNumPage' => $i]
]
);
$el = $arRes->Fetch();
if (empty($el)) { break; } else { echo $el['ID'] . "\n"; }

while ($el = $arRes->Fetch()) {
echo $el['ID'] . "\n";
}
++$i;
}

у меня всего 290 страниц, и $i становится больше последней страницы Bitrix выдаёт первую, почему ? нужно както по другому выборку делать ?

19 ответов

33 просмотра

Что то странное делаете, зачем вам постраничная навигация в этом запросе? уберите её и while, получите одним запросом всех пользователей

Rico- Автор вопроса
Михаил Титков
Что то странное делаете, зачем вам постраничная на...

Сейчас у меня 290 пользователей, станет 1 000 000 , мне просто памяти нехватит всех достать сразу

Rico
Сейчас у меня 290 пользователей, станет 1 000 000 ...

это всё равно странное решение, время загрузки страницы тогда будет минут 10

новый ORM D7 тоже? UserTable может UF так же вытаскивать.

а он и не писал ничего про загрузку страницы, может это скрипт фоновый

Запросы в цикле, это где такому учат?

Антон Piletskiy
а он и не писал ничего про загрузку страницы, може...

Тогда нужно за одну итерацию одну пачку обрабатывать, а не весь миллион

Дмитрий Муравьёв
Запросы в цикле, это где такому учат?

Открою тайну: не всегда запросы в цикле - зло 😁

Rico- Автор вопроса
Дмитрий Муравьёв
Запросы в цикле, это где такому учат?

Откройте мне истину, как должно быть ?

Rico
Откройте мне истину, как должно быть ?

Одним запросом выбираешь коллекцию, потом в цикле делаешь что тебе надо

Rico
Откройте мне истину, как должно быть ?

$users = UserTable::query() ->addSelect('ID') ->addSelect('UF_ESIA_DATA') ->whereNotNull('UF_ESIA_DATA') ->addOrder('ID', 'DESC') ->fetchCollection();

Rico- Автор вопроса
Дмитрий Муравьёв
$users = UserTable::query() ->...

У меня вопрос был вытаскивать по 30 и чтобы страницы , после последней не возвращали бесконечно первую , как это сделать ?

Rico- Автор вопроса
Дмитрий Муравьёв
$users = UserTable::query() ->...

Несовсем понимаю в чём отличие от $arRes = \CUser::GetList( $by = "ID", ['id' => 'desc'], ['>ID' => 0], ['SELECT' => ['*', 'UF_*'], 'NAV_PARAMS' => ['nPageSize' => 30, 'iNumPage' => $i] ] ); ? просто написано по другому

Rico
Несовсем понимаю в чём отличие от $arRes = \CUs...

Отличие в том, что выбираются сразу все записи без постранички и берутся только необходимые столбцы. При малом количестве памяти сервера и очень большом количестве юзеров запуск такой выборки может привести к ошибкам нехватки памяти. Короче материал к изучению https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=5753&LESSON_PATH=3913.3516.5748.5063.5753 Смотреть в limit, offset и select. Метод \Bitrix\Main\UserTable::getList(...)

Rico- Автор вопроса
Антон Piletskiy
Отличие в том, что выбираются сразу все записи без...

В твоём примере fetchCollection() также вытаскивает все записи, проверял по занимаемой памяти , поэтому я и спользовал пагинацию чтобы сделать ограничение 'NAV_PARAMS' => ['nPageSize' => 30, 'iNumPage' => $i]

Rico
В твоём примере fetchCollection() также вытаскивае...

гугл: битрикс orm d7 постраничная навигация

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта