SA-MP Forums Archive
Бан (mysql) - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: Бан (mysql) (/showthread.php?tid=423354)

Pages: 1 2


Бан (mysql) - Ted67 - 17.03.2013

Здравствуйте, подскажите пожалуйста оптимальный вариант для временного бана; а именно, есть что-либо лучше и удобнее чем:
Записывать кол-во часов в бд, каждый час каким-то образом отнимать эти значения на -1 (в бд)* и конвертировать в игре часы - в дату (до какого забанен).

* - с отнятием значения немного не понятно, запрос создал:
pawn Код:
mysql_function_query(1,"SELECT * FROM `accounts` WHERE `Ban`>'0'",true,"Test","");
после вот тут уже нужно уменьшать значения:
pawn Код:
forward Test();
public Test()
{
new r,f;
cache_get_data(r,f);
if(r)
{
// code
}
return 1;
}
Заранее благодарю за помощь.


Re: Бан (mysql) - Stepashka - 17.03.2013

А зачем что-то отнимать?
Есть два давно проверенных и оптимальных варианта:
  1. Храним время бана и срок.
  2. Храним дату разбана.



Re: Бан (mysql) - NameNone - 17.03.2013

Достаточно задать дату бана и сверять её с очередным подключением к серверу.
Сверять текущую дату и дату бана, вычеслять количество пройденного времени, в днях / часах, как тебе удобно.

Делать это твоим способом - издевательство.


Re: Бан (mysql) - Ted67 - 17.03.2013

Просто конвертировал часы в дату исходя из той даты, когда игрок смотрит до какого его забанили,а не той, когда забанили.

Quote:

Храним время бана и срок.
Храним дату разбана.

В обоих случаях если я не ошибаюсь придется использовать 3 переменных? (год, месяц, день, даже 4 - + время)


Re: Бан (mysql) - Stepashka - 17.03.2013

Quote:
Originally Posted by Ted67
Посмотреть сообщение
В обоих случаях если я не ошибаюсь придется использовать 3 переменных? (год, месяц, день, даже 4 - + время)
Для вас наверно будет шоком, но все системы в мире работают с датой как с одним целым числом!
UNIX-время


Re: Бан (mysql) - Ted67 - 17.03.2013

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Для вас наверно будет шоком, но все системы в мире работают с датой как с одним целым числом!
UNIX-время
Нет, вы что) Возможно для вас это было шоком, но для меня это не шок, я это и раньше знал).

Все же, пусть я буду использовать 2 переменные, 1 будет хранить getdate вторая gettime. Getdate - возвратит кол-во дней с начала 2013-го. В 2014 - с начала 2014-го, вот тут тоже немного проблематично..

Даже если я сделаю так:
pawn Код:
// При бане:
Player[id][pDBan]=getdate()+days;
// Проверка:
if(Player[id][pDBan]>getdate()){Kick(id);return 1;}
// Остается конвертирование дней в дату, и то, если будет 2014 - толку 0, все забаненные разбанятся...



Re: Бан (mysql) - Ted67 - 17.03.2013

А если записывать в секундах (дни, часы, месяц и тд) и потом конвертировать это при помощи этой функции?:

