Расширенная статистика для конкурсов.

Автор kak2z, 14 марта 2012, 11:52:15

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

kak2z

В общем решил месяца два назад я провести у себя на форуме конкурс. Конкурс на лучшего писаку)) Назвал конкурс "Конкурс блогеров". Смысл конкурса в следующем - люди пишут свои статьи. За каждую статью читатели голосуют с помощью мода рейтинга http://dragomano.ru/page/topic-rating-bar
Все статьи выкладывают в одном разделе.
Самая большая загвоздка у меня была в анализе голосов. Конкурс уже был в разгаре, а адекватной статистики так и не было. Общая статистика то есть в моде, но мне нужен был анализ статей в одном разделе, а не по всему форуму.
Немного пошаманив сделал я вот такую табличку http://kak2z.ru/rat.php
Как оказалось самому сделать несложно)
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

GeorG

Ещё бы выронить всю это писанину которая выводится, а то кривовато смотрится. Можно тупо в таблицу засунуть.
Верстка тем по шаблону, их доработка/переработка, переделка тем с версии smf 1.1 на smf 2.0. Примеры работ - insidestyle.ru
Установка модов (заточка под ваш форум); Моды под заказ; Обновление форума; Правильный перенос; Удаление/лечение вирусов; Устранения ошибок.
Обращаться в ЛС
Мой форум
Модуль анти-спама CleanTalk, сам пользуюсь
Сервера которыми сам пользуюсь - cadedic.ru

kak2z

#2
Легко) Три файла из двух архивов положить в корень сайта)
Скрипт делает
1. выборку пользователей по группе
2. выборку их тем из определенного раздела
3. выборку балов каждой темы
4. сортировка
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

Inter

$query_member = sprintf ("SELECT * FROM smf_members WHERE id_group='14'");
Функция sprintf зачем?
I'm the law and you can't beat the law

|censored| 'em and their law

Crack down at sundown

Inter

while ($row_member = mysql_fetch_array($result_member)){ //Перебираем все пользователей участников конкурса (выборка сделана по ID группы)

$query_topic = sprintf ("SELECT * FROM smf_topics WHERE id_board='65'"); //Выборка smf_topics
$result_topic = mysql_query ($query_topic);


а если у вас 10000 разных id_member в форуме №65 будет?

Лучше так:
$q = mysql_query ('SELECT * FROM smf_topics WHERE id_board = 65');
if (mysql_num_rows($q) == 0)
echo 'Пусто!';
else
{
while ($row = mysql_fetch_assoc($q))
{
$data[] = $row;
// ...
}
mysql_free_result($q);
}
I'm the law and you can't beat the law

|censored| 'em and their law

Crack down at sundown

maestrosite.ru

#5
Цитата: Inter от 21 марта 2012, 20:50:40
$query_member = sprintf ("SELECT * FROM smf_members WHERE id_group='14'");
Функция sprintf зачем?

Пнуть коллегу - это всегда приятно =)) Поэтому, поехали:
1.require_once $boarddir . 'SSI.php';
require_once dirname(__FILE__) . '/SSI.php';

подключаемся два раза, если учесть
ЦитироватьТри файла из двух архивов положить в корень сайта
плюс не определена $boarddir

2. echo 'Проблемы блин'.mysql_error ().'';
include 'down.php';
die();

//echo '<PRE>';
//print_r ($arr1);
//echo '</PRE>';

вызов не один раз - значит это функция

3. '<a href="http://kak2z.ru/index.phpзлобный хардкод

4. чего вы не используете $smcFunc ?

5. $query_member = sprintf ("SELECT * FROM smf_members WHERE id_group='14'"); //Открываем таблицу pic_albums по идентификатору id_album
Прочитал. Не понял.

6. while ($row_topic = mysql_fetch_array($result_topic)){
if($row_topic['id_member_started']==$row_member['id_member']){
...
}
}
из каких соображений в sql-запрос не поставили это условие?
Если задаются вопросы по вашей проблеме, значит это нужно вам!
---
Обновления форума, разрешение конфликтов, адаптация модов, исправление ошибок - ваши предложения о сотрудничестве направляйте по адресу smf@maestrosite.ru

kak2z

Цитата: Inter от 21 марта 2012, 20:50:40
$query_member = sprintf ("SELECT * FROM smf_members WHERE id_group='14'");
Функция sprintf зачем?
не знаю зачем) раньше без нее делал. А потом увидел где то что правильнее форматировать строку запроса) Хоть там было написано про POST и GET запросы.

