Помогите усложнить запрос

egorzenit

Участник
Сообщения
20
Реакции
0
Здравствуйте..
помогите пожалуйста с mysql плагином для сервера. мне нужно сделать следующее:
Нужно при подключении проверять по базе есть ли стим ид в ней,если нету то кикать,если есть то смотреть на стоящюю рядом графу status: если в ней указан 0 то изменять его значение на 1. а если уже стоит 1 то кикать опять же.
кто сможет помочь с таким вроде как не сложным заданием готов даже финансово отблагодарить
 

_wS_

Участник
Сообщения
383
Реакции
760
Re: Помогите усложнить запрос.

g_SQL - Handle: sql подключения (глобальная переменная)

`my_tab` - таблица
`status` - поле (значение: 1/0)
`my_steamid` - поле (значение: стим игрока)

PHP:
public OnClientPutInServer(client)
{
    // игрок вошел, делаем запрос
    /////////////////////////////////////////////////////

    // Если это бот, стоп
    if (IsFakeClient(client)) return;

    // Если не удалось стим получить (wtf..), стоп
    decl String:steamid[28];
    if (!GetClientAuthString(client, steamid, 28))
    {
        KickClient(client, "Не удалось определить ваш SteamID (1)");
        return;
    }

    decl String:zapros[125];
    Format(zapros, 125, "SELECT `status` FROM `my_tab` WHERE `my_steamid` = '%s' LIMIT 1", steamid);
    SQL_TQuery(g_SQL, wS_OnClientPutInServer_CallBack, zapros, GetClientUserId(client));
}

public wS_OnClientPutInServer_CallBack(Handle:owner, Handle:result, const String:error[], any:userid)
{
    // игрок успел выйти, стоп (wtf)
    new client = GetClientOfUserId(userid);
    if (client < 1) return;

    if (result == INVALID_HANDLE)
    {
        LogError(error); KickClient(client, "wtf, ошибка в SQL запросе");
        return;
    }

    if (!SQL_FetchRow(result))
    {
        KickClient(client, "Вашего SteamID нет в таблице 'my_tab'");
        return;
    }

    if (SQL_FetchInt(result, 0) == 1)
    {
        KickClient(client, "Вы отключены (status = 1)");
        return;
    }

    // Разрешаем играть и обновляем status на 1
    decl String:steamid[28];
    if (!GetClientAuthString(client, steamid, 28))
    {
        KickClient(client, "Не удалось определить ваш SteamID (2)");
        return;
    }

    decl String:zapros[125];
    Format(zapros, 125, "UPDATE `my_tab` SET `status` = 1 WHERE `my_steamid` = '%s'", steamid);
    SQL_TQuery(g_SQL, SQL_CallBack, zapros);
}

public SQL_CallBack(Handle:owner, Handle:result, const String:error[], any:data)
{
    if (result == INVALID_HANDLE) LogError(error);
}
 
Последнее редактирование:

egorzenit

Участник
Сообщения
20
Реакции
0
Re: Помогите усложнить запрос.

Воспользовался твоей же функцией подключения которая у тебя на сайте написана получаю ошибку следующего типа:
/groups/sourcemod/upload_tmp/textwiwij2.sp(83) : error 100: function prototypes do not match

1 Error.
Подскажи что не так?
PHP:
#include <sourcemod> 

new Handle:g_SQL = INVALID_HANDLE, bool:MYSQL; 

public OnPluginStart() 
{ 
     if (!SQL_CheckConfig("fastmix")) 
     { 
         SetFailState("Секция \"fastmix\" не найдена в databases.cfg"); 
         return; 
     } 

     decl String:error[256]; 
     g_SQL = SQL_Connect("fastmix", true, error, 256); 
     if (g_SQL == INVALID_HANDLE) 
     { 
         LogError(error); 
         SetFailState("Не удалось установить SQL соединение"); 
         return; 
     } 

     // тип соединения (mysql или sqlite) 
     new String:driver[15]; SQL_ReadDriver(g_SQL, driver, 15); 
     MYSQL = StrEqual(driver, "mysql", false); 
     LogMessage("Установлено %s соединение", MYSQL ? "MYSQL" : "SQLite"); 
     }
     
