Перейти до

Рекомендованные сообщения

Опубликовано:

С тех пор как я увидел старгазер, мне не хватало в нем одной вещи - более подробной отчетности. Согласитесь, неудобно, когда нельзя посмотреть сколько прошло траффика за день по различным направлениям, сколько заплатили пользователи вчера, или за прошлую неделю. Вернее, были попытки сделать подобные отчеты, но все же не было таких возможностей как сейчас.

Думаю все уже видели в STG2 такую интересную возможность как подробная статистика по трафику. Формат ее представления чем-то похож на результат работы цисковой команды show ip accounting. В течение заданного интервала времени, собирается детальная статистика, и пишется в файл. Это уже что-то, но все же не хватает некоторой гибкости и удобства, которую дает БД. Именно поэтому я немного дописал STG2, и теперь у меня подробная статистика пишется в mysql базу, а к ней уже я буду на днях лепить веб-морду.

Если кому-нить нужен будет результат моей работы - пишите в приват, я поделюсь =)

Дык вот, возникает вопрос, как лучше хранить все в базе? Какую структуру вы предложите?

Сейчас у меня есть таблица со следующими полями: datetime, login, ipstr, dir, down, up, cash, это дата+время записи, логин пользователя, IP по которому прошел траф, направление, принято байт, отправлено байт, общая стоимость этого трафика, соответсвенно. Но это не оптимальное решение, а так, то что пришло в сразу в голову. Я сейчас пойду спать, а вы пока предлагайте оптимальную структуру базы =)

Опубліковано:

Hash

Это здорово что написал такую вещь, а как реализовано. Правил исходники, есть ли возможность выбора куда писать логи - в файл или базу. Поделись созданным.

Опубліковано:
Hash

Это здорово что написал такую вещь, а как реализовано?

Добавил функцию USER::WriteMysqlStat, написав ее на основе USER::WriteInetStat.

 

Есть ли возможность выбора куда писать логи - в файл или базу.

Да, она есть. Можно писать как в базу, так и в файл одновременно. Вот кусок кода из main.cpp, который пишет статистику после отключения пользователя.

USER * u;
for (int i = 0; i < users->GetUserNum(); i++)
 {
       u = users->GetUser(i);
 if (u ->GetConnected())
 	{
 	u->Disconnect(LOGEVENT_DISCONNECT);
 	}
       u->WriteStat();
       u->WriteInetStat();
       u->WriteMysqlStat();             //Функция добавленая мной
}

Аналогично, можно добавить запись статистики в базу по таймауту, который определяется в конфиге, так как код там похожий. Как видите, есть выбор какую статистику писать, в файл, базу, или вообще оба варианта, как у меня.

 

Поделись созданным.

Ок, я на выходных прикручу форму, через которую можно будет смотреть отчеты, простейшие для начала, и тогда выложу. Заодно, доработаю обработку ошибок, которые могут возникнуть при записи в базу.

Опубліковано:
если не сложно скинь всё это добро автору - пусть тоже подумает над этим :(

Автор уже высказывался когда-то о ненужности, по его мнению, складирования логов в mysql из за большей нагрузки на сервер стг в момент работы с базой.

Я сделаю дополнительную опцию в конфиге, чтобы можно было более удобно рулить логгированием, для тех, кому это нужно.

  • 2 weeks later...
Опубліковано:
Ждёмс....

Ой, я забыл совсем =)

ЗАвтра с работы выложу.

 

А юзера в это время спрашивают "А где это я просидел 0,00023559546 центов"

В смысле?

Опубліковано:
DeadOff имел ввиду, что теперь у него будут доказательства ввиде логов в базе по хостам :)

Дык это и так хранится, только в текстовых файлах, а их парсить несколько неудобно. =)

Опубліковано: (відредаговано)

Кстати, какую статистику вы хотели бы видеть? Нужны ли графики загрузки, как в UTM?

Да, и кстати, кто-нить может намалевать более-менее пристойный десигн, если я добавлю поболее функциональности в статистике?

Відредаговано Hash
Опубліковано:

Hash С дизигном помогу. Свисти какого плана рисовать.

 

...только дайте для local.com.ua дорисовать

ибо Foster'y обещал уже, надо доделать...

Опубліковано:
Hash С дизигном помогу. Свисти какого плана рисовать.

Ок, я пока придумаю, какую функциональность я хочу вложить в него, а потом скажу че рисовать. Думаю нужно что-нить похожее на веб-морду УТМ. Просто и понятно.

