Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: расчет времени проведенного онлайн [2]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): « 1 [2]   

> Описание: mysql php
wmaster
Отправлено: 07 Декабря, 2011 - 00:21:50
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Дек. 2011  


Помог: 0 раз(а)




tuareg пишет:

Тогда индексы вообще не нужны.
P.S Меня мучает такой вопрос уже 2 дня мучает Улыбка А как Вы график строить будете???
Ось ox-->время, а oy-->???


примерно так


За наводку спасибо, попробую, но не сегодня )

(Отредактировано автором: 08 Декабря, 2011 - 00:55:08)

 
 Top
wmaster
Отправлено: 08 Декабря, 2011 - 00:51:51
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Дек. 2011  


Помог: 0 раз(а)




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

В базе теперь всего две таблицы:

Спойлер (Отобразить)

Спойлер (Отобразить)


Если пользователь в сети, то делаем так:

CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO `users_temp` (date, user) VALUES (FROM_UNIXTIME($v), $uid);


Если пользователь оффлайн, то ничего не пишем. Раз в сутки (допустим, можно и раз в час), делаем перенос данных (цикл на PHP) из временной таблицы в итоговую:

CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO `users` (user, date, duration) SELECT `user`, DATE_FORMAT(`date`,'%Y-%m-%d %H') AS hours, COUNT(*) * 5 AS duration FROM `users_temp` WHERE `date` BETWEEN '$start' AND '$end' AND `user` = '$uid' GROUP BY `hours`;
  2.  
  3. DELETE LOW_PRIORITY FROM `users_temp` WHERE `date` BETWEEN '$start' AND '$end' AND `user` = '$uid';


Тут вроде как разобрался и все работает. Но, теперь мне надо из таблицы `users` выбрать значения, чтобы положить их на график, что-то типа:

hour, duration
00, 5
01, 0
02, 0
..
22,35
23,40

Вроде бы такой запрос и никаких проблем:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT DATE_FORMAT(date,'%H') AS hours, duration FROM `users` WHERE `date` BETWEEN '$start' AND '$end' AND `user` = '$uid' ORDER BY `hours`


Но у меня на выходе массив только с онлайнами, не могу сообразить как добавить или правильно обработать недостающие офланы. Шкала на графике от 00 до 23 часов, а выборку делаю, допустим всего 10 значений и в первой строке может быть значение на 14:00, а мне надо чтобы до 14:00 были Нулевые значения на графике. В общем, я тут запутался Недовольство, огорчение


Хотелось бы такой график видеть (красные строки, это те, которые я не могу "добавить" правильно.)

(Отредактировано автором: 08 Декабря, 2011 - 00:54:12)

 
 Top
tuareg
Отправлено: 08 Декабря, 2011 - 11:35:39
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




Понятно. Итак если Вы делаете до какого-то часа то
А тут проще будет уже обрабатывать уже через PHP(любой другой язык).
Вот так вот примерно на php
PHP:
скопировать код в буфер обмена
  1.  
  2. $arrUsers=$array();
  3. while($result=mysql_fetch_array($query)){
  4.  $arrUsers[$result['hours']]=$result['duration'];/*сформировали новый массив время==>колич*/
  5. }
  6. $arrTime=$array(0,1,2);/*В этот массив записываем все интервалы*/
  7. /*$arrTime=$array('00:00','01:00'); может быть так*/
  8. for($i=0;$i<$arrTime;$i++){
  9.   if (array_key_exists($arrTime['i'],$arrUsers)){
  10.     echo $arrTime['i'].'--->>'.$arrUsers[$arrTime['i']].'</br>';
  11.   }
  12.   else{
  13.     echo $arrTime['i'].'--->>0</br>';
  14.   }
  15. }
  16.  

