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));
}
?>