Опубліковано:

да да да

веб морды как раз не хватает....

а ваще спишитешь с автором - я думаю что вы друг другу будете взаимополезны :D

 

 

вобще конечно если может автор не откажется и если не откажетесь вы то сразу ваши изменения включать в его инсталяхи :)

 

потому как когда разрознено все делается это плёхо :)

 

пойди потом собери все патчи к исходникам

Опубліковано:
а ваще спишитешь с автором - я думаю что вы друг другу будете взаимополезны

Да, я тоже об этом думал. Потому как есть идея, к примеру, которая позволит писать плагины к стг, без перекомпиляции сервера.

Опубліковано:
Да, я тоже об этом думал. Потому как есть идея, к примеру, которая позволит писать плагины к стг, без перекомпиляции сервера.

 

Вот это действительно полезная фича! Так что с автором свяжись по-любому, я думаю он будет только за.

Опубліковано:

Hash

интересно может вышлешь мне свою работу? :) меня просто заинтересовало это. И кстати если есть возможно то по асе давай свяжемся у меня куча вопросов есть к тебе. :)

  • 4 weeks later...
  • 4 weeks later...
Опубліковано:

сделаны патчи для связи мискуля и СТГ

патчи для последней версии СТГ от 03.08

за реализацию идеи говорим спасибо Hash

за адаптацию патчей для текущей версии спасибо говорим TruthSeeker

 

база для записи туда статистики создается так:

 

CREATE TABLE `traff` (

`datetime` datetime NOT NULL default '0000-00-00 00:00:00',

`login` varchar(100) NOT NULL default '',

`ipstr` varchar(15) NOT NULL default '',

`dir` smallint(1) NOT NULL default '0',

`down` int(10) NOT NULL default '0',

`up` int(10) NOT NULL default '0',

`cash` float(10,4) NOT NULL default '0.0000'

) TYPE=MyISAM;

 

в конф файл необходимо добавить следующие параметры:

 

dbLogin - логин к БД

dbPassword - пароль к БД

dbName имя БД

dbHost ХОСТ

useMysql yes или no

ignoreErrors yes или no

 

СТГ с данным патчем собирается и под линукс и под фряху ...

 

вот собственно патч:

 

Only in stg2-2004.08.03-03.02.59: admin.o
Only in stg2-2004.08.03-03.02.59: admins.o
Only in stg2-2004.08.03-03.02.59: bsp.o
Binary files stg2-2004.08.03-03.02.59/common.o and stg2-2004.08.03-mysql/common.o differ
Binary files stg2-2004.08.03-03.02.59/conffiles.o and stg2-2004.08.03-mysql/conffiles.o differ
Only in stg2-2004.08.03-03.02.59: configproto.o
Only in stg2-2004.08.03-03.02.59: des.o
Only in stg2-2004.08.03-03.02.59: list.o
Binary files stg2-2004.08.03-03.02.59/main.o and stg2-2004.08.03-mysql/main.o differ
diff -rbp stg2-2004.08.03-03.02.59/make.bsd stg2-2004.08.03-mysql/make.bsd
*** stg2-2004.08.03-03.02.59/make.bsd   Tue Aug  3 12:09:35 2004
--- stg2-2004.08.03-mysql/make.bsd      Thu Aug  5 12:42:57 2004
*************** CC=g++
*** 6,11 ****
--- 6,12 ----
 
 flags=-Wall -gstabs+
 defines=-DFREEBSD -DTARIFF$(t)
+ mysql=-I/usr/include/mysql -L/usr/lib/mysql
 
 bsd:  stargazer
 
*************** sendcl.o admin.o admins.o rsconf.o list.
*** 14,20 ****
 freebsd/cap.o parser.o parser_admin.o parser_tariff.o
       $(CC) $(flags) -o stargazer main.o tariff.o conffiles.o common.o settings.o user.o users.o recivecl.o \
 -pthread /usr/lib/libc_r.so des.o sendcl.o admin.o admins.o rsconf.o list.o configproto.o bsp.o
traffcounter.o freebsd/cap.o \
! /usr/local/lib/libexpat.so parser.o parser_admin.o parser_tariff.o
 
 main.o:                                       main.cpp                        main.h
       $(CC) -c $(flags) $(defines) -o main.o                          main.cpp
