Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » Общие вопросы по PHP » Помогите редактировать запрос

Помогите редактировать запрос


     28.09.2013    Все вопросы » Общие вопросы по PHP    4200

вопрос
Здравствуйте, есть вот этот код


$rows = $db->super_query( "SELECT COUNT(*) as count FROM " . PREFIX . "_post WHERE category = '1' AND autor = '$user'");
    $games_num = $rows['count'];
    $tpl->set('{games-num}', $games_num);


в шаблоне я пишу {games-num} и выводит новости которые добавил пользователь в какой-то категории.

Проблема в том что у меня много категорий и делать много запросов не хорошо. Так вот помогите подредактировать этот код таким образом чтобы в шаблоне userinfo.tpl было так {games-num-1} где 1 это ID категории.

Ответил: ПафНутиЙ


Модуль
Вывод новостей текущего юзера:
{include file="engine/modules/user.news.counter.php?&userName=this&catId=1"}

Вывод новостей админа:
{include file="engine/modules/user.news.counter.php?&userName=admin&catId=5"}

Префикс кеша лучше оставить как есть, тогда кеш будет чиститься только при добавлении новостей.


UPD (dj-avtosh)

https://dle-faq.ru/faq/phpquest/6922-pomogite-redaktirovat-zapros.html#comment-id-17195
Отредактировал 29-09-2013, 14:18 - dj-avtosh
Причина: UPD BY DJ-AVTOSH

31 комментарий

dj-avtosh
PHP-developer

dj-avtosh - 28 сентября 2013 11:56 -

Приходит массив id категорий, юзаешь where category IN. Ну и далее в цикле запускаешь шаблонизатор регулярочкой.

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

TheImDim
Юзер

TheImDim - 28 сентября 2013 12:07 -

В таких ситуациях лучше хранить значения отдельно, чем подсчитывать каждый раз.


$rows = $db->super_query( "SELECT `category` FROM " . PREFIX . "_post WHERE `autor` = '$user'");
$row = $db->get_row( $rows );

if( $row ) {
  do {
         ++$games_num[ $row['category'] ];
} while( $row = $db->get_row( $rows ) );
}

foreach( $games_num as $key => $val ) {
   $tpl->set( '{games-num-'.$key.'}', $val );
}


dj-avtosh
PHP-developer

dj-avtosh - 28 сентября 2013 12:36 -

Какой глупый код. Цикл пропускается как ресурс. Фу. Super_query с опущенным вторым параметром - вернет одно значение. Лучше не писать, без теста. Если плохо знаешь php.

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 28 сентября 2013 12:40 -

Далее переменную в запросе пропускаешь как строку, что в 8 раз дольше обработается, еже ли по всем правилам разделить через точки.

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 28 сентября 2013 12:42 -

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

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 28 сентября 2013 12:45 -

Да и вообще не понимаю момент, вопрос же в количестве новостей, при этом, однако, массив категорий приходит глобально как $cat_info, если не ошибаюсь и кэшируется в init.php

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

ПафНутиЙ
Админ

ПафНутиЙ - 28 сентября 2013 22:52 -

не в init.php а в системном кеше.

Каков вопрос - таков и ответ. Просто помните об этом.

dj-avtosh
PHP-developer

dj-avtosh - 29 сентября 2013 04:11 -

Я имел ввиду файл в котором контроллер написания кэша.

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

ПафНутиЙ
Админ

ПафНутиЙ - 29 сентября 2013 11:16 -

а вот это хз)

Каков вопрос - таков и ответ. Просто помните об этом.

FastFud
Юзер

FastFud - 28 сентября 2013 13:28 -

Было бы так просто для меня я бы не задал этот вопрос ).
Можите сделать пример как правильно будет а то я буду пробовать где то месяц.

dj-avtosh
PHP-developer

dj-avtosh - 28 сентября 2013 14:09 -

Ну ты был близок к истине))

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

FastFud
Юзер

FastFud - 28 сентября 2013 14:18 -

так что ли


$rows = $db->super_query( "SELECT COUNT(*) as count FROM " . PREFIX . "_post WHERE category IN ('" . implode ( "','", $cat_info[$category_id] ) . "') AND autor = '$user'");

TheImDim
Юзер

TheImDim - 28 сентября 2013 14:21 -

С super_query согласен, не заметил.

Да и вообще не указаны типы переменных. Нет проверок


Что за бред ты несешь? Я тут привел алгоритм каким образом можно подсчитать количество новостей у пользователя. Расписывать тут все я не собираюсь. Если есть желание и время, напиши скрипт, а не неси ерунду. А то на словах Лев Толстой, а на деле.

dj-avtosh
PHP-developer

dj-avtosh - 28 сентября 2013 17:48 -

Я знаю что я плохой программист)) просто любой язык кроме пэхэпэ :D не компилирует код без приведения типа. Это я тебе как Лев Толстой говорю. На деле я принимал участие в разработке сайта, на котором ты сейчас комментируешь, это так на заметку ;)

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 28 сентября 2013 17:59 -

Я для тебя ещё внизу про двойное создание переменной написал. Это есть кул))) Оперативы же много нынче на серваках)))

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

TheImDim
Юзер

TheImDim - 7 октября 2013 14:03 -

Где у меня двойное создание переменной? Ну да, этот процесс занимает целый гигабайт оперативной памяти в php. Вообще удивляют люди, которые выучат скриптовый язык и считают себя "программистами". А потом учат других жизни. Я не заявляю о себе как супер-пупер программист, и вам не советую заниматься балабольством, если конечно у Вас есть крупные проекты над которомы работали, покажите нам, чтобы мы знали с кем имеем дело, и не надо говорить что это dle-faq.ru.

