1K */ function val_trun($val) { $temp = $val / 1024; for ($i = 0; $temp >= 1 && $i < 3; $i++) { $val = $temp; $temp /= 1024; } switch ($i) { case 1: $suffix = "K"; break; case 2: $suffix = "M"; break; case 3: $suffix = "G"; break; default: $suffix = ''; } return sprintf("%01.2f%s", $val, $suffix); } /** * Формирует название месяца. * Пример: '11 Декабря 2009', 'Декабрь 2009'. */ function make_month($year, $month, $day = 0) { global $MONTH_NAMES; if ($day) $s = "$day " . $MONTH_NAMES['genitive'][(int)$month] . " $year"; else $s = $MONTH_NAMES['full'][(int)$month] . " $year"; return $s; } /* оборачивает элемент в 'span' тег */ function make_span($val, $class) { return "$val"; } /* Возвращает запрашиваемый день месяца, переданный через GET. */ function get_period_day($period) { if (isset($_GET['period_day']) && is_numeric($_GET['period_day'])) { $temp = $_GET['period_day']; if ($temp < 0 || $temp > $period) $temp = 0; } else { $temp = 0; } return $temp; } /* Возвращает номер отображаемой страницы переданный через GET. */ function get_page() { $page = (isset($_GET['page']) && is_numeric($_GET['page'])) ? abs($_GET['page']) : 0; return $page; } /* Возвращает число строк на одну страницу переданные через GET. */ function get_per_page() { global $numRowsPerPage; $perPage = (isset($_GET['per_page']) && is_numeric($_GET['per_page']) && in_array($_GET['per_page'], $numRowsPerPage)) ? $_GET['per_page'] : $numRowsPerPage[0]; return $perPage; } /** * Функция формирует строку содержащую навигацию по страницам. * $link - строка ссылки к которой будут прикреплены аргументы 'page' и 'per_page'. * $page - выбранная страница * $perPage - число строк на одну страницу * $numRows - всего строк в таблице которые разбиты на страницы */ function make_string_link_page($link, $page, $perPage, $numRows) { global $numRowsPerPage; $pageStr = "На страницу: "; for ($i = 0; isset($numRowsPerPage[$i]); $i++) { $val = $numRowsPerPage[$i]; $pageStr .= ($perPage == $val) ? "[$perPage] " : "$val "; } $pageStr .= '| '; $i = 0; $max = (int)($numRows / $perPage); while ($i <= $max) { /* комментарии справедливы для NUMBER_NEARBY_LINKS = 3 */ if ($page <= NUMBER_NEARBY_LINKS) { /* формируется первый тип ссылок: 1 [2] 3 4 ... 12 */ if ($i >= $page + NUMBER_NEARBY_LINKS && $i < $max) { $pageStr .= "... " . ($max + 1) . ''; break; } else { $pageStr .= ($page == $i) ? '[' . ($i + 1) . '] ' : "" . ($i + 1) . ' '; } } else if ($page >= $max - NUMBER_NEARBY_LINKS) { /* формируется второй тип ссылок: 1 ... 9 10 [11] 12 */ if ($i == 0) { $pageStr .= "1 ... "; $i = $page - NUMBER_NEARBY_LINKS + 1; continue; } else { $pageStr .= ($page == $i) ? '[' . ($i + 1) . '] ' : "" . ($i + 1) . ' '; } } else { /* формируется третий тип ссылок: 1 ... 3 4 [5] 6 7 ... 12 */ if ($i == 0) { $pageStr .= "1 ... "; $i = $page - NUMBER_NEARBY_LINKS + 1; continue; } else if ($i >= $page + NUMBER_NEARBY_LINKS) { $pageStr .= "... " . ($max + 1) . ''; break; } else { $pageStr .= ($page == $i) ? '[' . ($i + 1) . '] ' : "" . ($i + 1) . ' '; } } $i++; } return $pageStr; } /** * Возвращает массив состоящий из элементов в котором в качестве ключа выступает * ключ, а значением является значение которое находится по переданному ключу. * * То есть, есть следующий сложный массив $in[$i]['key'], то при вызове * этой функции следующим образом 'get_subarray_on_key($arr, 'key')' * будет возвращен массив состоящий из следующим элементов: * ($arr[0] => $in[0]['key'], $arr[1] => $in[1]['key'], ... , $arr[n] = $in[n]['key']). */ function get_subarray_on_key(&$arr, $key) { $array = array(); foreach ($arr as $i => &$val) $array[$i] = $val[$key]; return $array; } /** * Выполняет запрос на получение данных о трафике и возвращает массив с данными * заполненый с помощью функции обратного вызова '$callback'. * * $callback(&$val1, &$val2) - функция которая производит вставку данных в массив с данными. * $queryGetTraf - запрос к базе который извлекает данные. * $perPage - число строк на страницу, при разбиении вывода на страницы. * &$page - страница которую необходимо получить, используется в конструкции * 'limit' SQL-запроса. В эту переменную записывается скорректированное * значенеи, если это требуется. * &$numRows - в него запишется число строк которое возвратил бы SQL-запрос, * если бы не использовалось ограничение 'limit'. */ function data_traf_fill($callback, $queryGetTraf, $perPage, &$page, &$numRows) { /* выполним запрос на получение данных */ $dataTraf = array(); $query = $queryGetTraf . ' limit ' . ($page * $perPage) . ", $perPage"; $result = my_mysql_query($query); while ($line = mysql_fetch_assoc($result)) { call_user_func_array($callback, array(&$dataTraf, $line)); } mysql_free_result($result); /* получим число строк которые возвратил предыдущий запрос если бы небыло ограничителя 'limit */ $query = "select found_rows() as num"; $result = my_mysql_query($query); $line = mysql_fetch_assoc($result); mysql_free_result($result); $numRows = $line['num']; /* * Проверим сколько дынных мы получили на страницу. Если мы получили нуль но * $numRows больше нуля, то запрошенная страница ($_GET['page']) не правильна и * ее требуется скоректировать и перезапустить запрос на выборку данных. */ if (!count($dataTraf) && $numRows) { /* * Проверим корректность параметра 'страница' ($page) и * если требуется скорректируем его. * * Эта корректировка нужна если numRows == page * perPage, т.е. число строк * будет кратно perPage, нуль будет так же кратно для любого значения perPage. * Тогда последняя страница будет пустой, а пустую страницу не надо показывать. */ $numRows = abs($line['num'] - 1); $temp = $page * $perPage; if ($temp > $numRows) { $page = (int)($numRows / $perPage); } /* получим данные уже с скорректированым значение $page */ $dataTraf = array(); $query = $queryGetTraf . " limit " . ($page * $perPage) . ", $perPage"; $result = my_mysql_query($query); while ($line = mysql_fetch_assoc($result)) { call_user_func_array($callback, array(&$dataTraf, &$line)); } mysql_free_result($result); } else { /* если число доступных страниц равно нулю, принудительно сбросим выбранную страницу */ if (!$numRows) $page = 0; /* * Зачем выполнять корректировку $numRows описанов * в коментарии несколькими строками выше. */ $numRows = abs($line['num'] - 1); } return $dataTraf; } /** * Заполняет переменные датами между которыми необходимо получать статистику. */ function mktime_period_date(&$beginDate, &$endDate, &$minDateStorage) { /* Определим даты между которыми нужно получать данные */ $t = mktime(0, 0, 0); $endDate = (PERIOD_DAY) ? mktime(0, 0, 0, date('m', $t), date('d', $t) - (STORAGE_CURRENT_TRAF - PERIOD_DAY - 1), date('Y', $t)) : mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')); $beginDate = (PERIOD_DAY) ? mktime(0, 0, 0, date('m', $endDate), date('d', $endDate) - 1, date('Y', $endDate)) : mktime(0, 0, 0, date('m', $endDate), date('d', $endDate) - STORAGE_CURRENT_TRAF, date('Y', $endDate)); /* определим самую дальнюю дату за которую есть записи в хранилище */ $minDateStorage = mktime(0, 0, 0, date('m', $t), date('d', $t) - (STORAGE_CURRENT_TRAF - 1), date('Y', $t)); } ?>