--- 15,21 ----
 freebsd/cap.o parser.o parser_admin.o parser_tariff.o
       $(CC) $(flags) -o stargazer main.o tariff.o conffiles.o common.o settings.o user.o users.o recivecl.o \
 -pthread /usr/lib/libc_r.so des.o sendcl.o admin.o admins.o rsconf.o list.o configproto.o bsp.o
traffcounter.o freebsd/cap.o \
! /usr/local/lib/libexpat.so parser.o parser_admin.o parser_tariff.o /usr/lib/mysql/libmysqlclient.so
 
 main.o:                                       main.cpp                        main.h
       $(CC) -c $(flags) $(defines) -o main.o                          main.cpp
*************** settings.o:                             settings.cpp                    settings.h
*** 38,44 ****
       $(CC) -c $(flags) $(defines) -o settings.o                      settings.cpp
 
 user.o:                                       user.cpp                        user.h
!       $(CC) -c $(flags) $(defines) -o user.o                          user.cpp
 
 users.o:                              users.cpp                       users.h
       $(CC) -c $(flags) $(defines) -o users.o                         users.cpp
--- 39,45 ----
       $(CC) -c $(flags) $(defines) -o settings.o                      settings.cpp
 
 user.o:                                       user.cpp                        user.h
!       $(CC) -c $(flags) $(defines) $(mysql) -o        user.o                          user.cpp
 
 users.o:                              users.cpp                       users.h
       $(CC) -c $(flags) $(defines) -o users.o                         users.cpp
diff -rbp stg2-2004.08.03-03.02.59/make.linux stg2-2004.08.03-mysql/make.linux
*** stg2-2004.08.03-03.02.59/make.linux Tue Aug  3 03:02:59 2004
--- stg2-2004.08.03-mysql/make.linux    Thu Aug  5 12:09:55 2004
*************** t=2
*** 6,11 ****
--- 6,12 ----
 
 flags=-Wall -gstabs+
 defines=-Dlinux -DTARIFF$(t)
+ mysql=-I/usr/include/mysql -L/usr/lib/mysql
 
 linux:        stargazer
 
*************** linux/cap.cpp parser.o parser_admin.o pa
*** 15,21 ****
       $(CC) $(flags) -o stargazer main.o tariff.o conffiles.o common.o settings.o user.o \
       users.o recivecl.o /lib/libpthread.so.0 des.o sendcl.o admin.o admins.o rsconf.o list.o \
       configproto.o bsp.o traffcounter.o linux/cap.cpp parser.o parser_admin.o \
!       parser_tariff.o /usr/lib/libexpat.a
 
 
 main.o:                                       main.cpp                        main.h
--- 16,22 ----
       $(CC) $(flags) -o stargazer main.o tariff.o conffiles.o common.o settings.o user.o \
       users.o recivecl.o /lib/libpthread.so.0 des.o sendcl.o admin.o admins.o rsconf.o list.o \
       configproto.o bsp.o traffcounter.o linux/cap.cpp parser.o parser_admin.o \
!       parser_tariff.o /usr/lib/libexpat.a /usr/lib/mysql/libmysqlclient.so
 
 
 main.o:                                       main.cpp                        main.h
*************** settings.o:                             settings.cpp                    settings.h
*** 40,47 ****
       $(CC) -c $(flags) $(defines) -o settings.o                      settings.cpp
 
 user.o:                                       user.cpp                        user.h
!       $(CC) -c $(flags) $(defines) -o user.o                          user.cpp
! 
 users.o:                              users.cpp                       users.h
       $(CC) -c $(flags) $(defines) -o users.o                         users.cpp
 
--- 41,47 ----
       $(CC) -c $(flags) $(defines) -o settings.o                      settings.cpp
 
 user.o:                                       user.cpp                        user.h
!       $(CC) -c $(flags) $(defines) $(mysql) -o        user.o          user.cpp
 users.o:                              users.cpp                       users.h
       $(CC) -c $(flags) $(defines) -o users.o                         users.cpp
 