dj-avtosh
PHP-developer

dj-avtosh - 7 октября 2013 14:38 -


По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

TheImDim
Юзер

TheImDim - 28 сентября 2013 18:12 -

Ну почему же любой язык, динамическая типизация есть и в ruby, python, perl и не только. Я не говорю, и не говорил что мой код оптимизирован и является обзразцовым, я лишь подсказываю как это можно сделать.

dj-avtosh
PHP-developer

dj-avtosh - 28 сентября 2013 18:14 -

No problem. Просто не стоит оценивать мои знания своими догадками. Тем более мой опыт работы. На личности переходить как то по юношески.

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

budda555
Юзер

budda555 - 28 сентября 2013 19:49 -

Я вот наблюдаю за беседой и пришел к выводу, что Вы просто неадекватны, так как комментировать подобным образом мысли гениального программиста вроде dj-avtosh-а, просто бессмысленно.
Занялись бы делом )

FastFud
Юзер

FastFud - 28 сентября 2013 14:24 -

TheLmDim

вот так работает без super_ как сказали )


    $rows = $db->query( "SELECT `category` FROM " . PREFIX . "_post WHERE `autor` = '$user'");
$row = $db->get_row( $rows );

if( $row ) {
  do {
         ++$games_num[ $row['category'] ];
} while( $row = $db->get_row( $rows ) );
}

foreach( $games_num as $key => $val ) {
   $tpl->set( '{games-num-'.$key.'}', $val );
}

FastFud
Юзер

FastFud - 28 сентября 2013 14:29 -

Есть 1 но

Исчезает количество новостей в целом и комментариев

FastFud
Юзер

FastFud - 28 сентября 2013 14:46 -

вот так работает


        $rows = $db->query( "SELECT `category` FROM " . PREFIX . "_post WHERE `autor` = '$user'");
        $rowz = $db->get_row( $rows );

if( $rowz ) {
  do {
         ++$m_num[ $rowz['category'] ];
}   while( $rowz = $db->get_row( $rows ) );
}

foreach( $m_num as $key => $val ) {
   $tpl->set( '{m-num-'.$key.'}', $val );
}


Но остается вопрос, правильно ли.

dj-avtosh
PHP-developer

dj-avtosh - 28 сентября 2013 17:57 -

Мне нравится два раза подряд создание переменной $rowz, Анатоле бы не одобрил :D

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

ПафНутиЙ
Админ

ПафНутиЙ - 28 сентября 2013 22:53 -

А не проще ли оформить модулем отдельным, что-то многовато кода лишнего на вскидку, к том же без кеша.?

Каков вопрос - таков и ответ. Просто помните об этом.

dj-avtosh
PHP-developer

dj-avtosh - 29 сентября 2013 11:18 -

Попробуй, тестить негде было:



/**
  * Подсчет количества постов по каждой категории у определенного юзера
  */

      // Получим category для данного автора

      $pUserArray = $db->super_query ( "SELECT category FROM " . PREFIX . "_post WHERE autor = '" . $user . "'", TRUE );

      // Т.к. возможна мультикатегорийность, то пройдемся по каждой полученной категории

      if ( ! empty ( $pUserArray ) )
      {

              $countFromCategory = array();

              foreach ( $pUserArray as $_pua )
              {

                  $categoryArr = explode ( ',', $_pua['category'] );

                  if ( ! empty ( $categoryArr ) )
                  {

                      if ( is_array ( $categoryArr ) )
                      {

                          foreach ( $categoryArr as $_ca )
                          {

                              ! isset ( $countFromCategory[$_ca] ) ? $countFromCategory[$_ca] = 1 : $countFromCategory[$_ca]++;

                          }

                      } else {

                          ! isset ( $countFromCategory[$categoryArr] ) ? $countFromCategory[$categoryArr] = 1 : $countFromCategory[$categoryArr]++;

                      }

                  } else {

                      continue;

                  }

              }


              if ( ! empty ( $countFromCategory ) )
              {

                  foreach ( $countFromCategory as $_cID => $_cfc )
                  {

                      $tpl->set( '{m-num-' . $_cID . '}' , $_cfc );

                  }

              }

      }


По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

FastFud
Юзер

FastFud - 29 сентября 2013 12:12 -

dj-avtosh
Да работает, спасибо но если пользователь ничего не добавлял то остаются только теги {m-num-1}

Я добавил еще:


$tpl->set_block( "'\\[unews-num\\](.*?)\\[/unews-num\\]'si", "" );
                        $tpl->set( '[not-unews-num]', "" );
                        $tpl->set( '[/not-unews-num]', "" );


Ну и теперь работает как надо.

dj-avtosh
PHP-developer

dj-avtosh - 29 сентября 2013 14:17 -

Молодец

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

Nagibaka
Эксперт

Nagibaka - 7 октября 2013 14:58 -

После прочтения этого увлекательного топика, сразу захотелось добавить новую фичу на сайт - около автарки добавить счетчики Epic Fail(ну или баттхерт) и Epic Win для каждого пользователя.

Frontend MotherFucker=:^^

TheImDim
Юзер

TheImDim - 7 октября 2013 15:52 -

Не забудьте добавить кнопочку "Пофлудить" (ну или нести херню)

dj-avtosh
PHP-developer

dj-avtosh - 7 октября 2013 16:16 -

Андрей, не спорь с программистом))) Он же крут))

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

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

наверх