Цитата: Inter от 21 марта 2012, 21:00:29а если у вас 10000 разных id_member в форуме №65 будет?
спасибо за замечания но не понял смысла кода)) я еще не совсем быстро в код чужой вникаю)
у меня была цель выбрать всех пользователй из группы "Участник конкурса" а потом в той теме выбрать все их топики... а что я не так сделал? Если можно поподробнее.. спасибо.
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

maestrosite.ru

7. два sql-запроса в цикле -  по смыслу, между таблицами отношение один к одному - напрашивается INNER JOIN
Если задаются вопросы по вашей проблеме, значит это нужно вам!
---
Обновления форума, разрешение конфликтов, адаптация модов, исправление ошибок - ваши предложения о сотрудничестве направляйте по адресу smf@maestrosite.ru

kak2z

Цитата: transkontrol от 21 марта 2012, 21:07:42подключаемся два раза, если учесть
а я где то на форуме сразу нашел две строки) думал две сразу надо)) не вникал особо)) Спасибо буду знать)

Цитата: transkontrol от 21 марта 2012, 21:07:42вызов не один раз - значит это функция
не понял о чем это.. про include?? а зачем функция? в ней же кроме отключения от базы еще и футер записан... если можно поподробнее про все пишите) а то мне сложно понять где я набочинил)

Цитата: transkontrol от 21 марта 2012, 21:07:42злобный хардкод
а как надо?)

Цитата: transkontrol от 21 марта 2012, 21:07:42чего вы не используете $smcFunc ?
а я даже не знал что такая штука есть)) только что прочитал) это вместо mysql_query  ??? или не правильно?

Цитата: transkontrol от 21 марта 2012, 21:07:42Прочитал. Не понял.
ошибся в комментарии))

Цитата: transkontrol от 21 марта 2012, 21:23:50
7. два sql-запроса в цикле -  по смыслу, между таблицами отношение один к одному - напрашивается INNER JOIN
вообще не понял, но почитаю)
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

Inter

kak2z, в цикле не нужно выбирать - большая нагрузка на базу данных
I'm the law and you can't beat the law

|censored| 'em and their law

Crack down at sundown

kak2z


а.. то есть создаем массив а потом уже его обрабатываем? правильно я понял?
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

maestrosite.ru

Цитата: kak2z от 21 марта 2012, 21:24:40
не понял о чем это.. про include?? а зачем функция? в ней же кроме отключения от базы еще и футер записан... если можно поподробнее про все пишите) а то мне сложно понять где я набочинил)
Если код повторяется несколько раз, то оформляйте его в виде функции (метода), а в местах повтора вызывайте эту функцию
Цитата: kak2z от 21 марта 2012, 21:24:40
а как надо?)
так вы же сами используете $boardurl !
Это же + имя файла вместо $_SERVER['PHP_SELF']  - адрес вашего скрипта вы также несколько раз используете.
Цитата: kak2z от 21 марта 2012, 21:24:40
а я даже не знал что такая штука есть)) только что прочитал) это вместо mysql_query  ??? или не правильно?
да

8. if($row_topic_ratings['total_votes']>3) $number_blog_trast++; - а здесь в таблице флаг по идее
Если так, то в запросе к п.7 будет SUM('sum_total_votes) и SUM(_флаг_трастовых_)
Если задаются вопросы по вашей проблеме, значит это нужно вам!
---
Обновления форума, разрешение конфликтов, адаптация модов, исправление ошибок - ваши предложения о сотрудничестве направляйте по адресу smf@maestrosite.ru

kak2z

Пункты 7 и 8 вообще не понял о чем речь) Завтра с утра на работе почитаю) тогда буду задавать вопросы) а то даже не знаю что спросить) Спасибо что показываете куда идти) 
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

kak2z

Цитата: Inter от 21 марта 2012, 21:31:37
kak2z, в цикле не нужно выбирать - большая нагрузка на базу данных
то есть создаем массив а потом уже его обрабатываем? правильно я понял?
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

Gover

А по какой формуле рейтинг считается?, а то я по коду резко так не соображу.
Мне тут недавно тоже пришлось рейтинг игровых серверов подсчитывать, но только там для Joomla модуль писал.
Как много лишних слов, как мало лишниг денег...<br />Все победы в жизни начинаются с победы над собой.

kak2z

количество голосов делю на количество статей - узнаю некий индекс качественности статей.
И прибавляю к этому индексу количество статей у которых голосов больше 3х. Добавляю к качественному показателю количественный. Для того что бы сравнить шансы тех кто пишет много и тех кто пишет качественно)
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