Only in stg2-2004.08.03-03.02.59: parser.o
Only in stg2-2004.08.03-03.02.59: parser_admin.o
Only in stg2-2004.08.03-03.02.59: parser_tariff.o
Only in stg2-2004.08.03-03.02.59: recivecl.o
Only in stg2-2004.08.03-03.02.59: rsconf.o
Only in stg2-2004.08.03-03.02.59: sendcl.o
diff -rbp stg2-2004.08.03-03.02.59/settings.cpp stg2-2004.08.03-mysql/settings.cpp
*** stg2-2004.08.03-03.02.59/settings.cpp       Tue Aug  3 03:02:59 2004
--- stg2-2004.08.03-mysql/settings.cpp  Thu Aug  5 12:44:54 2004
*************** CONFPARAM params[]={
*** 118,123 ****
--- 118,129 ----
     {"DirName3",          "",         1,              0},     //21
 
     {"SpreadFee",         "",         0,              0},     //22
+     {"dbLogin",             "",         0,              0},     //23
+     {"dbPassword",          "",         0,              0},     //24
+     {"dbName",              "",         0,              0},     //25
+     {"dbHost",              "",         0,              0},     //26
+     {"useMysql",            "",         0,              0},     //27
+     {"ignoreErrors",        "",         0,              0}      //28
       };
 
 
*************** if (f)
*** 368,373 ****
--- 374,427 ----
                             WriteServLog("пЫЙВЛБ Ч ЖБКМЕ ЛПОЖЙЗХТБГЙЙ! %s уФТПЛБ %d", str, lineNum);
                                                       exit(1);
 
+                       case 23: //dbLogin
+                                                   strncpy(dbLogin, p2, 100);
+                                                   params[i].read = 1;
+                                                   break;
+                       case 24: //dbPassword
+                                                   strncpy(dbPassword, p2, 100);
+                                                   params[i].read = 1;
+                                                   break;
+                       case 25: //dbName
+                                                   strncpy(dbName, p2, 100);
+                                                   params[i].read = 1;
+                                                   break;
+                       case 26: //dbHost
+                                                   strncpy(dbHost, p2, 100);
+                                                   params[i].read = 1;
+                                                   break;
+                       case 27: //useMysql
+                                                 if (0 == strcasecmp(p2, "yes"))
+                                                 {
+                                                     params[i].read = 1;
+                                                     useMysql = 1;
+                                                     break;
+                                                 }
+                                                 if (0 == strcasecmp(p2, "no"))
+                                                 {
+                                                     params[i].read = 1;
+                                                     useMysql = 0;
+                                                     break;
+                                                 }
+                                                 useMysql = 0;
+                                                 break;
+ 
+                       case 28: //ignoreErrors
+                                                         if (0 == strcasecmp(p2, "yes"))
+                                                         {
+                                                             params[i].read = 1;
+                                                             ignoreErrors = 1;
+                                                             break;
+                                                         }
+                                                         if (0 == strcasecmp(p2, "no"))
+                                                         {
+                                                             params[i].read = 1;
+                                                             ignoreErrors = 0;
+                                                             break;
+                                                         }
+                                                         ignoreErrors = 1;
+                                                         break;
+ 
                                               default:
                             break;
                                               }
*************** int SETTINGS::Reload ()
*** 426,429 ****
 return ReadSettings();
 }
 //-----------------------------------------------------------------------------
- 
--- 480,482 ----
diff -rbp stg2-2004.08.03-03.02.59/settings.h stg2-2004.08.03-mysql/settings.h
*** stg2-2004.08.03-03.02.59/settings.h Tue Aug  3 03:02:59 2004
--- stg2-2004.08.03-mysql/settings.h    Thu Aug  5 12:07:29 2004
*************** public:
*** 88,93 ****
--- 88,99 ----
     unsigned userPort;  // рПТФ РП ЛПФПТПНХ РТПЙУИПДЙФ РПДЛМАЮЕОЙЕ ЛМЙЕОФБ
     char      iface[MAX_DEV][DEV_NAME_LEN];   //FreeBSD only
     int     devNum;
+     char dbLogin[100];  //мПЗЙО ДМС РПДЛМАЮЕОЙС Л Mysql
+     char dbPassword[100]; //Mysql password
+     char dbName[100];    //йНС mysql ВБЪЩ
+     char dbHost[100];   //Mysql иПУФ
+     int useMysql;       //пРТЕДЕМСЕФ ОХЦОП МЙ РЙУБФШ ЮФП-МЙВП Ч ВБЪХ ЙМЙ ОЕФ
+     int ignoreErrors;   //пУФБОБЧМЙЧБФШ МЙ УЕТЧЕТ УФЗ, РТЙ ЧПЪОЙЛОПЧЕОЙЙ ПЫЙВЛЙ ЪБРЙУЙ Ч ВБЪХ
 };
 //-----------------------------------------------------------------------------
 #endif