public OnClientPutInServer(client) 
{ 
    // игрок вошел, делаем запрос 
    ///////////////////////////////////////////////////// 

    // Если это бот, стоп 
    if (IsFakeClient(client)) return; 

    // Если не удалось стим получить (wtf..), стоп 
    decl String:steamid[28]; 
    if (!GetClientAuthString(client, steamid, 28)) 
    { 
        KickClient(client, "Не удалось определить ваш SteamID (1)"); 
        return; 
    } 

    decl String:zapros[125]; 
    Format(zapros, 125, "SELECT `status` FROM `my_tab` WHERE `my_steamid` = '%s' LIMIT 1", steamid); 
    SQL_TQuery(g_SQL, wS_OnClientPutInServer_CallBack, zapros, GetClientUserId(client)); 
} 

public wS_OnClientPutInServer_CallBack(Handle:owner, Handle:result, const String:error[], any:userid) 
{ 
    // игрок успел выйти, стоп (wtf) 
    new client = GetClientOfUserId(userid); 
    if (client < 1) return; 

    if (result == INVALID_HANDLE) 
    { 
        LogError(error); KickClient(client, "wtf, ошибка в SQL запросе"); 
        return; 
    } 

    if (!SQL_FetchRow(result)) 
    { 
        KickClient(client, "Вашего SteamID нет в таблице 'my_tab'"); 
        return; 
    } 

    if (SQL_FetchInt(result, 0) == 1) 
    { 
        KickClient(client, "Вы отключены (status = 1)"); 
        return; 
    } 

    // Разрешаем играть и обновляем status на 1 
    decl String:steamid[28]; 
    if (!GetClientAuthString(client, steamid, 28)) 
    { 
        KickClient(client, "Не удалось определить ваш SteamID (2)"); 
        return; 
    } 

    decl String:zapros[125]; 
    Format(zapros, 125, "UPDATE `my_tab` SET `status` = 1 WHERE `my_steamid` = '%s'", steamid); 
    SQL_TQuery(g_SQL, SQL_CallBack, zapros); 
} 

public SQL_CallBack(Handle:owner, Handle:result, const String:error[]) 
{ 
    if (result == INVALID_HANDLE) LogError(error); 
}
 

_wS_

Участник
Сообщения
383
Реакции
760
Было так:

PHP:
public SQL_CallBack(Handle:owner, Handle:result, const String:error[])
{
    if (result == INVALID_HANDLE) LogError(error);
}
Нужно так:

PHP:
public SQL_CallBack(Handle:owner, Handle:result, const String:error[], any:data)
{
    if (result == INVALID_HANDLE) LogError(error);
}

Я недосмотрел, sorry :(
 

Scarface_slv

Участник
Сообщения
222
Реакции
47
Ну хоть тут можно понять как получить что то с БД, а то подключаться умею максимум...=)
 

egorzenit

Участник
Сообщения
20
Реакции
0
Апаю тему дабы заного не создавать
помогите пожалуйста добавить событие:
когда игрок отключается менять значение status на 0 вновь
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
PHP:
public OnClientDisconnect(client)
{
	decl String:SteamID[40];
	if (GetClientAuthString(client, SteamID, sizeof(SteamID)))
	{
		decl String:query[256];
		Format(query, sizeof(query), "UPDATE my_tab SET status = 0 WHERE my_steamid = '%s'", SteamID);

		if (!SQL_FastQuery(g_SQL, query))
		{
			if (SQL_GetError(g_SQL, query, sizeof(query)))
			{
				LogError("Ошибка (%s)", query);
			}
		}
	}
}
 

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
The End Is Near..., FastQuery лучше не использовать, при отключении игроков и не локальном соедиинении с БД сервер будет подлагивать, лучше TQuery и сопутствующие ему Callback'и
 

FrozDark

Участник
Сообщения
1,769
Реакции
2,050
The End Is Near..., FastQuery лучше не использовать, при отключении игроков и не локальном соедиинении с БД сервер будет подлагивать, лучше TQuery и сопутствующие ему Callback'и

FastQuery - лишь возвращает true если запрос успешно отправлен ну false при не успешном соответственно. А Query отправляет запрос и ожидает результата, если между бд и сервером есть существенная задержка, то сервер просто зависнет на одном фрейме до возвращения результата
 

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Пардон, мне казалось что FastQuery тоже ждет пока запрос выполнится, т.е. не поточно работает (под "запрос успешно отправлен" мне казалось что именно SQL-сервер его принял, но без разбора ответа, т.е. все равно техническое ожидание принятия запроса сервером)
 
Сверху Снизу