[Sourcepawn] mysql

semjef

semjef.ru
Сообщения
993
Реакции
444
сейчас пишу плагин, есть коннект с базой mysql.

как сделать чтоб шла проверка, есть steamid игрока в таблице или нет?)

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

criminalist

Участник
Сообщения
194
Реакции
18
сейчас пишу плагин, есть коннект с базой mysql.

как сделать чтоб шла проверка, есть steamid игрока в таблице или нет?)

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

В чем суть вашего плагина ? у меня есть плагин который проверяет steam ID игрока если его нету в базе тупо не пускает его на сервер.
 

maza511

Участник
Сообщения
882
Реакции
407
как сделать чтоб шла проверка, есть steamid игрока в таблице или нет?)
Записываешь в базу стимID, потом смотришь есть там или нет. Разве не так?

Лучше было бы чтоб при создании темы указывали примерно свои знания.
А то что толку я тебе сейчас напишу ты все равно не поймешь.
 

semjef

semjef.ru
Сообщения
993
Реакции
444
я не допираю как это изобразить в коде...

когда в консоль пишется команда color, должно проверять, есть человек в базе или нет, если нет то выдаёт сообщение, написано всё кроме вот этого if
 

maza511

Участник
Сообщения
882
Реакции
407
PHP:
	Format(query, sizeof(query), "SELECT * FROM 'Nametable' WHERE steamid ='%s'", steamId);        
	new Handle:result = SQL_Query(DB, query);
	if(!SQL_FetchRow(result)) {   // не нашел ни одной строки
		// ....
	}
 

semjef

semjef.ru
Сообщения
993
Реакции
444
пререпутал(((

как посмотреть что есть строка?
 

semjef

semjef.ru
Сообщения
993
Реакции
444
на что?

или просто поменять if и else, скажем так))
 

criminalist

Участник
Сообщения
194
Реакции
18
PHP:
CheckSteamID(userid, const String:auth[])
{
    decl String:query[255];
    Format(query, sizeof(query), "SELECT value FROM ws_user_gameacc WHERE value = '%s'", auth);
    SQL_TQuery(hDatabase, T_CheckSteamID, query, userid)
}

PHP:
#include <sourcemod>

///*****************************************************************
//*                      BASE INFORMATION                          * 
//SELECT value FROM ws_user_gameacc WHERE value =
//******************************************************************/


new Handle:hDatabase = INVALID_HANDLE;

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

public OnPluginStart()
{
    StartSQL()
}

public OnClientAuthorized(client)
{
    decl String:auth[32];
    GetClientAuthString(client, auth, sizeof(auth));

    CheckSteamID(client, auth)
}

public GotDatabase(Handle:owner, Handle:hndl, const String:error[], any:data)
{
    if (hndl == INVALID_HANDLE)
    {
        LogError("Database failure: %s", error);
    }
    else
    {
        hDatabase = hndl;
    }
}

public T_CheckSteamID(Handle:owner, Handle:hndl, const String:error[], any:client)
{
    /* Make sure the client didn't disconnect while the thread was running */
    if (!IsClientConnected(client))
    {
        return;
    }

	
    if (hndl == INVALID_HANDLE)
    {
        LogError("Query failed! %s", error);
        KickClient(client, "Авторизация провалена, пожалуйста обратитесь к Администратору, на сайте www.exeplay.ru");
    }
    else if (!SQL_GetRowCount(hndl))
    {
        KickClient(client, "Для игры на сервере вы должны пройти регистрацию и ввести SteamID на сайте www.exeplay.ru");
    }
}

StartSQL()
{
    SQL_TConnect(GotDatabase);
}

CheckSteamID(userid, const String:auth[])
{
    decl String:query[255];
    Format(query, sizeof(query), "SELECT value FROM ws_user_gameacc WHERE value = '%s'", auth);
    SQL_TQuery(hDatabase, T_CheckSteamID, query, userid)
}
Полностью скрипт
 

semjef

semjef.ru
Сообщения
993
Реакции
444
круто кстати, спасибо, пригодится)

Добавлено через 34 минуты
L 11/12/2011 - 22:28:10: [SM] Native "SQL_FetchRow" reported: Invalid query Handle 0 (error: 4)
L 11/12/2011 - 22:28:10: [SM] Displaying call stack trace for plugin "aura_db.smx":
L 11/12/2011 - 22:28:10: [SM] [0] Line 105, aura_db.sp::Command_Color()

why!?

public Action:Command_Color(client, args)
{
if (args != 4)
{
PrintToConsole(client, "Incorrect usage! Usage: glow_color r g b a, where r g b - color, a - alpha.");
return Plugin_Handled;
}
else
{
decl String:query[255];
new String:SteamId[64];
GetClientAuthString(client, SteamId, sizeof(SteamId));
Format(query, sizeof(query), "SELECT * FROM 'steamid' WHERE steamid ='%s'", SteamId);
new Handle:result = SQL_Query(g_hDb, query);
if(SQL_FetchRow(result)) // нашел то...
{
new String:Arg1[32], String:Arg2[32], String:Arg3[32], String:Arg4[32];
GetCmdArg(1, g_fPlayercolorr, sizeof(Arg1));
GetCmdArg(2, g_fPlayercolorg, sizeof(Arg2));
GetCmdArg(3, g_fPlayercolorg, sizeof(Arg3));
GetCmdArg(4, g_fPlayeralpha, sizeof(Arg4));
decl String:szSteamId[32];
GetClientAuthString(client, szSteamId, 32);


decl String:szalpha[38];
decl String:szcolorr[38];
decl String:szcolorg[38];
decl String:szcolorb[38];


//заносим цвета в буфер
Format(szalpha, 38, "%f",g_fPlayeralpha);
Format(szcolorr, 38, "%f",g_fPlayercolorr);
Format(szcolorg, 38, "%f",g_fPlayercolorg);
Format(szcolorb, 38, "%f",g_fPlayercolorb);

//обновляем в базе
db_updatePlayerColor(client, szalpha, szcolorr, szcolorg, szcolorb);

}
else
{
PrintToChat(client, "%t","glow_cannot",LIGHTGREEN,YELLOW);
return Plugin_Handled;
}
}
return Plugin_Handled;

}
 
Последнее редактирование:

semjef

semjef.ru
Сообщения
993
Реакции
444
надеюсь последний вопрос:

как вытащить значение из базы и присвоить его переменной?
 

S1deX

Скриптер ;)
Сообщения
129
Реакции
204
PHP:
//запрос на сервер
//hndl - Handle запроса
if (SQL_FetchRow(hndl)) {
 new intvalue = SQL_FetchInt(hndl, 0);
 new Float:floatvalue = SQL_FetchFloat(hndl, 1);
 decl String:stringvalue[64];
 SQL_FetchString(hndl, 2, stringvalue, sizeof(stringvalue));
}
CloseHandle(hndl);
 

semjef

semjef.ru
Сообщения
993
Реакции
444
извиняюсь но не понял((

вот пример что есть сейчас:
п.с. плагин ауры S1deX))
ReadColor(String:SteamId[])
{
new color[4];
new r, g, b, a;
new String:file[255];
BuildPath(Path_SM, file, 255, "configs/aura/steamid.txt");
new Handle:kv = CreateKeyValues("SteamId");
FileToKeyValues(kv, file);
KvJumpToKey(kv, SteamId);
r = KvGetNum(kv, "r");
g = KvGetNum(kv, "g");
b = KvGetNum(kv, "b");
a = KvGetNum(kv, "a");
CloseHandle(kv);
color[0] = r;
color[1] = g;
color[2] = b;
color[3] = a;
return color;
}

нужно чтоб из таблицы player брались значения которые напротив steamid в строке: colorr, colorg, colorb, alpha и соответственно присваивались к r, g, b, a)

напишите пожалуйста
 

S1deX

Скриптер ;)
Сообщения
129
Реакции
204
Ах, это еще и мое творение. Ну это существо просто умоляет об оптимизации. Открывать файл при каждом запросе - ужас, о чем я в тот момент думал? Намного удобнее, к примеру, парсить файл при старте карты, сохраняя массивы со значениями уникальных игроков в Trie, а уже при коннекте считывать инфу из Trie. Ну это так, лирика, а ответ на конкретно поставленный вопрос примерно таков:
PHP:
ReadColor(String:SteamId[])
 {
 new color[4];
 new r, g, b, a;
 new String:file[255];
 new String:query[512];
 Format(query, sizeof(query), "SELECT colorr, colorg, colorb, alpha FROM table_name WHERE steamid='%s'", SteamId);
 new Handle:hquery = SQL_Query(g_hSQLConnectionHandle, query);
 if (hquery == INVALID_HANDLE) return;
 if (SQL_FetchRow(hquery)) {
  r = SQL_FetchInt(hquery, 0);
  g = SQL_FetchInt(hquery, 1);
  b = SQL_FetchInt(hquery, 2);
  a = SQL_FetchInt(hquery, 3);
 }
 CloseHandle(hquery);
 color[0] = r;
 color[1] = g;
 color[2] = b;
 color[3] = a;
 return color;
 }
 

tooshkan4uk

Участник
Сообщения
455
Реакции
446
Ну раз пошла такая пьянка, то объясните, как создавать mysql таблицу с помощью SourcePawn,а также как обновлять значение строки.
Заранее спасибо!
 

S1deX

Скриптер ;)
Сообщения
129
Реакции
204
как и в обычных пхп - составляем запрос (CREATE TABLE IF NOT EXISTS trololo (список полей) PRIMARY KEY и т.д. ну или обновить значение - UPDATE table_name SET field_name = 1 WHERE field_name2 = 'yeah') и отправляем его как обычный скуль запрос. Только разница в том, что если уже использовать не потоковые (threaded) запросы, то в таких случаях лучше юзать SQL_FastQuery (http://docs.sourcemod.net/api/index.php?fastload=show&id=338&), который не возвращает хэндл запроса.
 

S1deX

Скриптер ;)
Сообщения
129
Реакции
204
Ну в вики довольно скупо описано взаимодействие с бд, так что примерно так:
PHP:
new Handle:g_hSQLConnection;
OnPluginStart()
{
 decl String:error[256];
 g_hSQLConnection = SQL_Connect("default", true, error, sizeof(error));
 if (g_hSQLConnection == INVALID_HANDLE)
  SetFailState(error);

 new String:query[] = "CREATE TABLE IF NOT EXISTS test ( \
                    id INT(4) NOT NULL , \
                    key INT(4) NOT NULL , \
                 PRIMARY KEY (id) ) \
                 ENGINE = InnoDB;";
 if (!SQL_FastQuery(g_hSQLConnection, query))
  SetFailState("fail :(");

 new String:query2[] = "INSERT INTO test (key) VALUES (42)";
 if (!SQL_FastQuery(g_hSQLConnection, query2))
  SetFailState("fail :(");

 new String:query3[] = "UPDATE test SET key = 21 WHERE key = 42";
 if (!SQL_FastQuery(g_hSQLConnection, query3))
  SetFailState("fail :(");
}
 
Сверху Снизу