View file includes/adm/finance/reklama.php

File size: 10.05Kb
  1. <?php
  2. error_reporting(7);
  3. $month_ = trim($HTTP_POST_VARS['month_'])+0;
  4. $day_ = trim($HTTP_POST_VARS['day_'])+0;
  5. $hour_ = trim($HTTP_POST_VARS['hour_'])+0;
  6. $_month = trim($HTTP_POST_VARS['_month'])+0;
  7. $_day = trim($HTTP_POST_VARS['_day'])+0;
  8. $_hour = trim($HTTP_POST_VARS['_hour'])+0;
  9.  
  10. if (($month_==0)||($_month==0))
  11. {
  12. header("Content-type: text/html");
  13. die('<form action="/?'.$id.'/finance/reklama" method=post>'.
  14. '<b>'.
  15. 'От:&nbsp;'.
  16. '<input type=text name=month_ size=2 maxsize=2 value="'.date('m').'">месяц&nbsp;'.
  17. '<input type=text name=day_ size=2 maxsize=2 value="'.date('d').'">день&nbsp;'.
  18. '<input type=text name=hour_ size=2 maxsize=2 value="0">час&nbsp;'.
  19. '<br/>'.
  20. 'До:&nbsp;'.
  21. '<input type=text name=_month size=2 maxsize=2 value="'.date('m').'">месяц&nbsp;'.
  22. '<input type=text name=_day size=2 maxsize=2 value="'.date('d').'">день&nbsp;'.
  23. '<input type=text name=_hour size=2 maxsize=2 value="'.date('H').'">час&nbsp;'.
  24. '<br/>'.
  25. '<input type=submit value="Показать">'.
  26. '</b>'.
  27. '</form>');
  28. }
  29.  
  30. # Проверка валидности введенных значений
  31. if (($month_>$_month)||($month_<1)||($month_>12)||($_month<1)||($_month>12)) die('Неверно указан месяц!<br/><a href="/?'.$id.'/finance/reklama">Назад</a>');
  32. if ((($month_==$_month)&&($day_>$_day))||($day_<1)||($day_>31)||($_day<1)||($_day>31)) die('Неверно указан день!<br/><a href="/?'.$id.'/finance/reklama">Назад</a>');
  33. if ((($month_==$_month)&&($day_==$_day)&&($hour_>=$_hour))||($hour_<0)||($hour_>24)||($_hour<0)||($_hour>24)) die('Неверно указан час!<br/><a href="/?'.$id.'/finance/reklama">Назад</a>');
  34.  
  35. # Приведенные начало и конец интервала для выборки
  36. $time_=$month_*10000+$day_*100+$hour_;
  37. $_time=$_month*10000+$_day*100+$_hour;
  38.  
  39. # Это хитрый изъеб, для корректной выборки с учетом того, что начало и конец могут быть не с нуля часов
  40. $where_="WHERE (((`month`*10000+`day`*100+`hour`)>='$time_') AND ((`month`*10000+`day`*100+`hour`)<='$_time'))";
  41. $order_="ORDER BY (`month`*10000+`day`*100+`hour`) ASC";
  42.  
  43. # Создаем полотно и задаем начальные цвета
  44. $im=ImageCreate(980,550);
  45. $black=ImageColorAllocate($im, 0,0,0); # Черный, онже фоновый
  46. $white=ImageColorAllocate($im, 255,255,255); # Белый
  47. $gridd=ImageColorAllocate($im, 191,191,191); # Серый (0 часов)
  48. $gridh6=ImageColorAllocate($im, 127,127,127); # Серый (0,6,12,18 часов)
  49. $gridh=ImageColorAllocate($im, 63,63,63); # Серый (0,1,2,..,23 часов)
  50.  
  51. # Вытягиваем по одному экземпляру рефералов присутствющих в интервале времени
  52. $q=@mysql(DBName,"SELECT DISTINCT(`referal`) FROM `referal` $where_ LIMIT 0, 50");
  53. $s=mysql_num_rows($q);
  54. for ($i=0;$i<$s;$i++)
  55. {
  56. $data=@mysql_fetch_array($q);
  57. $bin=substr('000'.decbin($i+1),-3); # Номер реферала в двоичном виде (001,010,011,...)
  58. $names[$i]=str_replace('-','',$data['referal']); # Заполняем массив имен рефералов
  59. # Заполняем массив цветов рефералов (индекс = имя)
  60. $color[$names[$i]]=ImageColorAllocate($im,substr($bin,0,1)*255,substr($bin,1,1)*255,substr($bin,2,1)*255);
  61. # Выводим имя реферала своим цветом
  62. imageString($im, 4, 10, 10+16*$i, $data['referal'], $color[str_replace('-','',$data['referal'])]);
  63. }
  64.  
  65. # Вытягиваем число переходов для каждого часа указанного промежутка времени
  66. $q=@mysql(DBName,"SELECT * FROM `referal` $where_ $order_");
  67. $s=mysql_num_rows($q);
  68. for ($i=0;$i<$s;$i++)
  69. {
  70. $data=@mysql_fetch_array($q);
  71. # Заносим значение в четырехмерный(!) массив :)))
  72. $referal[str_replace('-','',$data['referal'])][$data['month']][$data['day']][$data['hour']]=$data['counter'];
  73. $maxcounter=max($data['counter'],$maxcounter);
  74. }
  75.  
  76. # Определяю горизонтальный масштаб (точек на посещение)
  77. $stepY=500/$maxcounter;
  78.  
  79. # Горизонтальные деления
  80. for ($i=0;$i<=$maxcounter;$i++)
  81. {
  82. if (($i%10)==0) imageline($im,251,510-round($stepY*$i),969,510-round($stepY*$i),$gridh);
  83. if (($i%50)==0) imageline($im,251,510-round($stepY*$i),969,510-round($stepY*$i),$gridh6); # Каждая пятая выделена цветом
  84. if (($i%50)==0) imageString($im, 3, 224, 503-round($stepY*$i), $i, $gridh6); # Каждая пятая подписана
  85. }
  86.  
  87. # Здесь считаю сколько всего часов в интервале (отсчетов по горизонтали)
  88. # По другому никак, так как на каждый час может быть от 0 до N записей...
  89. $all=0;
  90. for ($m=$month_;$m<=$month_;$m++)
  91. {
  92. if ($m==$month_) $d_=$day_; else $d_=1;
  93. if ($m==$_month) $_d=$_day; else $_d=31;
  94. for ($d=$d_;$d<=$_d;$d++)
  95. {
  96. if ($d==$d_) $h_=$hour_; else $h_=0;
  97. if ($d==$_d) $_h=$_hour; else $_h=23;
  98. for ($h=$h_;$h<=$_h;$h++)
  99. {
  100. $all++;
  101. }
  102. }
  103. }
  104.  
  105. # Определяю горизонтальный масштаб (точек на час)
  106. $step=720/$all;
  107. $i=0;
  108.  
  109. # Пробегаем по месяцам интервала
  110. for ($m=$month_;$m<=$_month;$m++)
  111. {
  112. if ($m==$month_) $d_=$day_; else $d_=1;
  113. if ($m==$_month) $_d=$_day; else $_d=31;
  114. # По дням месяца
  115. for ($d=$d_;$d<=$_d;$d++)
  116. {
  117. if (($m==$month_)&&($d==$d_)) $h_=$hour_; else $h_=0;
  118. if (($m==$_month)&&($d==$_d)) $_h=$_hour; else $_h=23;
  119. # По часам дня
  120. for ($h=$h_;$h<=$_h;$h++)
  121. {
  122. # Рисуем линии и подписи в соответствии с масштабом
  123. # Это, блять, самое уебищное место для моего хилого мозга :)))
  124. if ($step>=30)
  125. {
  126. imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh);
  127. if (($h%6)==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh6);
  128. if ($h==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridd);
  129. imageString($im, 3, 251+round($step*$i), 512, $h, $gridh);
  130. if ($h==0) imageString($im, 3, 251+round($step*$i), 523, $d.'.'.substr('0'.$m,-2), $gridd);
  131. }
  132. elseif ($step>=15)
  133. {
  134. imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh);
  135. if (($h%6)==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh6);
  136. if ($h==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridd);
  137. if (($h%2)==0) imageString($im, 3, 251+round($step*$i), 512, $h, $gridh);
  138. if ($h==0) imageString($im, 3, 251+round($step*$i), 523, $d.'.'.substr('0'.$m,-2), $gridd);
  139. }
  140. elseif ($step>=7.5)
  141. {
  142. if (($h%2)==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh);
  143. if (($h%8)==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh6);
  144. if ($h==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridd);
  145. if (($h%4)==0) imageString($im, 3, 251+round($step*$i), 512, $h, $gridh);
  146. if ($h==0) imageString($im, 3, 251+round($step*$i), 523, $d.'.'.substr('0'.$m,-2), $gridd);
  147. }
  148. elseif ($step>=5)
  149. {
  150. if (($h%3)==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh);
  151. if (($h%6)==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh6);
  152. if ($h==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridd);
  153. if (($h%6)==0) imageString($im, 3, 251+round($step*$i), 512, $h, $gridh6);
  154. if ($h==0) imageString($im, 3, 251+round($step*$i), 523, $d.'.'.substr('0'.$m,-2), $gridd);
  155. }
  156. elseif ($step>=3.75)
  157. {
  158. if (($h%4)==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh);
  159. if (($h%8)==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh6);
  160. if ($h==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridd);
  161. if (($h%8)==0) imageString($im, 3, 251+round($step*$i), 512, $h, $gridh6);
  162. if ($h==0) imageString($im, 3, 251+round($step*$i), 523, $d.'.'.substr('0'.$m,-2), $gridd);
  163. }
  164. elseif ($step>=2.5)
  165. {
  166. if (($h%6)==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh);
  167. if (($h%12)==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh6);
  168. if ($h==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridd);
  169. if ($h==0) imageString($im, 3, 251+round($step*$i), 512, $d.'.'.substr('0'.$m,-2), $gridd);
  170. }
  171. elseif ($step>=1.25)
  172. {
  173. if (($h%12)==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh);
  174. if ($h==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh6);
  175. if ((($d%2)==0)&&($h==0)) imageString($im, 3, 251+round($step*$i), 512, $d.'.'.substr('0'.$m,-2), $gridd);
  176. }
  177. else
  178. {
  179. if ($h==0) imageline($im,250+round($step*$i),11,250+round($step*$i),509,$gridh6);
  180. if ((($d%4)==0)&&($h==0)) imageString($im, 3, 251+round($step*$i), 512, $d.'.'.substr('0'.$m,-2), $gridd);
  181. }
  182.  
  183. # Вычисляем X-координату для текущего отсчета
  184. $nX=250+round($step*($i+0.5));
  185. # Если нулевой отсчет, то несуществующей X-координате предыдущего отсчета присваеваем значения текущей.
  186. if ($i==0) $pX=$nX;
  187.  
  188. # Пробегаем по рефералам
  189. for ($r=0;$r<sizeof($names);$r++)
  190. {
  191. $name=$names[$r];
  192. # Вычисляем Y-координату для данного реферала для текущего отсчета
  193. $nY[$name]=510-round($stepY*$referal[$name][$m][$d][$h]);
  194. # Если нулевой отсчет, то несуществующей Y-координате предыдущего отсчета присваеваем значения текущей.
  195. if ($i==0) $pY[$name]=$nY[$name];
  196.  
  197. # Соединяем текущую точку с предыдущей
  198. imageline($im,$pX,$pY[$name],$nX,$nY[$name],$color[$name]);
  199. # Укрупняем точку, если позволяет масштаб
  200. if ($step>=15)
  201. {
  202. imageline($im,$nX-1,$nY[$name]-1,$nX-1,$nY[$name]+1,$color[$name]);
  203. imageline($im,$nX-1,$nY[$name]+1,$nX+1,$nY[$name]+1,$color[$name]);
  204. imageline($im,$nX+1,$nY[$name]+1,$nX+1,$nY[$name]-1,$color[$name]);
  205. imageline($im,$nX+1,$nY[$name]-1,$nX-1,$nY[$name]-1,$color[$name]);
  206. }
  207. # Делаем текущую Y-координату "предыдущей" для следующего отсчета
  208. $pY[$name]=$nY[$name];
  209. }
  210. # Делаем текущую X-координату "предыдущей" для следующего отсчета
  211. $pX=$nX;
  212. # Увеличиваем счетчик отсчетов
  213. $i++;
  214. }
  215. }
  216. }
  217.  
  218. # Рисуем бордюр
  219. imagerectangle($im,248,8,972,512,$white);
  220. imagerectangle($im,249,9,971,511,$black);
  221. imagerectangle($im,250,10,970,510,$white);
  222.  
  223. imageString($im, 3, 10, 512, date('j.m H:i'), $gridd);
  224.  
  225. # ВСЕ! Пиздец!
  226. header("Content-type: image/png");
  227. imagepng($im);
  228. exit;
  229. ?>