Gover

У меня сложнее формула
где,

V – общее количество всех оценок, поданных за сервер,
Vср – средняя оценка для сервера, расчитывается как отношение суммы голосов к их количеству,
Aср – средняя оценка всех серверов на сайте, суммируются общие рейтинги всех серверов и делятся на их количество,
Vmin – минимальное количество оценок (на данный момент 5), до достижения которого рейтинг сервера стремится к Aср, а после достижения которого стремится к Vср.

на каком-то сайте нашел и адаптировал под свои нужды, вроде работает.
Как много лишних слов, как мало лишниг денег...<br />Все победы в жизни начинаются с победы над собой.

maestrosite.ru

Цитата: Inter от 21 марта 2012, 21:31:37
kak2z, в цикле не нужно выбирать - большая нагрузка на базу данных

Цитата: kak2z от 21 марта 2012, 21:36:37
а.. то есть создаем массив а потом уже его обрабатываем? правильно я понял?
Здесь, видимо, выбирать - имеется ввиду выполнять SQL-запрос. Чем больше циклов, тем больше раз базу дёрнуть придётся. Inter вам пример привёл, в котором сам запрос выполнен перед циклом, а в цикле осталось получение данных
Если задаются вопросы по вашей проблеме, значит это нужно вам!
---
Обновления форума, разрешение конфликтов, адаптация модов, исправление ошибок - ваши предложения о сотрудничестве направляйте по адресу smf@maestrosite.ru

kak2z

Все равно не понимаю)
while ($row_member = mysql_fetch_array($result_member)){ //Перебираем все пользователей участников конкурса (выборка сделана по ID группы)

$query_topic = sprintf ("SELECT * FROM smf_topics WHERE id_board='65'"); //Выборка smf_topics
$result_topic = mysql_query ($query_topic);


тут я создал массив пользователей (или как его назвать?) $row_member и для каждого пользователя из массива я выбираю топики из раздела 65.

у Интера тут вот что

$q = mysql_query ('SELECT * FROM smf_topics WHERE id_board = 65');
if (mysql_num_rows($q) == 0)
echo 'Пусто!';
else
{
while ($row = mysql_fetch_assoc($q))
{
  $data[] = $row;
  // ...
}
mysql_free_result($q);
}

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

В принципе можно ускорить так... создать заранее массив всех топиков из раздела 65. Создать еще один массив из всех пользователей определенной группы - а затем уже вертеть массивами без дергания базы... это и логично и правильно... Интер это имел ввиду?
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

Inter

я не собираюсь тут переписывать ваш код, kak2z, просто я показал как правильно нужно выбирать данные
I'm the law and you can't beat the law

|censored| 'em and their law

Crack down at sundown

maestrosite.ru

Цитата: kak2z от 22 марта 2012, 11:46:58
Все равно не понимаю)
...
для каждого пользователя из массива я выбираю топики из раздела 65.
...
задача выбрать топики созданные пользователями из определенной группы в определенном разделе.

В принципе можно ускорить так... создать заранее массив всех топиков из раздела 65. Создать еще один массив из всех пользователей определенной группы - а затем уже вертеть массивами без дергания базы... это и логично и правильно... Интер это имел ввиду?

За Inter-a говорить не могу, надо у него самого узнать. Думаю, он просто вам "пусть указал" - вынести запрос (статический!) из цикла

Сейчас у вас 1 запрос пользователей + Y запросов тем + Z запросов рейтингов тем (где Y - количество пользователей, Z - количество участвующих пользователей) + цикл по Y пользователям + Y*Z циклов по темам + Y*Z операций сравнения.

Вынося запрос тем из цикла получаем 1 запрос пользователей + 1 запросов тем + 1 запросов рейтингов тем
+ цикл по Y пользователям + 1 цикл по Z темам.

и далее, объединение запросов, условие в запрос и тд
Если задаются вопросы по вашей проблеме, значит это нужно вам!
---
Обновления форума, разрешение конфликтов, адаптация модов, исправление ошибок - ваши предложения о сотрудничестве направляйте по адресу smf@maestrosite.ru

kak2z

#21
Цитата: Inter от 22 марта 2012, 12:01:07
я не собираюсь тут переписывать ваш код, kak2z, просто я показал как правильно нужно выбирать данные
да мне уже дошло)) просто опыта пока мало)) вот я и буквально каждый код воспринимаю)

только что пересмотрел все мои скрипты.. почти везде внутри циклов есть обращения к базе((
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)