Binary files stg2-2004.08.03-03.02.59/settings.o and stg2-2004.08.03-mysql/settings.o differ
Binary files stg2-2004.08.03-03.02.59/tariff.o and stg2-2004.08.03-mysql/tariff.o differ
Only in stg2-2004.08.03-03.02.59: traffcounter.o
diff -rbp stg2-2004.08.03-03.02.59/user.cpp stg2-2004.08.03-mysql/user.cpp
*** stg2-2004.08.03-03.02.59/user.cpp   Tue Aug  3 03:02:59 2004
--- stg2-2004.08.03-mysql/user.cpp      Thu Aug  5 12:23:32 2004
***************
*** 55,60 ****
--- 55,62 ----
 #include "msgbuf.h"
 #include "configproto.h"
 
+ #include "mysql.h"
+ 
 extern SETTINGS * settings;
 extern USERS * users;
 extern ADMINS * admins;
*************** const PRIV * priv = admin->GetPriv();
*** 653,658 ****
--- 655,667 ----
 
 double dc = c - cash;
 
+ char sql_query[255];
+ MYSQL mysql;
+ tm * lt;
+ time_t t;
+ 
+ 
+ 
 if (log)
       {
     if (priv->userStat || priv->userCash)
*************** if (log)
*** 661,666 ****
--- 670,703 ----
                      admin->GetLogin(), login, cash, c, msg);
         WriteLog("Admin \'%s\': йЪНЕОЕОЙЕ ДЕОЕЗ. вЩМП %.3f, УФБМП %.3f. %s", 
                  admin->GetLogin(), cash, c, msg);