Код:
stock date(timestamp, _form = 0) // originally by pen_TheGun, edited by RealCop228
{
    /*
        ~ convert a Timestamp to a Date.
        ~ 10.07.2009

        date( 1247182451 )  will print >> 09.07.2009-23:34:11
        date( 1247182451, 1) will print >> 09/07/2009, 23:34:11
        date( 1247182451, 2) will print >> July 09, 2009, 23:34:11
        date( 1247182451, 3) will print >> 9 Jul 2009, 23:34
        * by RealCop228: date( 1247182451, 4) will print >> July 09, 2009
        * by RealCop228: date( 1247182451, 5) will print >> 23:34
    */

    new year = 1970, day = 0, month = 0, hour = 0, mins = 00, sec = 0;
    new days_of_month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
    new names_of_month[12][10] = {"January","February","March","April","May","June","July","August","September","October","November","December"};
    new returnstring[32];

    while(timestamp>31622400)
    {
        timestamp -= 31536000;
        if ( ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0) ) timestamp -= 86400;
        year++;
    }

    if ( ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0) )
        days_of_month[1] = 29;
    else
        days_of_month[1] = 28;


    while(timestamp>86400)
    {
        timestamp -= 86400, day++;
        if(day==days_of_month[month]) day=0, month++;
    }

    while(timestamp>60)
    {
        timestamp -= 60, mins++;
        if( mins == 60) mins=00, hour++;
    }

    sec=timestamp;

    switch(_form)
    {
        case 1: format(returnstring, 31, "%02d/%02d/%d %02d:%02d:%02d", day+1, month+1, year, hour, mins, sec);
        case 2: format(returnstring, 31, "%s %02d, %d, %02d:%02d:%02d", names_of_month[month],day+1,year, hour, mins, sec);
        case 3: format(returnstring, 31, "%d %c%c%c %d, %02d:%02d", day+1,names_of_month[month][0],names_of_month[month][1],names_of_month[month][2], year,hour,mins);
        case 4: format(returnstring, 31, "%s %02d, %d", names_of_month[month],day+1,year); // by RealCop228
        case 5: format(returnstring, 31, "%02d:%02d", hour,mins); // by RealCop228
        default: format(returnstring, 31, "%02d.%02d.%d-%02d:%02d:%02d", day+1, month+1, year, hour, mins, sec);
    }
    return returnstring;
}



Re: Бан (mysql) - TRPG - 17.03.2013

Просто при бане берите текущий gettime(), который вернет unix время в настоящий момент, прибавляйте к нему длительность бана в секундах и сохраняйте в одну переменную. При логине сверяйте то, что сохраните, с gettime() логина, если игрок попытается войти раньше срока разбана - gettime при логине будет меньше чем в переменной, если больше - время бана истекло.


Re: Бан (mysql) - Ted67 - 17.03.2013

Quote:
Originally Posted by TRPG
Посмотреть сообщение
Просто при бане берите текущий gettime(), который вернет unix время в настоящий момент, прибавляйте к нему длительность бана в секундах и сохраняйте в одну переменную. При логине сверяйте то, что сохраните, с gettime() логина, если игрок попытается войти раньше срока разбана - gettime при логине будет меньше чем в переменной, если больше - время бана истекло.
С этим проблем нету, мне нужен такой вариант, где я смогу сохранить в 1 переменную и потом это значение (которое будет в этой переменной) сконвертировать в дату формата: день.месяц.год часы:минуты:секунды.


Re: Бан (mysql) - Stepashka - 17.03.2013

Конвертировать дату в абсолютно любой формат может мускул.
PHP код:
SELECT Ban as unix_dateFROM_UNIXTIME(Ban'%Y %D %M %h:%i:%s %x') as formatted_date 
FROM accounts 
WHERE ip 
'*.*.*.*' 
LIMIT 1 
результатом будет:
PHP код:
unix_date|formatted_date
1196440219
|'2007 30th November 10:30:59 2007' 
ЗЫ один совет: никогда не используете в именах таблиц, баз данных и столбцов символы в верхнем регистре!


Re: Бан (mysql) - Ted67 - 17.03.2013

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Конвертировать дату в абсолютно любой формат может мускул.
PHP код:
SELECT Ban as unix_dateFROM_UNIXTIME(Ban'%Y %D %M %h:%i:%s %x') as formatted_date 
FROM accounts 
WHERE ip 
'*.*.*.*' 
LIMIT 1 
результатом будет:
PHP код:
unix_date|formatted_date
1196440219
|'2007 30th November 10:30:59 2007' 
ЗЫ один совет: никогда не используете в именах таблиц, баз данных и столбцов символы в верхнем регистре!
Спасибо, только не понял как использовать ._. А именно запись в бд и получение. Буду признателен за помощь.

Quote:

ЗЫ один совет: никогда не используете в именах таблиц, баз данных и столбцов символы в верхнем регистре!

Приму к сведению, не знал. А почему?


Re: Бан (mysql) - Stepashka - 18.03.2013

Quote:
Originally Posted by Ted67
Посмотреть сообщение
Спасибо, только не понял как использовать ._. А именно запись в бд и получение. Буду признателен за помощь.
а что с ней не так, это обычный символ?
Quote:
Originally Posted by Ted67
Посмотреть сообщение
Приму к сведению, не знал. А почему?
потому что не будет проблем с мультиплатформенностью.


