Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Как правильно: получить информацию об авторе поста


Автор: bFree 24.8.2011, 13:00
Здравствуйте 
 Столкнулся с вопросом из разряда "как грамотнее" 
 Допустим, что есть посты (форум, гостевая книга, комментарии) 
 Соответсвтенно в БД для каждого поста хранится айдишник автора. 
 До этого момента вытягивал из бд все что нужно примерно вот так: 
 SELECT * FROM posts LEFT JOIN user ON post_author = user_id 

 Соответственно получал для каждого поста и инфу о пользователе, которая нужна для вывода. 

 Но дело в том, что с таким подходом получается так, что: 
 1. Для постов с одним автором информация дублируется лишние разы, что, как мне кажется, не очень хорошо 
 2. Если выводим посты циклом с fetch_assoc, то возникает необходимость передавать инфу о пользователе в какой-либо класс, который ее обработает для вывода (например, отдаст ссылку с иконкой пользователя или его соц. сети, итп итп). Соответсвенно в класс передается массив с полями-ключами пользователя. Но в этом же массиве есть еще информация о посте. Кажется, получается слишком жирно и избыточно. 

 Может быть будет грамотнее как-либо отделять данные постов от данных пользователей и сопоставлять их друг-другу уже в скрипте на выводе (но тогда получится лишний запрос и лишний цикл для обработки)?

Автор: cmygeHm 24.8.2011, 14:42
покажи пожалуйста print_r твоего результирующего массива, чтобы было более понятно как выглядят данные.

А вообще - это дело вкуса... Идеального кода не бывает. И опыт приходит со временем.

Автор: bFree 24.8.2011, 15:03
Из БД текущим способом получаю такой массив:
Код
Array
(
    [0] => Array
        (
            [gb_id] => 5
            [gb_author] => 10
            [gb_msg] => another some msg
            [gb_date] => 1314127938
            [user_id] => 10
            [user_identity] => http://twitter.com/user2
            [user_password] => 
            [user_nickname] => user2
            [user_full_name] => user2
            [user_email] => 
            [user_regdate] => 1313749773
            [user_photo] => http://api.twitter.com/1/users/profile_image/ya_vladik.json?size=bigger
            [user_activate_code] => 
            [user_blocked] => 0
            [user_etc_info] => 
        )

    [1] => Array
        (
            [gb_id] => 4
            [gb_author] => 16
            [gb_msg] => some msg
            [gb_date] => 1314127747
            [user_id] => 16
            [user_identity] => http://www.last.fm/user/user1
            [user_password] => 
            [user_nickname] => user1
            [user_full_name] => http://www.last.fm/user/user1
            [user_email] => 
            [user_regdate] => 1314123215
            [user_photo] => 
            [user_activate_code] => 
            [user_blocked] => 0
            [user_etc_info] => 
        )
)


Соответсвенно его кручу в foreach и вывожу
Также в цикле передаю каждый элемент в метод другого класа для формирования ссылки на пользователя

Автор: cmygeHm 24.8.2011, 17:32

например так:

Код

$authors = array();
$author = new Author();

foreach(твой массив as $item) {

       if (!array_key_exists($item['author_id'], $authors))  {

                 
                 $authors[$item['author_id']]  = $author->getInfo($item['author_id']);

      }

}


А вообще лучше запрос к БД как-нить перебрать. Вопрос твой специфичен, опять же повторюсь: "А вообще - это дело вкуса... Идеального кода не бывает. И опыт приходит со временем."

Можешь в кроне себе поставить задачу на год, чтобы через год сообщила, что этот кусок кода стоит пересмотреть smile Приятно удивишься smile

Автор: Smorodin 2.9.2011, 13:25
Когда выводил комментарии (штук 200), делал так: складывал ИД юзеров в массивчик, при обходе сообщений проверял наличие ИД юзера в массиве, если нет такого - добавлял. Потом 1 доп. запросом только к таблицам пользователей доставал инфу пользователей, чтобы повторяющиеся данные не хранить. Работало шустро, и код получился красивый.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)