Логика следующая:
Сначала выдернул все из БД и сформировал массив, где ключ->время, значение-> количество $arrUsers
Сформировал массив из всех временных участков $arrTime
Начинаю перебор $arrTime
При переборе проверяю есть ли такой ключ в массиве $arrUsers
строчка if (array_key_exists($arrTime['i'],$arrUsers)){
если есть то вывожу время и количество
нет вывожу время и 0
 
 Top
wmaster
Отправлено: 08 Декабря, 2011 - 14:12:52
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Дек. 2011  


Помог: 0 раз(а)




Спасибо! А то я пол ночи просидел с array_key_exists, вроде бы нащупал решение, но не до конца.

Получился такой код:
PHP:
скопировать код в буфер обмена
  1.         if($result = $mysqli->query($q2))
  2.                 {
  3.                         $data = array();
  4.                         $i = 0;
  5.                         while($row = $result->fetch_assoc()){
  6.                                  $arrUsers[$row['hours']] = $row['duration'];
  7.                         $i++;
  8.                         }
  9.  
  10.                         $arrTime=array('00','01','02','03','04','05','06','07','08','09',10,11,12,13,14,15,16,17,18,19,20,21,22,23);
  11.                         /*В этот массив записываем все интервалы*/
  12.                         /*$arrTime=array('00:00','01:00'); может быть так*/
  13.                         for($i=0; $i < count($arrTime); $i++){
  14.  
  15.                                 if (array_key_exists($arrTime[$i], $arrUsers)){
  16.  
  17.                                         $arrRes[$i] = $arrUsers[$arrTime[$i]];
  18.                         } else {
  19.  
  20.                                         $arrRes[$i] = 0;
  21.                         }
  22.                         }
  23.  
  24.                 }

На выходе получаем человеческий массив, от 0 до 23 со значениями `duration` в минутах.
 
 Top
tuareg
Отправлено: 08 Декабря, 2011 - 15:30:44
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




Тут я еще немного подумал,
Смотрите
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT DATE_FORMAT(date,'%H') AS hours, duration FROM `users`
  3. WHERE `date` BETWEEN '$start' AND '$end'
  4. AND `user` = '$uid'
  5. ORDER BY `hours`/*Order by вообще не нужен,т.к мы все равно потом все пишем в массив*/
  6.  

Т.е мы избавимся от лишнего ORDER by(а это не самый сильный конек MySQL Улыбка)
(Добавление)
Да с моим ответом с array_key_exists так косяк , что нет count.
Кстати обычно рекомендуют выносить из цикла for подсчет количества, т.е вместо
PHP:
скопировать код в буфер обмена
  1.  
  2. for($i=0;$i<count($arr);$i++)
  3.  

писать
PHP:
скопировать код в буфер обмена
  1.  
  2. $count=count($arr);
  3. for($i=0;$i<$count;$i++)
  4.  

Это связано с тем что при каждом проходе цикла в первом варианте будет высчитываться count($arr)
 
 Top
wmaster
Отправлено: 08 Декабря, 2011 - 17:03:52
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Дек. 2011  


Помог: 0 раз(а)




Про ORDER BY спасибо, уберу. Это я его при тестировании прилепил, смотрел на результаты выдачи. И про for, тоже буду иметь ввиду.

Теперь появился геморрой с Highstock, но это уже другая тема Улыбка
 
 Top
tuareg
Отправлено: 08 Декабря, 2011 - 17:08:56
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




А в чем там проблема? Я не разбирался в нем но там же просто jQuery? Вы напишите что не получается? решим проблему
P.S я понимаю, что наверное это будет не совсем корректно, но все же есть форум http://www[dot]linkexchanger[dot]su/forum/ Там можно решить все эти проблемы.

(Отредактировано автором: 08 Декабря, 2011 - 17:14:05)

 
 Top
wmaster
Отправлено: 08 Декабря, 2011 - 17:53:19
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Дек. 2011  


Помог: 0 раз(а)




Да на сайте у них даже доки по API есть, но они на английском, у меня с ним проблемы. Очень много различных параметров. Примеры есть, но в них не до конца понятно, как можно изменить график на свой лад. Тема для меня совсем новая. Что java, JQuery.
 
 Top
Страниц (2): « 1 [2]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB