Добавление записи в mysql

JumPixX

Админ. CSSRUS.ru
Сообщения
94
Реакции
14
Пишу маленький скрипт по добавление steamid моих игроков в базу.
И тут проблема :( Только на половину работает...
Нужно что бы человек заходил на сервер и его SteamID добавлялся мне в базу, а если он уже есть в базе то игнорилось. (в скрипте это уже почти реализовано).

Код:
PHP:
#pragma semicolon 1

#include <sourcemod>

#define PLUGIN_VERSION "1.0"

new Handle:g_SQL = INVALID_HANDLE, bool:MYSQL,conte; 

public Plugin:myinfo =
{
	 name = "Injection",
	 description = "123",
	 author = "123",
	 version = PLUGIN_VERSION,
	 url = "123"
};

public OnPluginStart() 
{ 
	 new Handle:kv = CreateKeyValues("injection");
	 KvSetString(kv, "driver", "mysql");
	 KvSetString(kv, "host", "mysql.***.ru");
	 KvSetString(kv, "database", "injection");
	 KvSetString(kv, "user", "spawn");
	 KvSetString(kv, "pass", "f0sU7OFK");
	 KvSetString(kv, "port", "3306");
	
	 decl String:error[255];
	 g_SQL = SQL_ConnectCustom(kv, error, 255, true); 
	 CloseHandle(kv);
	 
	 new String:driver[15];
	 SQL_ReadDriver(g_SQL, driver, 15); 
	 MYSQL = StrEqual(driver, "mysql", false);
	 LogMessage("Установлено %s соединение", MYSQL ? "MYSQL" : "SQLite");
	 
	 decl String:steamid[64];
	 GetClientAuthString(client, steamid, 64);
	 
     conte = SQL_TQuery(g_SQL, SQL_DefCallback, "SELECT COUNT(*) FROM `steam` WHERE `SteamID` = '%s' LIMIT 1", steamid); 
	 
     if(conte != 0) 
  { 
     SQL_TQuery(g_SQL, SQL_DefCallback, "INSERT INTO `steam` (`SteamID`) VALUES ('%s')", steamid); 
  }
	 
}

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

Ах, да. Ошибка:
//// injection.sp
// injection.sp(38) : error 017: undefined symbol "client"
 

neatek

Участник
Сообщения
424
Реакции
225
Нужно что бы человек заходил на сервер и его SteamID добавлялся мне в базу

PHP:
public OnPluginStart()  //  <---- !!!
{ 
     ...
     decl String:steamid[64];
     GetClientAuthString(client, steamid, 64);
     
     conte = SQL_TQuery(g_SQL, SQL_DefCallback, "SELECT COUNT(*) FROM `steam` WHERE `SteamID` = '%s' LIMIT 1", steamid); 
     
     if(conte != 0) 
  { 
     SQL_TQuery(g_SQL, SQL_DefCallback, "INSERT INTO `steam` (`SteamID`) VALUES ('%s')", steamid); 
  }
     ...
}

jackie-chan-wtf.png


Ништяк у тебя событие...

Попробуй вот это - OnClientPostAdminCheck
 

JumPixX

Админ. CSSRUS.ru
Сообщения
94
Реакции
14
PHP:
public OnPluginStart()  //  <---- !!!
{ 
     ...
     decl String:steamid[64];
     GetClientAuthString(client, steamid, 64);
     
     conte = SQL_TQuery(g_SQL, SQL_DefCallback, "SELECT COUNT(*) FROM `steam` WHERE `SteamID` = '%s' LIMIT 1", steamid); 
     
     if(conte != 0) 
  { 
     SQL_TQuery(g_SQL, SQL_DefCallback, "INSERT INTO `steam` (`SteamID`) VALUES ('%s')", steamid); 
  }
     ...
}

jackie-chan-wtf.png


Ништяк у тебя событие...

Попробуй вот это - OnClientPostAdminCheck

Я знаю что я лол в этом деле :D
Вот как правильно?
 

neatek

Участник
Сообщения
424
Реакции
225
Я знаю что я лол в этом деле :D
Вот как правильно?

PHP:
#pragma semicolon 1
#include <sourcemod>

static Handle:db;

public Plugin:myinfo =
{
	name = "None",
	description = "None",
	author = "www.Neatek.ru",
	version = "0.0",
	url = "http://neatek.ru/"
};
	
public OnPluginStart() 
{ 
	ConnectDB();
}

public OnClientPostAdminCheck(client)
{
	if(0 < client <= MaxClients && !IsFakeClient(client))
	{
		// check
		decl String:steamid[64], String:query[256];
		GetClientAuthString(client, steamid, sizeof(steamid));
		Format(query, sizeof(query), "SELECT COUNT(*) FROM `steam` WHERE `SteamID` = '%s' LIMIT 1", steamid);
		SQL_TQuery(db, SQL_CheckInsert, query, client);
	}
}

public SQL_CheckInsert(Handle:owner, Handle:hndl, const String:error[], any:data)
{
	if (db == INVALID_HANDLE)
	{
		return;
	}
	
	if(SQL_GetRowCount(hndl) == 0)
	{
		// insert
		decl String:steamid[64], String:query[256];
		GetClientAuthString(data, steamid, sizeof(steamid));
		Format(query, sizeof(query), "INSERT INTO `steam` (`SteamID`) VALUES ('%s')", steamid);
		SQL_TQuery(db, SQLErrorCheckCallback, query); 
	}
}

public ConnectDB()
{
	if (SQL_CheckConfig("injection"))
	{
		decl String:Error[256];
		db = SQL_Connect("injection", true, Error, sizeof(Error));

		if (db == INVALID_HANDLE)
		{
			LogError("Failed to connect to database: %s", Error);
		}
	}
	else
		LogError("Database.cfg missing 'injection' entry!");
}

public SQLErrorCheckCallback(Handle:owner, Handle:hndl, const String:error[], any:data)
{
	if (db == INVALID_HANDLE)
	{
		return;
	}

	if(!StrEqual("", error))
	{
		LogError("SQL Error: %s", error);
	}
}

Вот так, деточка, правильно...
Что нужно сказать дяде? :-D

в databases.cfg добавляешь пункт

"injection"
{
...
}
 

JumPixX

Админ. CSSRUS.ru
Сообщения
94
Реакции
14
PHP:
#pragma semicolon 1
#include <sourcemod>

static Handle:db;

public Plugin:myinfo =
{
	name = "None",
	description = "None",
	author = "www.Neatek.ru",
	version = "0.0",
	url = "http://neatek.ru/"
};
	
public OnPluginStart() 
{ 
	ConnectDB();
}

public OnClientPostAdminCheck(client)
{
	if(0 < client <= MaxClients && !IsFakeClient(client))
	{
		// check
		decl String:steamid[64], String:query[256];
		GetClientAuthString(client, steamid, sizeof(steamid));
		Format(query, sizeof(query), "SELECT COUNT(*) FROM `steam` WHERE `SteamID` = '%s' LIMIT 1", steamid);
		SQL_TQuery(db, SQL_CheckInsert, query, client);
	}
}

public SQL_CheckInsert(Handle:owner, Handle:hndl, const String:error[], any:data)
{
	if (db == INVALID_HANDLE)
	{
		return;
	}
	
	if(SQL_GetRowCount(hndl) == 0)
	{
		// insert
		decl String:steamid[64], String:query[256];
		GetClientAuthString(data, steamid, sizeof(steamid));
		Format(query, sizeof(query), "INSERT INTO `steam` (`SteamID`) VALUES ('%s')", steamid);
		SQL_TQuery(db, SQLErrorCheckCallback, query); 
	}
}

public ConnectDB()
{
	if (SQL_CheckConfig("injection"))
	{
		decl String:Error[256];
		db = SQL_Connect("injection", true, Error, sizeof(Error));

		if (db == INVALID_HANDLE)
		{
			LogError("Failed to connect to database: %s", Error);
		}
	}
	else
		LogError("Database.cfg missing 'injection' entry!");
}

public SQLErrorCheckCallback(Handle:owner, Handle:hndl, const String:error[], any:data)
{
	if (db == INVALID_HANDLE)
	{
		return;
	}

	if(!StrEqual("", error))
	{
		LogError("SQL Error: %s", error);
	}
}

Вот так, деточка, правильно...
Что нужно сказать дяде? :-D

в databases.cfg добавляешь пункт

"injection"
{
...
}

Спасибо!!!! :3
 

maverick1660

Проект DeathLine.ru
Сообщения
187
Реакции
93
Neatek что это?
PHP:
public OnClientPostAdminCheck(client)
{
    if(0 < client <= MaxClients && !IsFakeClient(client))
    {
        // check
        decl String:steamid[64], String:query[256];
        GetClientAuthString(client, steamid, sizeof(steamid));
        Format(query, sizeof(query), "SELECT COUNT(*) FROM `steam` WHERE `SteamID` = '%s' LIMIT 1", steamid);
        SQL_TQuery(db, SQL_CheckInsert, query, client);
    }
}
Разве OnClientPostAdminCheck это не проверка админ или нет?
Что этой функцией проверяешь? :dntknw:
 

semjef

semjef.ru
Сообщения
993
Реакции
444
maverick1660, это пост собыдие проверки на то есть админка у игрока или нет, до него проверять админку смысла нет, в данном случае впринципе можно использовать и OnClientPutInServer
 

JumPixX

Админ. CSSRUS.ru
Сообщения
94
Реакции
14
JumPixX, не имеет значения

вот только не работает :(
База пуста.... Тоесть одна запись со старой версии

Добавлено через 2 минуты

Скрипт:
PHP:
#pragma semicolon 1
#include <sourcemod>

static Handle:db;

public Plugin:myinfo =
{
    name = "injection",
    description = "None",
    author = "123",
    version = "1.0",
    url = "123"
};
    
public OnPluginStart() 
{ 
    ConnectDB();
}

public OnClientPutInServer(client)
{
    if(0 < client <= MaxClients && !IsFakeClient(client))
    {
        // check
        decl String:steamid[64], String:query[256];
        GetClientAuthString(client, steamid, sizeof(steamid));
        Format(query, sizeof(query), "SELECT COUNT(*) FROM `steam` WHERE `SteamID` = '%s' LIMIT 1", steamid);
        SQL_TQuery(db, SQL_CheckInsert, query, client);
    }
}

public SQL_CheckInsert(Handle:owner, Handle:hndl, const String:error[], any:data)
{
    if (db == INVALID_HANDLE)
    {
        return;
    }
    
    if(SQL_GetRowCount(hndl) == 0)
    {
        // insert
        decl String:steamid[64], String:query[256];
        GetClientAuthString(data, steamid, sizeof(steamid));
        Format(query, sizeof(query), "INSERT INTO `steam` (`SteamID`) VALUES ('%s')", steamid);
        SQL_TQuery(db, SQLErrorCheckCallback, query); 
    }
}

public ConnectDB()
{
    if (SQL_CheckConfig("injection"))
    {
        new Handle:kv = CreateKeyValues("injection");
        KvSetString(kv, "driver", "mysql");
        KvSetString(kv, "host", "***hub.ru");
        KvSetString(kv, "database", "injection");
        KvSetString(kv, "user", "spawn");
        KvSetString(kv, "pass", "U7OFK");
        KvSetString(kv, "port", "3306");
	
        decl String:Error[255];
        db = SQL_ConnectCustom(kv, Error, 255, true); 
        CloseHandle(kv);

        if (db == INVALID_HANDLE)
        {
            LogError("Failed to connect to database: %s", Error);
        }
    }
    else
        LogError("Database.cfg missing 'injection' entry!");
}

public SQLErrorCheckCallback(Handle:owner, Handle:hndl, const String:error[], any:data)
{
    if (db == INVALID_HANDLE)
    {
        return;
    }

    if(!StrEqual("", error))
    {
        LogError("SQL Error: %s", error);
    }
}

Авторизация ничего не меняет, хотя с прошлой тоже самое было.
 
Последнее редактирование:

0wn3r

Участник
Сообщения
184
Реакции
53
Замени OnClientPutInServer на public OnClientAuthorized(client, const String:auth[])
decl String:steamid[64];
GetClientAuthString(client, steamid, sizeof(steamid));

Естественно не понадобиться.

И если ты делаешь ConnectCustom, то (SQL_CheckConfig("injection")) тебе не нужно, это и причина того что ничего не вписываеться.
Либо делай это как все нормальные люди через databases.cfg

Такой запрос не нужен: SELECT COUNT(*) FROM `steam` WHERE `SteamID` = '%s' LIMIT 1
Хватит такого SELECT * FROM `steam` WHERE `SteamID` = '%s'
 
Последнее редактирование:

JumPixX

Админ. CSSRUS.ru
Сообщения
94
Реакции
14
Замени OnClientPutInServer на public OnClientAuthorized(client, const String:auth[])
decl String:steamid[64];
GetClientAuthString(client, steamid, sizeof(steamid));

Естественно не понадобиться.

И если ты делаешь ConnectCustom, то (SQL_CheckConfig("injection")) тебе не нужно, это и причина того что ничего не вписываеться.
Либо делай это как все нормальные люди через databases.cfg
Вот только все равно тоже самое :(

------

Тут разницы нету :(
Все равно не работает.
 

0wn3r

Участник
Сообщения
184
Реакции
53
Посмотри ошибки. Они туда добавлены не просто так.
 

JumPixX

Админ. CSSRUS.ru
Сообщения
94
Реакции
14
Посмотри ошибки. Они туда добавлены не просто так.

Ура заработало!!!!! Я чуток код переписал и сделал логирование в консоль сервера....
Так и правда оказался не правильный запрос mysql.
Старый запрос был для моей первой версии, для нее он был правильный. А тут я не сильно обратил внимание на "SQL_GetRowCount(hndl) == 0"
 

HooLIGUN

MatchMaking CS:S / RGMIX.ru
Сообщения
1,062
Реакции
267
Ура заработало!!!!! Я чуток код переписал и сделал логирование в консоль сервера....
Так и правда оказался не правильный запрос mysql.
Старый запрос был для моей первой версии, для нее он был правильный. А тут я не сильно обратил внимание на "SQL_GetRowCount(hndl) == 0"
Выложи рабочий код (если не трудно) , может пригодится данной плагин
 

JumPixX

Админ. CSSRUS.ru
Сообщения
94
Реакции
14
Выложи рабочий код (если не трудно) , может пригодится данной плагин

PHP:
#pragma semicolon 1
#include <sourcemod>

static Handle:db;

public Plugin:myinfo =
{
    name = "None", 
    description = "None", 
    author = "www.Neatek.ru", 
    version = "0.0", 
    url = "http://neatek.ru/" 
};
    
public OnPluginStart() 
{ 
    ConnectDB();
}

public OnClientAuthorized(client)
{
    if(0 < client <= MaxClients && !IsFakeClient(client))
    {
        // check
        decl String:steamid[64], String:query[256];
        GetClientAuthString(client, steamid, sizeof(steamid));
        PrintToServer("SteamID: %s", steamid);
        Format(query, sizeof(query), "SELECT * FROM `steam` WHERE `SteamID` = '%s'", steamid);
        SQL_TQuery(db, SQL_CheckInsert, query, client);
    }
}

public SQL_CheckInsert(Handle:owner, Handle:hndl, const String:error[], any:data)
{
    if (db == INVALID_HANDLE)
    {
        return;
    }
    
    if(SQL_GetRowCount(hndl) == 0)
    {
        // insert
        decl String:steamid[64], String:query[256];
        GetClientAuthString(data, steamid, sizeof(steamid));
        Format(query, sizeof(query), "INSERT INTO `steam` (`SteamID`) VALUES ('%s')", steamid);
        SQL_TQuery(db, SQLErrorCheckCallback, query); 
    }
}

public ConnectDB()
{
        new Handle:kv = CreateKeyValues("injection");
        KvSetString(kv, "driver", "mysql");
        KvSetString(kv, "host", "rhub.ru");
        KvSetString(kv, "database", "injection");
        KvSetString(kv, "user", "spawn");
        KvSetString(kv, "pass", "f0sU7OFK");
        KvSetString(kv, "port", "3306");
	
        decl String:Error[255];
        db = SQL_ConnectCustom(kv, Error, 255, true); 
        CloseHandle(kv);

        if (db == INVALID_HANDLE)
        {
            LogError("Failed to connect to database: %s", Error);
        }
}

public SQLErrorCheckCallback(Handle:owner, Handle:hndl, const String:error[], any:data)
{
    if (db == INVALID_HANDLE)
    {
        return;
    }

    if(!StrEqual("", error))
    {
        LogError("SQL Error: %s", error);
    }
}
 
Последнее редактирование:

0wn3r

Участник
Сообщения
184
Реакции
53
PHP:
public OnClientAuthorized(client, const String:auth[])
{
    if(0 < client <= MaxClients && !IsFakeClient(client))
    {
        // check
        decl String:query[256];
        PrintToServer("SteamID: %s", auth);
        FormatEx(query, sizeof(query), "SELECT * FROM `steam` WHERE `SteamID` = '%s'", auth);
        SQL_TQuery(db, SQL_CheckInsert, query, client);
    }
}
....

И в threaded запросах лучше использовать такую проверку на ошибки:
PHP:
public SQLErrorCheckCallback(Handle:owner, Handle:hndl, const String:error[], any:data)
{
    if (owner == INVALID_HANDLE)
    {
        LogError("SQL Error (owner): %s", error);
        return;
    }
    // или
    if (hndl == INVALID_HANDLE)
    {
        LogError("SQL Error(hndl): %s", error);
        return;
    }
    // чаще используеться hndl поскольку это и есть наш запрос
    // а onwer это sql соедниение
}
 

maverick1660

Проект DeathLine.ru
Сообщения
187
Реакции
93
maverick1660, это пост собыдие проверки на то есть админка у игрока или нет, до него проверять админку смысла нет, в данном случае впринципе можно использовать и OnClientPutInServer

Возвращаясь к моему вопросу в посте 6. Так а зачем в данном плагине вообще проверять админ игрок или нет? Здесь нет ни чего связанного с админ правами.
 

0wn3r

Участник
Сообщения
184
Реакции
53
/**
* Called when a client is entering the game.
*
* Whether a client has a steamid is undefined until OnClientAuthorized
* is called, which may occur either before or after OnClientPutInServer.
* Similarly, use OnClientPostAdminCheck() if you need to verify whether
* connecting players are admins.
*
* GetClientCount() will include clients as they are passed through this
* function, as clients are already in game at this point.
*
* @param client Client index.
* @noreturn
*/
forward OnClientPutInServer(client);

/**
* Called once a client is authorized and fully in-game, and
* after all post-connection authorizations have been performed.
*
* This callback is gauranteed to occur on all clients, and always
* after each OnClientPutInServer() call.
*
* @param client Client index.
* @noreturn
*/
forward OnClientPostAdminCheck(client);

/**
* Called when a client receives a Steam ID. The state of a client's
* authorization as an admin is not guaranteed here. Use
* OnClientPostAdminCheck() if you need a client's admin status.
*
* This is called by bots, but the ID will be "BOT".
*
* @param client Client index.
* @param auth Client auth string.
* @noreturn
*/
forward OnClientAuthorized(client, const String:auth[]);

OnClientPostAdminCheck используеться для того что с полной точностью получить стим айди клиента и быть увереным в том админ ли клиент, поскольку OnClientPutInServer может и не дать этого.

Зачем ты уперся в то что данная функция проверяет админ ли игрок или нет, я не понимаю.

Иногда полезно зайти в папку include и почитать немного.
 

maverick1660

Проект DeathLine.ru
Сообщения
187
Реакции
93
да я не уперся друг, хочю просто разобраться. я ни к чему не придираюсь это просто вопросы, на которые я не знаю ответы ;)
 
Сверху Снизу