За последние 24 часа нас посетили 38397 программистов и 1283 робота. Сейчас ищут 1027 программистов ...

Сбор статистики

Тема в разделе "PHP для новичков", создана пользователем Freakmeister, 23 июл 2010.

  1. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Задумал очень трудоёмкий и новый для себя проект - статистику. Вопрос в том, куда лучше собирать данные по этой статистике?
    Задумано примерно следующее: http://stat.hl2.com.ua/
    Тоесть, будет таблица со списком имён и какими-то графами, которая будет храниться в виде таблицы в БД и будет обновляться раз в неделю вручную через админку. Если кликнуть по какому-нибудь имени в таблице, то можно будет просмотреть лог его статистики за всё время. Вот тут и загвоздка - куда все эти логи по всем людям писать? Если в БД, то получается, что нужно делать отдельную таблицу для каждого человека. Как тогда добавлять нового человека через форму на сайте? Возможно ли создать новую таблицу в БД посредством PHP?

    Если писать статистику в файлы, то встаёт вопрос вытаскивания и обработки этой инфы в виде сплошного, бесформенного текста - тут я полный ноль. Никогда не работал с файлами, не знаю как их писать и читать.
    В общем, что посоветуете? =\
     
  2. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    еще один. Психостат бесплатно распространяемый скрипт. Нах писат то что уже есть? тем более если для тебя запись/чтение файлов проблема.
     
  3. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Психостат это просто как пример. Мне не психостат нужен, а совсем другое. Тут вроде форум по PHP, а не по кс. Я задал конкретные вопросы:
    Возможно ли создать новую таблицу в БД посредством PHP?
    Стоит ли это делать, или лучше реализовать запись в файлы?
     
  4. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    А что другое? Если ты хочешь написать то, чего еще никто не делал, то надо бы хотя бы пхп нормально знать и как подойти к такой задачи.

    Лог чего именно? Статистики чего именно? Вход-выход на сервер, количество фрагов, коефициент попадания, коеф. попадания в опр. часть тела, рейтинг, и пр..
     
  5. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Если для вас настолько напряжно помочь новичку, то зачем тогда вообще заходить в раздел "Программирование на PHP для новичков" и советовать готовые решения, упрекая незнанием языка?

    Абсолютно не важно что я собираюсь собирать. Есть главная таблица со списком имён - это таблица в бд №1. И есть ещё куча таблиц по каждому человеку отдельно - это либо таблицы в бд, либо файлы. Это всё что нужно знать.
     
  6. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    проектирование бд и нормальные формы вам надо почитать
     
  7. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
  8. `p r o x y

    `p r o x y Активный пользователь

    С нами с:
    21 июл 2010
    Сообщения:
    32
    Симпатии:
    0
    Апельсин
    Конечно да.

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

    Это уже другой вопрос. Думаю будет удобно создать функцию (или доп.метод) для записи статистики в БД. Примерно:
    Код (Text):
    1.  
    2. function ( $stat_type, $stat_value ) {
    3.    # код записи статистики в БД
    4. }
    И далее просто поставлять в нужные участи кода эту функцию с нужными параметрами.
     
  9. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    `p r o x y, да, наверно читать из одной таблицы приаттачив WHERE name= будет проще, спасибо. Единственное но - статистика будет интегрирована с уже готовым модулем сайта, который будет автоматически добавлять новые записи только с именем, проставляя во во всех доп.данных "--". Поэтому корневую таблицу мне всё-же наверно придётся делать второй таблицей в бд... это надо со стороны админки обдумать.) Всё же, с технической стороны, как реализовать отсев по последней дате? К примеру, я хочу, чтобы главная таблица у меня выглядела так:

    Имя - Кол-во выполненных отчётов - Последняя дата обновления статистики
    Борис - 46 (+6 с прошлой недели) - 24.07.10

    Тоесть, вытаскиваются все имена, а потом по каждому имени проходит цикл, внутри которого ищется последняя дата? Что-то пока не могу представить себе это в виде кода. =\
     
  10. runner

    runner Активный пользователь

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    -приведу пример для таблицы логов со структурой:
    log_user-код пользователя
    log_date-дата добавления статистики
    log_stattype-тип или вид статистики(вход в систему, добавление отчетов etc.)


    Тогда чтобы получить статистику по всем видам выполняем запрос
    select log_user,log_stattype,log_max(log_date) as lastdate ,count(*) as nwork from log group by log_user,log_stattype order by log_user;
    Получим набор записей, где

    lastdate-последняя дата обновления статистики по определенному типу для определенного пользователя,
    nwork-количество записей для определенного вида статистик и для определенного пользователя,
    Если хочешь получить по определенному виду статистики, запрос :
    select log_user,log_max(log_date) as lastdate ,count(*) as nwork from log where log_stattype='код требуемого вида статистики' group by log_user order by log_user;
     
  11. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Я ни слова не понял, если честно.)) Приведу более конкретный пример, надеюсь получить более конкретный ответ. Собссна, таблица выглядит так: http://red-squadron.ru/index.php?ind=stats
    Код корневой таблицы, не углубляясь в подробности:
    PHP:
    1. $output = "
    2. <tr>
    3. <td>
    4. <table width='100%' border='1' cellpadding='0' cellspacing='0'>
    5.  <tr>
    6.    <td align='center' bgcolor='#E9E9E9'>Score</td>
    7.    <td align='center' bgcolor='#E9E9E9'>Имя</td>
    8.    <td align='center' bgcolor='#E9E9E9'>R</td>
    9.    <td align='center' bgcolor='#E9E9E9'>Убийств</td>
    10.    <td align='center' bgcolor='#E9E9E9'>Онлайн</td>
    11.    <td align='center' bgcolor='#E9E9E9'>Updated</td>
    12.  </tr>
    13. ";
    14.         [b]$DB->query( "SELECT * FROM mkp_stats ORDER BY date");[/b]
    15.         while( $row = $DB->fetch_row($query) ) {
    16.                 $id = $row['id'];
    17.                 $ide = $row['ide'];
    18.                 $name = $row['name'];
    19.                 $r = $row['r'];
    20.                 $kills = $row['kills'];
    21.                 $online = $row['online'];
    22.                 $date = $row['date'];
    23.                 $score=$r+$kills;
    24. $output .= "
    25.  <tr>
    26.    <td>$score</td>
    27.    <td><a href='index.php?ind=stats&ide=$ide'>$name</a></td>
    28.    <td>$r</td>
    29.    <td>$kills</td>
    30.    <td>$online</td>
    31.    <td>$date</td>
    32.  </tr>
    33. ";
    34.         }
    35. $output .= "
    36.  </tr>
    37. </table>
    38. </td>
    39. </tr>";
    Dr. Manhattan тут имеет 3 записи. Как сделать, чтобы выдавалась только последняя по дате?
     
  12. `p r o x y

    `p r o x y Активный пользователь

    С нами с:
    21 июл 2010
    Сообщения:
    32
    Симпатии:
    0
    Freakmeister
    LIMIT 1
    [sql]"SELECT * FROM mkp_stats ORDER BY date LIMIT 1"[/sql]
    Документация

    Если есть возможность подправить модуль и использовать 1 таблицу вместо 2ух, имхо, будет меньше путаницы ....хм...хотя не факт )

    А зря, runner дело говорит, советую разобраться.[/quote]
     
  13. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Я и так и использую одну таблицу.)

    LIMIT 1 тут не прокатит, ибо придётся всё делать по-другому:
    1. Сначала посчитать количество уникальных идентификаторов для каждого имени (ide).
    2. Потом вывести эти идентификаторы куда-нибудь, в массив наверно. =\
    3. Циклом для каждого ide сделать запрос "SELECT * FROM mkp_stats WHERE ide=$ide ORDER BY date LIMIT 1"

    Но я надеюсь, что есть способ попроще. =\
     
  14. `p r o x y

    `p r o x y Активный пользователь

    С нами с:
    21 июл 2010
    Сообщения:
    32
    Симпатии:
    0
    Freakmeister
    Как помню, из задачи, статистика обновляется раз в неделю. Соответсвенно, на каждую дату обновления для каждого пользователя в таблице будет статистика. Примерно так:

    Код (Text):
    1.  
    2. ---------------------------------------------------------
    3. | user_name | stat_info1 |             date             |
    4. ---------------------------------------------------------
    5. | User1         |     20       | 2010-07-01 00:00:00 |
    6. | User2         |     25       | 2010-07-01 00:00:00 |
    7. | User1         |     45       | 2010-07-08 00:00:00 |
    8. | User2         |     25       | 2010-07-08 00:00:00 |
    9. | User1         |     78       | 2010-07-15 00:00:00 |
    10. | User2         |     100     | 2010-07-15 00:00:00 |
    11. ---------------------------------------------------------
    В этом случае, выборка по дате с LIMIT 1, будет работать правильно.
    Конечно, вместо user_name лучше использовать user_id (если есть таблица пользователей).
     
  15. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    В таком виде работает:
    PHP:
    1. $DB->query( "SELECT *, ($form_score) AS score FROM mkp_stats s1 WHERE NOT EXISTS
    2. (SELECT * FROM mkp_stats s2 WHERE s1.ide = s2.ide AND s1.date < s2.date) ORDER BY $order");
    У меня тут появилась более сумасшедшая идея. Пока не могу придумать как её реализовать, и вообще не уверен, что это можно сделать через SELECT одним запросом. Буду признателен за совет или идею.
    Собственно, в таблице есть графа kills, я хочу чтобы в ней писалось не только кол-во убийств, а в скобках ещё сколько игрок наверстал с прошлого обновления статистики. Например, в таком виде: Убийства: 141234 (+117).
    По идеи, тут надо вытаскивать последнюю запись, потом предпоследнюю запись и вычитать из последней предпоследнюю. Пока не могу даже себе представить как вытащить предпоследнюю запись... внутри цикла while( $row = $DB->fetch_row($query) ) { делать ещё одно обращение к бд нельзя?