Тарификация в Базу Данных

Материал из М-200 WIKI

Перейти к: навигация, поиск

Ниже описаная процедура расскажет о том как сделать Web интерфейс для поиска по базе данных тарификации.

Для разработки и проверки использовались:

  • Debian Linux 5.03

Программное обеспечение 

  • apache2
  • mysql-server-5.0
  • libapache2-mod-php5
  • php5
  • php5-cli
  • php5-mysql

Скрипты написанные на PHP:

  • db_connector.php
  • text_db.php
  • echo_db.php

Для начала нужно создать таблицу в базе данных со структурой указанной ниже:


CREATE DATABASE IF NOT EXISTS lab_db;
USE lab_db;
CREATE TABLE `lab_db`.`kungur` (
`id` double NOT NULL auto_increment,
`numer_a` char(8) character set utf8 default NULL,
`aon_a` char(20) character set utf8 default NULL,
`soed` char(8) character set utf8 default NULL,
`numer_b` char(20) character set utf8 default NULL,
`date` char(9) character set utf8 default NULL,
`time` char(9) character set utf8 default NULL,
`prodol` char(8) character set utf8 default NULL,
`prichina` char(3) character set utf8 default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Здесь lab_db - имя базы данных, kungur - имя таблицы 

 

затем правим  файл db_connector.php, и сохраняем его в web директорию вашего сервера:

db_connector.php


<?
//Соединение с БД
$host='localhost';  // адрес сервера  БД MySQL
$user='root';          // имя пользователя  базы данных
$password='lab';    // пароль к базе данных
mysql_connect($host, $user, $password);
mysql_select_db('lab_db'); // имя базы данных
?>
IP базы данных, имя и пароль пользователя БД, имя самой БД правьте под свои нужды.

далее сохраняем нижний текст в файл text_db.php в директорию доступную вашему демону Cron

<?
include './db_connector.php';
//в имя файла включена вчерашняя дата
$filename='cdr_log_'.date("d_m_Y", time()-3600*24).'.log';
//проверяем наличие файла, иначе вообще ничего не делаем
//чтоб в бд не попали пустые строки
if (file_exists($filename)) {
$file = fopen("/home/ftp/tarif/$argv[1]/$filename", "r");

while (!feof($file)) {
//каждую итерацию строка из файла в переменную $string
$string = fgets($file);
$num_prob = substr_count($string,' ');//кол-во пробелов

//начало подцикла перебора пробелов внутри строки
//массив $str_pos хранит позицию пробелов в строке
if (!feof($file)) {
for ($i=1;$i<=$num_prob+1;$i++) {
if ($i==1) {$str_pos[$i] = strpos ( $string , ' ' , 1);
$numer_a=substr($string, 1, $str_pos[$i]-1);
}
else
{
$str_pos[$i] = strpos ( $string , " " , $str_pos[$i-1]+1);
$next=substr($string , $str_pos[$i-1]+1, $str_pos[$i]-$str_pos[$i-1]-1 );
switch($i) {
case 2: $aon_a=$next;;
case 3: $soed=$next;
case 4: $numer_b=$next;
case 5: $date=$next;
case 6: $time=$next;
case 7: $prodol=$next;
case 8: $prichina=(substr($string , $str_pos[$i-1]+1,strlen($string)-$str_pos[$i-1]+1))-"\n";

}
}

}
// конец вычисления позиций пробелов
}
//сюда по результатам вычислений SQL запрос
if (!feof($file))
mysql_query("INSERT INTO $argv[1] (numer_a,aon_a,soed,numer_b,date,time,prodol,prichina) VALUES ('$numer_a','$aon_a','$soed','$numer_b','$date','$time','$prodol','$prichina')" );
//конец основного цикла
} fclose($file); }//конец проверки наличия файла
?>


Запускать такой скрипт нужно с параметром следующим через пробел сразу за именем скрипта:

php text_db.php kungur

,где kungur имя таблицы в базе данных  lab_db.

На практике этот сценарий обычно запускает демон Cron в 8 часов утра.

Скрипт вычисляет вчерашнюю дату, читает файл и переписывает его в таблицу базы данных MySQL.

Если формат названия тарификационного файла отличается от  cdr_log_01_03_2010.log, то строку         $filename='cdr_log_'.date("d_m_Y", time()-3600*24).'.log';

  нужно откоректировать согласно вашим требованиям.

Строка

 $file = fopen("/home/ftp/tarif/$argv[1]/$filename", "r");

Содержит путь к вашему файлу тарификации, где $argv[1] - первый параметр передаваемый скрипту.

т.е /home/ftp/tarif/kungur/имя файла

Учтите что скрипт расчитан на обработку файла формата Тариф 2004

Альтернатиная программа записывающая тарификацию в Базу данных DBWriter


 

далее сохраняем нижний текст в файл echo_db.php в Web директорию вашего сервера


<?
echo '<meta http-equiv="content-type" content="text/html;charset=utf-8">';
//перехват значений из $_GET
//инициализация переменных
$page=$_GET["page"];
$ip = $_SERVER["REMOTE_ADDR"];
$numer_a=$_GET["numer_a"];//номер абонента а
$aon_a=$_GET["aon_a"]; //аон абонента а
$soed=$_GET["soed"]; //с кем соединен
$numer_b=$_GET["numer_b"];//номер абонента b
$date=$_GET["date"]; // Дата
$time=$_GET["time"]; // Время
$ili=$_GET["ili"]; //радиокнопка
$currdate=date("d-m-y"); //сегодняшняя дата
$currtime=date("H:i:s"); //текущее время
$instruction=0; //печатать ли инструкцию по пользованию БД
$count_numer_a=0;
$ip_massive=Array('10.91.128.249'=>'kungur','10.91.128.230'=>'kungur','10.91.128.250'=>'kungur'
, '10.91.128.252'=>'kungur','127.0.0.1'=>'kungur', '10.91.128.174'=>'orda'
, '10.91.128.175'=>'orda' , '10.91.128.176'=>'orda' , '10.86.32.147'=>'kishert');
if ($page=="") foreach ($ip_massive as $k=>$v) if ($k==$ip) $page=$v;
if ($page=="") $page="kungur"; //если нет определения по ip, то Кунгурскую базу отобразить


//Описание Направлений
#########################################
# Из идентификатора направлений читается только 6 символов
# Например: С01051, где 01 - первый модуль (МЦК),
# 5 - указатель того что используется цифровой поток,
# 1 - номер потока в модуле
# Другой пример: C08013, где 08 - восьмой модуль,
# 13 - номер платы (в данном случае С68)
#
# Номера каналов не читаем
# Следующий ниже массив составить нужно исходя их этих условий.
if ($page=="kungur") {
$table="kungur"; //указатель с какой таблицей БД работать
$header="Кунгур"; //Указатель какой город встаривать в заголовок страницы
$route_name = Array('C01051'=>'Кунгур','C01052'=>'Кунгур','C02053'=>'Кунгур', 'C05051'=>'Кунгур','C08012'=>'Шадейка','C08013'=>'Шадейка','C09013'=>'Насадка','C10013'=>'Кинделино', 'C12013'=>'Бым','C13013'=>'Ергач','C14013'=>'Голдыревский','C15013'=>'Семсовхоз', 'C16013'=>'Кыласово','C17013'=>'Троельга','C05052'=>'Калинино','C05056'=>'Бырма','C05057'=>'Серга');
}
if ($page=="orda") {
$table="orda"; //указатель с какой таблицей БД работать
$header="Орда"; //Указатель какой город встаривать в заголовок страницы
$route_name = Array('C01051'=>'Межгород','C01052'=>'Межгород','C01056'=>'Межгород','C02051'=>'Шляпники','C02052'=>'Медянка', 'C02055'=>'Налоговая','C17013'=>'Кр.Ясыл','C18013'=>'М.Ашап');
}
if ($page=="kishert") {$table="kishert";//указатель с какой таблицей БД работать
$header="Кишерть"; //Указатель какой город встаривать в заголовок страницы
$route_name = Array('C01052'=>'Черный Яр', 'C01054'=>'Посад', 'C01057'=>'2ВСК Шлюз', 'C02051'=>'Межгород', 'C02052'=>'Межгород', 'C02053'=>'Шлюз', 'C02054'=>'Шлюз', 'C02055'=>'Шлюз', 'C02056'=>'Шлюз', 'C02057'=>'2ВСК Шлюз', 'C05051'=>'Шлюз', 'C05053'=>'Межгород', 'C07013'=>'Спасо-Барда', 'C08013'=>'Шумково', 'C08052'=>'Медведево', 'C09013'=>'Осинцево', 'C10013'=>'Кордон');
}
echo "<head><title> Тарификация М200 - $header </title></head>";

include "./db_connector.php";
//Проверяем содержимое заполненных полей
//Если в поле ввода есть названия направления из массива $route_name
//значит в переменную запроса надо подставить номер направлени из того же массива
foreach ($route_name as $k=>$v){ if ($numer_a == $v) {$numer_a=$k; $count_numer_a++;

}
if ($soed == $v) {$soed=$k;$count_soed++;}
##############################################
//Отладка

//echo $count_numer_a;
//echo $numer_a;
##############################################
}
//Если : условия выше не исполнены то счетчики равны нулю.
// : поля $numer или $soed заполнены
// ==> Следовательно ищем номер, для запроса в БД нужно подставить
//иденитификатор "A"
if ($count_numer_a<1 and $numer_a<>) $numer_a='A'.$numer_a;
if ($count_soed<1 and $soed<>) $soed='A'.$soed;
//формирование запроса согласно заполенным полям

//Прогоняем массив полей для составления запроса
//с учетом заполненности полей

if ($ili<>) {
$count=0;
$massivepolei = Array('numer_a'=>$numer_a,'aon_a'=>$aon_a,'soed'=>$soed,'numer_b'=>$numer_b,'date'=>$date,'time'=>$time);
foreach ($massivepolei as $k=>$v){
if ($v<>and $count>=1) {$query.=" $ili "; #встраивание в запрос OR или AND
}
if ($v!==
) {$query.="$k LIKE '$v%'"; $count++; }
}

}

################################################################
#Отладка
#echo "$query</br>";// для просмотра запроса раскоментировать
##############################################################

//
//Посылка запроса в БД, если он не пустой т.е сформирован
if ($query<>'') {
$result = mysql_query("select * from $table where $query");
$numrow = mysql_num_rows($result);
}
//таблица вывода данных
//включает в себя форму с радиокнопками, кнопкой запроса и полями ввода
echo "<table border='0' width=100%>
<form action='echo_db.php' method='get' target='_self' style='margin:1'>
<tr bgcolor='c6d4dc'><td colspan=7>
<INPUT TYPE=RADIO NAME=ili VALUE='and' CHECKED>И
<INPUT TYPE=RADIO NAME=ili VALUE='or' >ИЛИ

<input type='submit' name='Поиск' value='Запрос'></td>
</tr>
<tr bgcolor='c6d4dc'>
<td><input type='text' name='numer_a' size='9'></td>
<td><input type='text' name='aon_a' size='9'></td>
<td><input type='text' name='soed' size='9'></td>
<td><input type='text' name='numer_b' size='9'></td>
<td><input type='text' name='date' size='9'></td>
<td><input type='text' name='time' size='9'></td>
<input type='hidden' name='page' value=$page>
<td></td>
</tr>
</form>
<tr bgcolor='c6d4dc'><td>Абонент А</td>
<td>АОН</td>
<td>Соединен</td>
<td>Абонент Б</td>
<td>Дата</td>
<td>Время</td>
<td>Длит</td>
</tr>";

//цикл вывода
for ($i=0;$i<$numrow;$i++) {
$row=mysql_fetch_array($result);//резултат запроса БД в ассоциативный массив
//проверяем есть ли в "numer_a" и "soed" признак "А"-абонента,
// если есть вырезаем для коректногоотображения
if (substr($row["numer_a"],0,1)=='A') $row["numer_a"]=substr($row["numer_a"],1,strlen($row["numer_a"]));
if (substr($row["soed"],0,1)=='A') $row["soed"]=substr($row["soed"],1,strlen($row["soed"]));
//проверяем есть ли в "numer_a" и "soed" признак "C"- канала,
// если есть то нужно изменить на название направления
if (substr($row["numer_a"],0,1)=='C') foreach ($route_name as $k=>$v){
if (substr($row["numer_a"],0,6)==$k) $row["numer_a"]=$v;
}
if (substr($row["soed"],0,1)=='C') foreach ($route_name as $k=>$v){
if (substr($row["soed"],0,6)==$k) $row["soed"]=$v;
}
//четность $i для раскраски полей
$chetnechet=$i%2;
if ($chetnechet==0) $color='f0f2f8'; else $color='f0f9f1';
//$row возврат запроса в массив

echo "<tr bgcolor=$color>
<td>";echo$row["numer_a"];echo"</td>
<td>";echo$row["aon_a"] ;echo"</td>
<td>";echo$row["soed"] ;echo"</td>
<td>";echo$row["numer_b"];echo"</td>
<td>";echo$row["date"] ;echo"</td>
<td>";echo$row["time"] ;echo"</td>
<td>";echo$row["prodol"];echo"</td>";

echo" </tr>";}
// если запрос пустой распечатать инструкцию по пользованию БД
if ($page=="kungur") $begindate="14 декабря 2009";
if ($page=="orda") $begindate="14 декабря 2009";
if ($page=="kishert") $begindate="24 февраля 2010";
if ($query=='') echo "<tr bgcolor='f0f2f8'><td colspan='7' ></br>Запросы допускаются не полные, например:</br>
если ввести в поле
Абонент Ацифры 21, то поиск в базе данных будет происходить,</br>
по диапазону номеров
21000-21999</br>

Дата вводится в формате : $currdate - (число-месяц-год)</br>
Время вводится в формате: $currtime - (час:минуты:секунды)</br>
Дату и время так же можно вводить не полностью</br>

Рекомендуется для сокращения времени ответа на запрос указывать день месяца.</br></br>
<center><b>Запись ведется с $begindate года.</b></center>
</td></tr>";
echo "</table>";
//конец таблицы вывода

?>


Скрипт читает информацию о тарификации с трех таблиц базы данных. Анализирует IP - адрес компьютера

оператора АТС , который просматривает базу, на ту и переключает присваивая переменной $page одно из иначений.

$ip_massive хранит список IP адресов операторов трех АТС, смените их на свои значения.

В комментариях скрипта описано каким образом составлять массив $route_name перепишите его согласно названию направлений в вашей АТС М-200


Зайдите на сервер http://localhost/echo_db.php

Будет выведена страница с полями ввода для запроса.

Категории