Re: Бан (mysql) - Ted67 - 18.03.2013

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
а что с ней не так, это обычный символ?
потому что не будет проблем с мультиплатформенностью.
Хорошо, выходит я могу записать в БД кол-во секунд, после вывести это все из бд уже в формате: день.месяц.год часов:минут:секунд ?


Re: Бан (mysql) - Stepashka - 18.03.2013

Все верно.


Re: Бан (mysql) - Ted67 - 18.03.2013

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Все верно.
Хм... это значительно облегчит бан). Вот только затрудняюсь немного вывести значения:

pawn Код:
"SELECT `Ban` as 11122211, FROM_UNIXTIME(Ban, '%Y %D %M %h:%i:%s %x') as formatted_date FROM `accounts` WHERE `Name`='%s'",Name(playerid)

forward Test(p);
public Test(p)
{
new r,f;
cache_get_data(r,f);
if(r)
{
//
}
return 1;
}
Нашел вариант вывода на php но как это сделать в pawn - не знаю.

pawn Код:
$result = mysql_query("SELECT FROM_UNIXTIME(1255033470)");  
while($row=mysql_fetch_array($result))  
{  
echo "<tr>";  
echo "<td align='center' width='200'>" . $row["FROM_UNIXTIME(1255033470)"] . "</td>";  
echo "</tr>";  
}

Получится думаю я сделать запись текущего unixtime + срок в миллисекундах в бд (например в поле `ban`), при логине сравнивать, и если забанен - выдавать дату до какого числа забанен (эта дата будет в unix формате в бд).


Re: Бан (mysql) - Stepashka - 18.03.2013

PHP код:
$result mysql_query("SELECT FROM_UNIXTIME(1255033470) as date");  
while ((
$row mysql_fetch_array($result)) !== FALSE) {  
    echo 
'<tr><td align="center" width="200">' $row['date'] . '</td></tr>';  

Прочитайте внимательно про MySQL функцию FROM_UNIXTIME и вам все станет понятно.


Re: Бан (mysql) - Ted67 - 18.03.2013

Хм... пробую так, но не работает:

pawn Код:
format(SQL_MAX,300,"SELECT `BanDate` as unix_date, FROM_UNIXTIME(`BanDate`, '%Y %D %M %h:%i:%s %x') as formatted_date FROM `accounts` WHERE `Name` = '%s' LIMIT 1",Name(p));
mysql_function_query(1,SQL_MAX,true,"OnTest", "i", p);

forward OnTest(p);
public OnTest(p)
{
    new r,f;
    cache_get_data(r,f,1);
    if(r)
    {
        new time[32];
        cache_get_row(0, 34, time);
        format(STR,64,"Result: %s",time),Message(p,-1,STR);
     }
     else print("Error..");
    return 1;
}
В логе "Error..".


Re: Бан (mysql) - Stepashka - 18.03.2013

Мой телепатический модуль в отпуске. Что за ошибка?


Re: Бан (mysql) - Ted67 - 18.03.2013

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Мой телепатический модуль в отпуске. Что за ошибка?
В смысли:
PHP код:
print("Error.."); 
Хотя в базе есть аккаунт с таким именем и BanDate у него прописан.

В mysql логе:
Quote:

Passing query SELECT `BanDate` as unix_date, FROM_UNIXTIME(`BanDate`, 'Y D M 4D:: ') as formatted_date FROM `accounts` WHERE `Name` = '' LIMIT 1 | i

ProcessQueryThread(OnTest) - Query was successful. (SELECT `BanDate` as unix_date, FROM_UNIXTIME(`BanDate`, 'Y D M 4D:: ') as formatted_date FROM `accounts` WHERE `Name` = '' LIMIT 1)

ProcessQueryThread(OnTest) - Data caching enabled.

CMySQLHandler::StoreResult() - Result was stored.

CMySQLHandler::FreeResult() - Result was successfully free'd.

CMySQLHandler::ProcessQueryThread() - Data is getting passed to ->ProcessTick()

OnTest(i) - Threaded function called.

>> cache_get_data( Connection handle: 1 )

ProcessTick() - The cache has been cleared.




Re: Бан (mysql) - Frapsy - 19.03.2013

PHP код:
WHERE `Name` = '' 
Вот тут внимательнее