Много запросов в цикле. Как избавиться

ElGato

Новичок
Много запросов в цикле. Как избавиться

Доброго времени суток.

Имеются скрипты такого вида

PHP:
$readers = $blog->getReaders();
foreach ($readers as $userID)
{
      echo getUserNameByID($userID);    
      echo getUserDOBByID($userID);     
}
$blog->getReaders() - возвращает массив ID пользователей

getUserNameByID - функция которая делает запрос типа SELECT name FROM users WHERE ID=$userID
и потом определённым образом форматирует name (делает его с заглавной буквы)

getUserDOBByID - то же самое только с датой рождения

Как оказалось, такие конструкции довольно медленно работают (много запросов),
гораздо быстрее выбрать все данные за один запрос
(SELECT ID,name,DOB....), но это не очень удобно.

Единственное что приходит в голову - написать функции getFormattedNameByName вместо getUserNameByID,
которые делали бы нужное мне форматирование имён и дат рождения.

(Есть другие подобные функции, которые делают более сложные вычисления)


Кто что думает по этому вопросу?
 

ElGato

Новичок
Автор оригинала: badmovie
2 ElGato

А почему не удобно выбирать данные за один запрос???
Потому что я могу, в данном случае, в методе $blog->getReaders() выбирать только ID пользователей, и не задумываться об остальных полях (DOB и пр) которые могут мне понадобиться.

А где мне надо ставлю getUserNameByID и всё.
 

sayber

Новичок
Добавь в метод кеширование.
При первом запросе выбирай данные в массив, а при последующих уже из массива.
 

Wicked

Новичок
Я бы сделал, чтобы getReaders() таки возвращал объекты пользователей целиком.

И код выглядел бы примерно так:
PHP:
$readers = $blog->getReaders();
foreach ($readers as $user)
{
      echo $user->getName();
      echo $user->getDOB();
}
 

Mols

Новичок
Вообще не понял в чём тут проблема? Не хотите много запросов - делайте один запрос. Форматить первую букву в заглавную... это разве проблема ? Вплоть до того, что заключаете это всё в SPAN - и присваиваете соответсвующий стиль для этого SPAN.... форматируте ведь для отображения в браузере ?
 

Апокалипсис

тех дир matras.ru
Wicked
+1
сам переписывал на днях подобный код интернет магазина.
Видимо сначало было всё ничего у них, но как появилась куча товаров - страница генерировалась за 10(!!!) секунд.
В цикле - обрабатывалось 2 запроса с LEFT JOIN
Вообще запросы в цикле - зло.
 

Pigmeich

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

zerkms

TDD infected
Команда форума
Pigmeich
зачем раскрывать детали реализации метода?!
 

Pigmeich

Новичок
Зачем детали?

Сказать, что это хендл такой собственный и его надо передавать первым аргументом навроде хендлов файлов. На fread() я не помню когда последний раз жаловались.

Ещё вариант, "запрашиватель" оформить объектом и хранить хендл ответа внутри. Вот и инкаспуляцию заюзаем. Для чего же ещё объекты выдумали? (Изначально, я имел в виду)
 

ElGato

Новичок
Большое всем спасибо за ответы.

Воспользуюсь советом Wicked
 
Сверху