Автор Тема: Вопрос начинающего - статистика сайта :)  (Прочитано 8109 раз)

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

Оффлайн reLax[0x00]

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 68
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.microcat.ru
У меня тоже вопрос появился один. Код ужасно не оптимизирован и содержит кучу логических ошибок сразу говорю-я просто пишу сначало то что думаю а потом оптимизирую-подход неправильный, согласен. Вообще я новичек в PHP - C++ для меня роднее как то:) Особо им не занимаюсь - мое дело вообще сервера содержать в работоспособности но все таки :)
 Вопрос один-я гдето в статистике поставил заплатку в файле gisto.php а где не помню :( теперь если у меня процентное соотношение < 1% динамически генерируемый PNG график расползается :( вспомнить нереально практически - может вы увидете...

vvv.php

<? // Оптимизируем буффер вывода HTML кода-удаляем все пробелы лишние, переносы и тд
function optimize ($content) {
     
$content preg_replace("%(\\s+)?(\\<.+\\>)(\\s+)?%""$2",  $content);     
     
$content preg_replace("/[\\r\\n]+[\\s\\t]*[\\r\\n]+/"""$content);
     
$content preg_replace("/[\\s\\t]*[\\r\\n]+/"""$content); 
     
$content preg_replace("%[\\x20]{2,}%"," "$content);
     
$comment "<!-- HTML optimization - optimizer for output buffering is turned ON -->\\n\\n";
     
$content $comment.$content.= "\\n\\n<!-- HTML optimization -  output buffering transaction completed -->\\n\\n";    
     return 
$content;
}
//это понятно-запуск функции оптимизации
ob_start(\'optimize\');
//это больше HTML - переменную $html вставляем в оболочку HTML чтобы не повторять HTML код
function table ($html) {
$return = <<<__EAX__
<tr><td valign="middle" align="center" style="border-top: #6699CC 1px solid;">
<table width="100%" border="0" cellpadding="0" cellspacing="0">
	
<tr>
	
	
<td>
	
	
	
<img src="images/Untitled-1_01.gif" width="23" height="21" alt=""></td>
	
	
<td background="images/Untitled-1_02.gif" height="21">
	
	
	
</td>
	
	
<td>
	
	
	
<img src="images/Untitled-1_03.gif" width="26" height="21" alt=""></td>
	
</tr>
	
<tr>
	
	
<td background="images/Untitled-1_04.gif" width="23">
	
	
	
</td>
	
	
<td valign="middle" align="center">
	
	
	
$html 
    
    </td>
	
	
<td background="images/Untitled-1_06.gif" width="26">
	
	
	
</td>
	
</tr>
	
<tr>
	
	
<td>
	
	
	
<img src="images/Untitled-1_07.gif" width="23" height="24" alt=""></td>
	
	
<td background="images/Untitled-1_08.gif" height="24">
	
	
	
</td>
	
	
<td>
	
	
	
<img src="images/Untitled-1_09.gif" width="26" height="24" alt=""></td>
	
</tr>
</table>
</tr></td>
__EAX__;
return $return;
}
?>
<link rel="stylesheet" type="text/css" href="http://<?=$_SERVER[\'HTTP_HOST\']?>/velko.css">
<title>VELKO.| СТАТИСТИКА ДОМЕНА |</title>
<table align="left" border="0" cellpadding="0" cellspacing="0" width="100%">
<?
//назначаем константы соединения и кол-ва линий per-page на странице
  define (\'SERVER\',\'localhost\');
  define (\'USER\',\'xxx\');
  define (\'PWD\',\'xxx\');
  define (\'DB\',\'xxx\');
  define (\'DUMP\', \'dump\');
  define (\'LINES\', 30);
//массив из поисковиков и их кодировок
  $array_encoding = array (
                                  "mail"=>"Windows-1251",
                                  "yandex"=>"Windows-1251",
                                  "msn"=>"UTF-8",
                                  "google"=>"UTF-8",
                                  "altavista"=>"UTF-8",
                                  "yahoo"=>"UTF-8",
                                  "yandexpages"=>"KOI8-R",
                                  "aport"=>"Windows-1251",
                                  "rambler"=>"Windows-1251"                                                          
                           );

//то что из отчОта нужно убрать
  $forbidden_sites = array (
                                  "mashka-devochka2005.narod.ru",
                                  "masha-2005-ru.narod.ru",
 
	
                              "svetlanochka-2005.narod.ru",
 
	
                              "olechka-devochka.narod.ru",
                                  "quasimodo.net.ua",
                                  "sh-tanya2005.narod.ru",
                                  "velko.ru"
                           );
//убираем локалхост
  $forbidden_queries = array (
                                  "velko.ru"

                             );
//делаем строки типа char для RegEx вырезания из массивов
  foreach ($forbidden_queries as $key=>$value) {
  $forgetit.= preg_quote ($value)."|"; }
  $forgetit = preg_replace (\'%\\|$%\',\'\',$forgetit); 
  foreach ($forbidden_sites as $key=>$value) {
  $forgetme.= preg_quote ($value)."|"; }
  $forgetme = preg_replace (\'%\\|$%\',\'\',$forgetme); 
//конеектимся к SQL
  mysql_pconnect (SERVER,USER,PWD) or die ("MySQL server error: can\'t login.");
  mysql_select_db (DB);
//добавляем в БД юзера если он в первые зашел на страницу статистики не посетив сайт ..интервал 3600 сек - 1 час
$unix_date = mktime();
$check = "SELECT ip FROM ".DUMP." WHERE date > ".($unix_date - 3600)." AND ip = \'".$_SERVER[\'REMOTE_ADDR\']."\'";
$domen = preg_replace ("%(ftp|https?://)([w]{3}\\.)?([-\\w.]+)(/)?(.*)?%i",\'$3\', $_SERVER[\'HTTP_REFERER\']);
$ins_user = "INSERT INTO ".DUMP." (ip, date, browser, referer, page, domen) VALUES (\'".$_SERVER[\'REMOTE_ADDR\']."\', \'".$unix_date."\', \'".stripslashes ($_SERVER[\'HTTP_USER_AGENT\'])."\', \'".stripslashes ($_SERVER[\'HTTP_REFERER\'])."\', \'".stripslashes ($_SERVER[\'REQUEST_URI\'])."\', \'".$domen."\')";
$check_info = mysql_query ($check);
(mysql_num_rows($check_info) == NULL)?mysql_query($ins_user):0;
//генерим RegEx запросы для MySQL
  foreach ($array_encoding as $key=>$value) {
  $junky.= "referer LIKE \'%".$key."%\' OR ";
  $notjunky.= "referer NOT REGEXP \'".$key."\' AND ";
  $robots.= "browser LIKE \'%".$key."%\' OR ";

//режем последние ненужные штуки типа OR или AND - для MySQL
  $junky = preg_replace (\'%(\\x20OR\\x20)$%\',\'\',$junky);
  $notjunky = preg_replace (\'%(\\x20AND\\x20)$%\',\'\',$notjunky);
  $robots = preg_replace (\'%(\\x20OR\\x20)$%\',\'\',$robots);
//назначаем запросы к MySQL
  $query = "SELECT ip, referer, page, FROM_UNIXTIME(date, \'%d-%m-%y %H:%i:%s\') as date FROM `".DUMP."` WHERE ".$junky." ORDER BY `id` DESC";
  $query_1 = "SELECT DISTINCT count(*) as cnt, ip, referer, page, FROM_UNIXTIME(date, \'%d-%m-%y %H:%i:%s\') as date FROM `".DUMP."` WHERE ".$notjunky." GROUP BY referer ORDER BY date DESC";
  $query_3 = "SELECT * FROM ".DUMP." WHERE ".$robots." AND FROM_UNIXTIME(date, \'%d-%m-%y %H:%i:%s\') BETWEEN \'".date(\'d-m-y\')." 00:00:00\' AND \'".date(\'d-m-y\')." 23:59:59\' ORDER BY `id` DESC";
  $query_4 = "SELECT COUNT(DISTINCT referer) FROM ".DUMP." WHERE referer LIKE \'%".$key."%\' GROUP BY referer";
//начинаем юзать мускуль - далее код разбивает количество записей в SQL DESC на страницы
$sql = mysql_query ($query); 
   $sql_num = mysql_num_rows($sql);
   $_GET[\'uid\'] = eregi_replace (\'[^0-9]\',\'\',$_GET[\'uid\']);
   if (!isset($_GET[\'uid\'])){
   $_GET[\'uid\'] = 1;
   }else{
 $count_pages = ceil($sql_num / LINES);
 $regex = strlen ($sql_num);
 if (eregi(\'[^0-9]{$regex}\',$_GET[\'uid\'])||$_GET[\'uid\']>$count_pages||$_GET[\'uid\']==0) $_GET[\'uid\'] = 1;
 $page_for_query = $_GET[\'uid\']-1;
 $lpos = $page_for_query * LINES;
 $query.= " LIMIT ".$lpos.", ".LINES."";
 $result_c = mysql_query($query);
//выводим html STDOUT
$html = "<div style=\\"width:700px;padding-bottom:10px;\\">";
$html.= "<img src=\\"/image?image=".urlencode ("СТАТИСТИКА ЗАПРОСОВ С ВЕДУЩИХ ПОИСКОВЫХ СИСТЕМ ДОМЕНА VELKO.RU")."&color=0xFF0000&width=500\\">
";
foreach ($array_encoding as $key=>$value) {
$html.= "<img src=\\"images/bot_".$key.".gif\\">";}
$html.= "
<font class=\\"remark\\">Всего зарегистрировано запросов с поисковых систем: ".$sql_num."</font>

";
//еще пока разбиваем - все в процессе
if ($count_pages>1) {
for ($i=1; $i<=$count_pages; $i++) {
  if($_GET[\'uid\']==$i&&$i!=1) {
     $html.= " [".$i."] ";}
  elseif ($_GET[\'uid\']==$i&&$i==1) {$html.= " [1] ";}
  elseif($i==1&&$_GET[\'uid\']!=$i) {
     $html.= "<a href=\'?uid=".$i."\'> ".$i." </a>";}
  elseif($i!=1&&$_GET[\'uid\']!=$i) {
     $html.= "&nbsp<a href=\'?uid=".$i."\'>".$i." </a>";
  }}}
}
//все, конец разбивки на страницы
 $html.= "</div>";
echo table ($html);
//теперь работаем с данными в зависимости от того на какой странице мы находимся..парсим $_SERVER[\'HTTP_REFERER\'] из БД - получится всего 30 исходя из константы LINES..пытаемся найти поисковые системы в этой переменной окружения  
while ($row = mysql_fetch_object ($result_c)) {  
  $decoded = urldecode ($row->referer);
  if (!preg_match (\'%(\'.$forgetit.\')%i\', $decoded)):           
  if (preg_match (\'%mail%\', $decoded)) { $start = "q="; $name = "mail"; }
  if (preg_match (\'%yandex%\', $decoded)&&!preg_match (\'%yandpage%\', $decoded)) { $start = "text="; $name = "yandex"; }
  if (preg_match (\'%msn%\', $decoded)) { $start = "q="; $name = "msn"; }
  if (preg_match (\'%google%\', $decoded)) { $start = "q="; $name = "google"; }
  if (preg_match (\'%altavista%\', $decoded)) { $start = "q="; $name = "altavista"; }
  if (preg_match (\'%yahoo%\', $decoded)) { $start = "p="; $name = "yahoo"; }
  if (preg_match (\'%yandpage%\', $decoded)) { $start = "text="; $name = "yandexpages"; }
  if (preg_match (\'%rambler%\', $decoded)) { $start = "words="; $name = "rambler"; }
  if (preg_match (\'%aport%\', $decoded)) { $start = "r="; $name = "aport"; }
      //убираем с конца & даже если его и нету - получаем переменную массива
      preg_match ("%".$start."([^&]*)%", urldecode($decoded)."&", $result);
 //дата из SQL как видите из щапроса имеет вид 11-11-11 01:01:01 поэтому строку разбиваем на массив и забираем оттуда вторую половину                             
      if (!empty ($result[1])) {
$today = explode (\' \', $row->date);
//проверяем если встречается строка из массива $array_encoding с поисковиками в HTTP_REFERER - то выводим в STDOUT 
foreach ($array_encoding as $key=>$value) {
echo ($name == $key)?"<tr><td valign=\\"middle\\" style=\\"padding-left:90px;\\"><img src=\\"images/bot_".$name.".gif\\" border=\\"0\\"><img src=\\"images/arrow.jpg\\" border=\\"0\\"> [".((date(\'d-m-y\')==$today[0])?"<font class=\\"red\\">":"<font class=\\"remark\\">").$today[0]."</font> <font class=\\"remark\\">".$today[1]."</font>] пользователь [<font class=\\"remark\\">".preg_replace (\'%^([0-9]+)\\.([0-9]+)\\.([0-9]+)\\.([0-9]+)$%\',\'$1.$2.*.*\', $row->ip)."</font>] искал [<a href=\\"".iconv ($value, \'Windows-1251\',$row->referer)."\\" target=\\"_blank\\">".iconv ($value, "Windows-1251", $result[1])."</a>], а попал [<a href=\\"".$row->page."\\" target=\\"_blank\\">сюда</a>]</td></tr>":NULL;
                 }                    
        }     endif;       
}
echo "<tr><td> </td></tr>";
//нетрудная в принципе процедура как на первый взгляд кажется - выдираем доменное имя их HTTP_REFERER и заносим в 2(!) массива-так надо, долго объяснять зачем это надо..потом делаем в массиве все значения уникальными 
$result_o = mysql_query ($query_1);
$sql_other = mysql_num_rows ($result_o);

while ($other = mysql_fetch_object($result_o)) {
if (!empty ($other->referer)) {
$oth = preg_replace ("%(ftp|https?://)([w]{3}\\.)?([-\\w.]+)(/)?(.*)?%i",\'$3\', $other->referer);
if (!preg_match (\'%(\'.$forgetme.\')%\', $oth)) {
$count_hosts[] = $other->cnt;
$array_other[] = $other->cnt."|".$oth."|".$other->referer; } }}
foreach ($array_other as $key=>$value) {
$value = preg_replace ("%(ftp|https?://)([w]{3})?([-\\w.]+)(/)?%i",\'$1$3\', $value);
$array_other_unique[] = $value; }
$array_other_unique = array_unique ($array_other_unique);
//здесь что то я делал с доменным именем - щас не помню - для следующего SQL запроса понадобится
foreach ($array_encoding as $key=>$value) {
//$new_array = explode ("|", $value);
$junk.= "domen NOT REGEXP \'".$key."\' AND ";
 }
$junk = preg_replace (\'%(\\x20AND\\x20)$%\',\'\',$junk);
//для этих 2-х запросов к SQL
$query_5 = "SELECT COUNT(*) as cnt, domen FROM ".DUMP." WHERE ".$junk." AND domen is NOT NULL GROUP BY domen ORDER BY cnt DESC";
$query = mysql_query ($query_5);
//создаем 2 массива - они нам понадобятся чтобы вычислять юзеров по уникальным хостам - второй для вычисления что за хост и посетил он его именно сегодня
while ($sit = mysql_fetch_object($query)) {
if (!empty ($sit->domen)) {
$domain[] = $sit->cnt."|".$sit->domen; }}
$query_6 = "SELECT FROM_UNIXTIME(date, \'%d-%m-%y %H:%i:%s\') as date, domen FROM ".DUMP." WHERE ".$junk." AND FROM_UNIXTIME(date, \'%d-%m-%y %H:%i:%s\') BETWEEN \'".date(\'d-m-y\')." 00:00:00\' AND \'".date(\'d-m-y\')." 23:59:59\' ORDER BY `date` DESC";
  $query = mysql_query ($query_6);
$time = array();
while ($zit = mysql_fetch_object($query)) {
if (!empty ($zit->domen)) {
$time[] = $zit->domen; }}
//html
$html = "<div style=\\"width:600px;\\" align=\\"center\\">";
$html.= "<img src=\\"/image?image=".urlencode ("СТАТИСТИКА ПОСЕЩЕНИЙ С ДРУГИХ САЙТОВ ДОМЕНА VELKO.RU")."&color=0xFF0000&width=400\\">
";
$html.= "<font class=\\"remark\\">Выводятся уникальные хосты, с которых посетили velko.ru. Общее количество посещений: ".array_sum($count_hosts)."</font></div>";
echo table ($html);
echo "<tr><td align=\\"center\\"><img src=\\"/image?image=".urlencode ("УНИКАЛЬНЫЕ ХОСТЫ С КОТОРЫХ ПОСЕТИЛИ ДОМЕН VELKO.RU")."&color=0xFF0000&width=400\\">
".array_in_table ($domain,$forgetme, 4)."</td></tr>";
//интересная функция - делит автоматом таблицу на части переданные ей 3-им параметром - каждую строку я тут объяснять не буду-форума не хватит :))
function array_in_table ($array, $forget, $size) {
global $time;
$table_width = 90;
$width = intval ($table_width/$size);
$tr = "<tr align=\\"center\\">";
$td = "<td width=\\"$width%%\\" align=\\"left\\"><a href=\\"%s\\" target=\\"_blank\\" alt=\\"%s\\">%s</a>%s</td>\\n";
$grid = "<table width=\\"$table_width%\\" align=\\"center\\">$tr\\n";
$i = 0;
foreach ($array as $e) {
if (!preg_match (\'%(\'.$forget.\')%\', $e)) {
$new = explode ("|", $e);
 unset ($showtoday);
 if (in_array($new[1], $time)): 
   $showtoday = "[<font class=\\"red\\">сегодня</font>]";
endif; 
$root = ($today[0] == date (\'d-m-y\'))?"[<font class=\\"red\\">сегодня</font>]":NULL;
$new[1] = (isset ($new[1]))?"http://".$new[1]:NULL;
$grid.= sprintf ($td, $new[1],$new[1], $new[1], " [<font class=\\"remark\\">".$new[0]."</font>]".$showtoday);
$i++;
if (!($i % $size)) {
$grid.= "</tr>$tr\\n";
}}}
while ($i % $size) {
$grid.= sprintf ($td, \'\',\'\',\'\',\'\');
$i++; }
$end_tr_len = strlen ($tr) * -1;
if (substr($grid, $end_tr_len)!=$tr) {
$grid.=\'</tr>\';
} else {
$grid = substr($grid, 0, $end_tr_len);
  }
$grid .= \'</table>\';
return $grid;
 }
  
« Последнее редактирование: 01 Апреля 2006, 00:06:47 от reLax[0x00] »

Оффлайн reLax[0x00]

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 68
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.microcat.ru
Вопрос начинающего - статистика сайта :)
« Ответ #1 : 19 Марта 2006, 22:01:46 »
продолжение....

//html
$html "<div style=\\"width:400px;\\" align=\\"center\\">";
$html.= "<img src=\\"/image?image=".urlencode ("СЕГОДНЯШНИЕ ПОСЕЩЕНИЯ БОТОВ ДОМЕНА VELKO.RU")."&color=0xFF0000&width=325\\">
"
;
$html.= "<font class=\\"remark\\">Выводятся боты поисковых систем, указанных выше.</font></div>";
echo 
table ($html);
//выводим уникальных ботов из USER_AGENT из SQL
$result_b mysql_query ($query_3);
$sql_other mysql_num_rows ($result_b);
while (
$bot mysql_fetch_object($result_b)) {
if (!empty (
$bot->browser)) {
foreach (
$array_encoding as $key=>$value) {
if (
preg_match (\'%\'.$key.\'%i\', $bot->browser))
$array_bots[] = $key; } }
$array_bots = array_unique($array_bots);
echo "<tr><td colspan=\\"2\\" align=\\"center\\" height=\\"100\\">";
foreach ($array_bots as $key=>$value) {
echo "<img src=\\"images/bot_".$value.".gif\\">";}
echo "</td></tr>";
$query_2 = "SELECT * FROM ".DUMP."";
$sql_users = mysql_query($query_2);
$count_users = mysql_num_rows ($sql_users);
//html
$html = "<div style=\\"width:600px;\\" align=\\"center\\">";
$html.= "<img src=\\"/image?image=".urlencode ("ОБЩАЯ СТАТИСТИКА ПОСЕЩЕНИЙ ДОМЕНА VELKO.RU")."&color=0xFF0000&width=315\\">
";
$html.= "<font class=\\"remark\\">Процентное соотношение количества уникальных пользователей по часам/дням недели/месяцам, которые посетили velko.ru. Всего: ".$count_users."</font></div>";
echo table ($html);

//здесь выводим графики из следующего файла

$unique_id = md5 (uniqid(microtime(), true));
echo <<<__EAX__
<tr><td colspan="2" align="center">
<table cellspacing="2" cellpadding="2" border="0">
<tr>
    <td rowspan="2" valign="top"><img src="/gisto?graf=3&id=$unique_id"></td>
    <td valign="top"><img src="/gisto?graf=2&id=$unique_id"></td>
</tr>
<tr>
    <td valign="bottom"><img src="/gisto?graf=1&id=$unique_id"></td>
</tr>
</table>
</td></tr>
__EAX__;
?>
<tr><td colspan="2" style="border-top: #6699CC 1px solid;"></td></tr>
</table>


« Последнее редактирование: 31 Марта 2006, 21:23:40 от reLax[0x00] »

Оффлайн andymc

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 400
  • +1/-0
  • 0
    • Просмотр профиля
Вопрос начинающего - статистика сайта :)
« Ответ #2 : 22 Марта 2006, 19:47:14 »
Аддско

Оффлайн Greg

  • пинёг
  • Ветеран
  • *****
  • Сообщений: 618
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.bsfera.ru
Вопрос начинающего - статистика сайта :)
« Ответ #3 : 23 Марта 2006, 07:23:23 »
ниасилил
кг/ам
Пространные размышления об ИТ и все что вокруг

Оффлайн for_i_0

  • $15 per hour
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 555
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.php.net/manual/en
Вопрос начинающего - статистика сайта :)
« Ответ #4 : 23 Марта 2006, 11:16:13 »
reLax[0x00]
[OFF]хорошим, тоном является коментирования своего когда.[/OFF]
[off]Безработный[/off]

Оффлайн reLax[0x00]

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 68
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.microcat.ru
Вопрос начинающего - статистика сайта :)
« Ответ #5 : 23 Марта 2006, 20:09:07 »
Ок. Согласен. Будет время-прокомментирую код, в субботу наверное. Сейчас особо время на это нету-мне же Dual Xeon привезли на замену старого прокси-сервера - сами понимаете тут уж не до PHP :) юзеров же нада новый сервак перекидать...а так результат кода пока можете увидеть www.velko.ru/statistic? (не реклама -результат кода - там пока все криво и разъезжается html-оформлением я не занимался)

Оффлайн reLax[0x00]

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 68
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.microcat.ru
Вопрос начинающего - статистика сайта :)
« Ответ #6 : 31 Марта 2006, 21:35:15 »
gisto.php



<?
session_name (\'sessid\');
session_start ();

  //константы коннекта с СКЛ+ из HTTP_HOST нужно вырезать www
  define (\'SERVER\',\'localhost\');
  define (\'USER\',\'xxx\');
  define (\'PWD\',\'xxx\');
  define (\'DB\',\'xxx\');
  define (\'DUMP\', \'dump\');
  define (\'SIZE\', \'390\');
  define (\'LASH\',preg_replace (\'/^[w]{3}[\\.]/\', \'\', $GLOBALS[\'HTTP_HOST\']));


//конвертим в KOI-8 текст
function convert($s) {
    $s = convert_cyr_string($s,\'w\',\'i\'); 
    for ($result=\'\', $i=0; $i<strlen($s); $i++) {
    $charcode = ord($s[$i]);
    $result .= ($charcode>175)?"&#".(1040+($charcode-176)).";":$s[$i];
    }
    return $result;
  }

//это понятно

mysql_pconnect (SERVER,USER,PWD) or die ("MySQL server error: can\'t login.");
mysql_select_db (DB);


//режем GET строку браузера
$_REQUEST[\'graf\'] = preg_replace (\'/^([^0-9]{1})$/\',\'\',$_REQUEST[\'graf\']);


//выбираем

//короче здесь все в SWITCH  достаточно просто - делаем запрос к SQL и заносим все это в 2 массива - запросы простые поэтому не комментирую
switch ($_REQUEST[\'graf\']) {

case (1):

$question = convert (\'Статистика хитов \'.LASH.\' по месяцам\');
$month = array (\'January\'=>\'Январь\', \'February\'=>\'Февраль\', \'March\'=>\'Март\', \'April\'=>\'Апрель\', \'May\'=>\'Май\', \'June\'=>\'Июнь\', \'July\'=>\'Июль\', \'August\'=>\'Август\', \'September\'=>\'Сентябрь\', \'October\'=>\'Октябрь\', \'November\'=>\'Ноябрь\', \'December\'=>\'Декабрь\');
foreach ($month as $month_key=>$month_val) {
$query = "SELECT * FROM ".DUMP." WHERE FROM_UNIXTIME(date, \'%M\') = \'".$month_key."\'";
$show = mysql_num_rows (mysql_query($query));
$answers[\'answer\'][] = $month_val;
	
	
$answers[\'votes\'][] = $show;}
break;

case (2):

$question = convert (\'Статистика хитов \'.LASH.\' по дням недели\');
$week = array (\'Monday\'=>\'Понедельник\', \'Tuesday\'=>\'Вторник\', \'Wednesday\'=>\'Среда\', \'Thursday\'=>\'Четверг\', \'Friday\'=>\'Пятница\', \'Saturday\'=>\'Суббота\', \'Sunday\'=>\'Воскресенье\');
foreach ($week as $week_key=>$week_val) {
$query = "SELECT * FROM ".DUMP." WHERE FROM_UNIXTIME(date, \'%W\') = \'".$week_key."\'";
$show = mysql_num_rows (mysql_query($query));
$answers[\'answer\'][] = $week_val;
	
	
$answers[\'votes\'][] = $show;
}

break;

case (3):
$question = convert (\'Статистика хитов \'.LASH.\' по часам\');
for ($i=0;$i<=23;$i++) {

$time = (strlen($i)==1)?\'0\'.$i:$i; 

$query = "SELECT * FROM ".DUMP." WHERE FROM_UNIXTIME(date, \'%H:%i:%s\') BETWEEN \'".$time.":00".":00"."\' AND \'".$time.":59".":59"."\'";
$show = mysql_num_rows (mysql_query($query));
$answers[\'answer\'][] = $time.":00 - ".$time.":59";
	
	
$answers[\'votes\'][] = $show;
}

break;

case (4):


$question = convert (\'Количество хитов \'.LASH.\' за сегодня\');
for ($i=0;$i<=23;$i++) {

$time = (strlen($i)==1)?\'0\'.$i:$i; 
$query = "SELECT * FROM ".DUMP." WHERE FROM_UNIXTIME(date, \'%Y-%c-%e - %H:%i:%s\') BETWEEN \'".date (\'Y-n-j\')." - ".$time.":00".":00"."\' AND \'".date (\'Y-n-j\')." - ".$time.":59".":59"."\'";
$show = mysql_num_rows (mysql_query($query));
$answers[\'answer\'][] = "c ".$time.":00:00 до ".$time.":59:59";
	
	
$answers[\'votes\'][] = $show;
}

break;

//умрем по умолчанию если $_GET[\'graf\'] не int и > 4 чтоли
default:
die;


  }

//А эту функцию я написал не для того чтобы ее комментировать-кто знает тот сам без комментов в ней разберется - на кого и был расчитана была моя просьба..эх..короче она и рисует графики с помощью GD

function gistogramm ($question, $answers) {

$colors = array (array (255,102,0), array (0,153,0),
                 array (51,51,204), array (255,0,51),
	
	
	
	
 array (65,72,145), array (99,122,191),
	
	
	
	
 array (153,0,204));

	
$x = $y = $padding = 5;
	

	
$image = imagecreate (SIZE, 10000);
	
imagecolorallocate ($image, 255, 255, 255);
    $font = $_SERVER[\'DOCUMENT_ROOT\'].\'/text.ttf\';
    $font_name = $_SERVER[\'DOCUMENT_ROOT\'].\'/8.ttf\';
	
imagettftext($image, 10, 0, $x, $y + 10, imagecolorallocate ($image, 5, 51, 111), $font_name, $question);
	
$y +=$padding + 12;
	
for ($i=0;$i < count($answers[\'answer\']); $i++) {
	
$bar = sprintf (\'%d\', $answers[\'votes\'][$i]*270/(max ($answers[\'votes\'])));
	
$c = $i % count($colors);
    if ($_GET[\'graf\']==1) { $m=45; } else { $m=70; }
	
imagefilledrectangle ($image, $x+$m, $y, $x + $bar, $y+5, imagecolorallocate ($image, $colors[$c][0], $colors[$c][1], $colors[$c][2]));
	
if (sprintf (\'%1.1f\', 100*$answers[\'votes\'][$i]/(array_sum ($answers[\'votes\']))) !== \'0.0\') { $t = 5; } else { $t=45;}
    imagettftext($image, 8, 0, $x + $bar + $padding+$t, $y + 7, imagecolorallocate ($image, 0, 0, 0), $font, sprintf (\'%1.1f\', 100*$answers[\'votes\'][$i]/(array_sum ($answers[\'votes\'])))."%"." (".$answers[\'votes\'][$i].")");
	
$y +=5;
	
imagettftext($image, 8, 0, $x, $y+1, imagecolorallocate ($image, 5, 51, 111), $font, convert ($answers[\'answer\'][$i]));
	
$y +=10; }
	

	
$chart = imagecreate (SIZE, $y);
	
imagecopy ($chart, $image, 0,0,0,0,SIZE,$y);
	

	
header (\'Content-type: image/png\');
	
imagePNG($chart);
	

	
imagedestroy ($image);
	
imagedestroy ($chart);
                                            }
	
	

gistogramm ($question, $answers);
?>



Короче вот такой код и такие комменты-прошу помочь...если эти тупые мои комментарии помогут :(

Оффлайн for_i_0

  • $15 per hour
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 555
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.php.net/manual/en
Вопрос начинающего - статистика сайта :)
« Ответ #7 : 01 Апреля 2006, 01:50:20 »
reLax[0x00]

if (sprintf (\'%1.1f\', 100*$answers[\'votes\'][$i]/(array_sum ($answers[\'votes\']))) !== \'0.0\') { $t = 5; } else { $t=45;}

зачем тебе проверять на тип ? они ведь все равное не могут быть одного типа ? тоесть это условие возврощает всегда true.
[off]Безработный[/off]

Оффлайн reLax[0x00]

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 68
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.microcat.ru
Вопрос начинающего - статистика сайта :)
« Ответ #8 : 01 Апреля 2006, 08:48:59 »
for_i_0
да нет. тут на тип ничего не проверяется. здесь я  округляю число до десятой доли. и если оно равно 0 значит переменная $t принимает значение 5 и тд. Чтото я сам запутался в своем же коде - кстати сейчас наглядно видно как в графике по месяцам в апреле разъезжается гистограмма - сегодня же начало месяца

Оффлайн reLax[0x00]

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 68
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.microcat.ru
Вопрос начинающего - статистика сайта :)
« Ответ #9 : 01 Апреля 2006, 08:51:09 »
...и самое интересное что когда в апреле наберется некоторое количество посетивших пользователей - оно само по себе выровняется как надо. Чудеса в решете :(

Оффлайн for_i_0

  • $15 per hour
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 555
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.php.net/manual/en
Вопрос начинающего - статистика сайта :)
« Ответ #10 : 01 Апреля 2006, 22:48:19 »
Цитировать
reLax[0x00]:
и если оно равно 0 значит переменная $t принимает значение 5 и тд

не поленись, прочти пожалуйста
PHP.NET::Language opertaors
[off]Безработный[/off]

Оффлайн reLax[0x00]

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 68
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.microcat.ru
Вопрос начинающего - статистика сайта :)
« Ответ #11 : 06 Апреля 2006, 19:29:33 »
Что такое операторы я и без php.net знаю, здесь дело совсем в другом. Короче проблема решена. Просто в одной строке начальное значение по координате X было больше чем конечное. Изза этого пока значение  не выравнивалось или не становилось больше начального - гистограмма уезжала влево даже без прорисовски.

а переменная $t кстати всего лишь была назначена только для того, чтобы назначать начальную точку по координате X в завсимости от названия гистограммы  (разная ширина - строка (Апрель) < строка (Воскресенье)).Можно конечно же было вычислять среднюю величину буквы при этом шрифте и автоматом вычислять расстояние - но так как графика всего-лишь 3 штуки - посчитал неактуальным :)

Оффлайн for_i_0

  • $15 per hour
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 555
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.php.net/manual/en
Вопрос начинающего - статистика сайта :)
« Ответ #12 : 06 Апреля 2006, 19:32:59 »
[OFF]Отлично, проблема решена, тема закрыта.[/OFF]
[off]Безработный[/off]

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28