+  
+        if (settings->useMysql) 
+       {
+               mysql_init(&mysql);
+               if (!mysql_real_connect(&mysql, settings->dbHost, settings->dbLogin, settings->dbPassword,
settings->dbName,0,NULL,0))
+               {
+                       WriteServLog("оЕЧПЪНПЦОП РПДЛМАЮЙФУС Л ВБЪЕ: пЫЙВЛБ: %s\n", mysql_error(&mysql));     
+                       if (!settings->ignoreErrors)
+                               _exit(1);
+               }
+ 
+               t = time(NULL);
+               lt = localtime(&t);
+                 
+               snprintf(sql_query, 255, "INSERT INTO logs (datetime, name, ip, what, client, money, status)
VALUES (\"%d-%d-%d %d:%d:%d\",
+                       \"%s\", \"%s\", \"%s\", \"%s\", %10.4f, \"%s\"\n)", lt->tm_year+1900, lt->tm_mon,
lt->tm_mday, lt->tm_hour, lt->tm_min, 
+                               lt->tm_sec, admin->GetLogin(), login, msg, login, c, "оЕ ПРМБЮЕОП");
+               if (mysql_query(&mysql, sql_query))
+               {
+                       WriteServLog("пЫЙВЛБ: %s\n", mysql_error(&mysql));
+                       if (!settings->ignoreErrors)
+                       _exit(1);
+               }
+       
+               mysql_close(&mysql);
+       }       
+ 
+ 
         lastCash = dc;
         lastTimeCash = time(NULL);
 
*************** void USER::AddCash(double c, char * msg,
*** 697,702 ****
--- 734,745 ----
 ADMIN *admin = confProto->GetCurrAdmin();
 const PRIV * priv = admin->GetPriv();
 
+ char sql_query[255];
+ MYSQL mysql;
+ tm * lt;
+ time_t t;
+ 
+ 
 if (log)
       {
     if (priv->userStat || priv->userCash)
*************** if (log)
*** 705,710 ****
--- 748,782 ----
                  admin->GetLogin(), login, c > 0?"+":"", c, cash, cash + c, msg);
         WriteLog("Admin \'%s\': йЪНЕОЕОЙЕ ДЕОЕЗ: %s%.3f. вЩМП %.3f, УФБМП %.3f. %s", 
                  admin->GetLogin(), c > 0?"+":"", c, cash, cash + c, msg);
+ 
+        if (settings->useMysql) 
+       {
+               mysql_init(&mysql);
+               if (!mysql_real_connect(&mysql, settings->dbHost, settings->dbLogin, settings->dbPassword,
settings->dbName,0,NULL,0))
+               {
+                       WriteServLog("оЕЧПЪНПЦОП РПДЛМАЮЙФУС Л ВБЪЕ: пЫЙВЛБ: %s\n", mysql_error(&mysql));     
+                       if (!settings->ignoreErrors)
+                               exit(1);
+               }
+ 
+               t = time(NULL);
+               lt = localtime(&t);
+                 
+               snprintf(sql_query, 255, "INSERT INTO logs (datetime, name, ip, what, client, money, status)
VALUES (\"%d-%d-%d %d:%d:%d\",
+                       \"%s\", \"%s\", \"%s\", \"%s\", %10.4f, \"%s\"\n)", lt->tm_year+1900, lt->tm_mon,
lt->tm_mday, lt->tm_hour, lt->tm_min, 
+                               lt->tm_sec, admin->GetLogin(), login, msg, login, c, "оЕ ПРМБЮЕОП");
+               if (mysql_query(&mysql, sql_query))
+               {
+                       WriteServLog("пЫЙВЛБ: %s\n", mysql_error(&mysql));
+                       if (settings->ignoreErrors)
+                       exit(1);
+               }
+       
+               mysql_close(&mysql);
+       }       
+ 
+ 
+ 
         lastCash = c;
         lastTimeCash = time(NULL);
 
Only in stg2-2004.08.03-03.02.59: user.o
Only in stg2-2004.08.03-03.02.59: users.o

Опубліковано:

берешь распаковываешь исх. коды сервера от 03 августа

потом делаешь файлик с тем что япривел выше и как нить его называешь, например mysql.patch

после этого пишешь в консоли

patch -p1 < mysql.patch

 

если все классно то не должно быть слов failed

после этого все собираешь как обычно

Опубліковано:
за реализацию идеи говорим спасибо Hash

Это не полноценная реализация. Я отошел от идеи хранить все в базе. Это просто попытка показать, что всетаки нетяжело прикрутить stg+mysql. Реально кода, который выполняет саму запись в базу тут строк 5-7.

Опубліковано:

Да, наверное нужно описать действия патча.

В конфиге добавляются несколько параметров.

dbLogin - логин к mysql

dbPassword - пароль к mysql

dbName - имя базы в mysql

dbHost - хост, если база на одной машине с стг, то можно установить значение в "localhost"

useMysql = значения "yes" или "no". Определяет, включить ли логгинг в базу.

ignoreErrors = значения "yes" или "no". Определяет, нужно ли останавливать сервер стг, при возникновении ошибки записи базу.

В итоге заполняется таблица, структуру которой описали выше. Таблица должна называтся traff. Но это можно поменять в исходниках.

Опубліковано:

Думаю, не будет лишним скопировать сюда мой ответ из другого топика по теме stg+mysql, дабы все что с этим связано было в одном месте.

Как посоветуете реализовать функцию.

При срабатываении файла OnChange чтоб сбрасывались данне в MySQL БД ?

Для примера написал скрипт на Perl+DBI:

структура таблицы:

CREATE TABLE `changes` (
 `datetime` datetime default NULL,
 `login` varchar(255) NOT NULL default '',
 `parametr` varchar(255) NOT NULL default '',
 `old_value` varchar(255) NOT NULL default '',
 `new_value` varchar(255) NOT NULL default ''
) TYPE=MyISAM;

 

код OnChange:

#!/usr/bin/perl
use DBI;

$user = "username";   
$password = "mypassword";   
$database = "database";  

$login = $ARGV[0];
$parametr = $ARGV[1];
$old_value = $ARGV[2];
$new_value = $ARGV[3];

$dbh = DBI->connect("DBI:mysql:$database", $user, $password);
$sth = $dbh->prepare("INSERT INTO changes (datetime, login, parametr, old_value, new_value)
                        VALUES ( NOW(), \"$login\", \"$parametr\", \"$old_value\", \"$new_value\")");
$sth->execute;
$dbh->disconnect;

Коментарии, думаю не нужны, ибо код прост. Кому нужно, тот с легкостью модифицирует его.

 

вариант OnChange на bash:

#!/bin/bash

db_user="login"
db_pass="pass"
db_name="database"

datetime=`date "+ %Y-%m-%d %H:%M:%S"`

login=$1
parametr=$2
old_value=$3
new_value=$4

mysql -u $db_user --password=$db_pass -s -e "use $db_name; insert into changes (datetime, login, parametr, old_value, new_value) values (\"$datetime\", \"$login\", \"$parametr\", \"$old_value\", \"$new_value\");"

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Вхід

Уже зарегистрированы? Войдите здесь.

Войти сейчас
  • Зараз на сторінці   0 користувачів

    • Немає користувачів, що переглядають цю сторінку.
×
×
  • Створити нове...