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

maverick1660

Проект DeathLine.ru
Сообщения
187
Реакции
93
semjef, привет. Я уже об читался docs.sourcemod.net и много возникает вопросов в исходниках, написанных нашими российскими друзьями, а открываешь забугорные исходники и в чем то более менее хоть начинаешь разбираться.

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

И если честно я так и не понял зачем в задачах JumPixX'a проверять админ игрок или нет, даже после ответа 0wn3r

Если тебе semjef не трудно то расскажи в пару словах логику простыми словами данной проверки в данном случае просто на уровне логики?
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
maverick1660
Проверка на администратора идет потом (INVALID_HANDLE; != or == вроде). Сначала получаем SteamID, ведь чтобы добавить идентификатор нужно знать SteamID
 

JumPixX

Админ. CSSRUS.ru
Сообщения
94
Реакции
14
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
Ну тогда почему JumPixX'a в итоге использовал
PHP:
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); 
    } 
}
вместо
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);
    }
}
 

JumPixX

Админ. CSSRUS.ru
Сообщения
94
Реакции
14
Ну тогда почему JumPixX'a в итоге использовал
PHP:
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); 
    } 
}
вместо
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);
    }
}

Потому что у меня свой плагин есть по работе с админками и магазином buy.powerhub.ru. И у меня там сделано через OnClientAuthorized, и уже пол года нормально работает.
 

0wn3r

Участник
Сообщения
184
Реакции
53
Ты ее даже используешь не правильно.
 

JumPixX

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

А с этим что сделать?

PHP:
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); 
    }
}
 

_wS_

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

Я попробую объяснить, чтобы ты понял (если еще не понял).
OnClientPostAdminCheck вызывается для каждого игрока, после того, как он:

- был авторизован (OnClientAuthorized)
- и зашел на сервер (OnClientPutInServer)

PHP:
public OnClientPostAdminCheck(client)
{
    // это не значит, что client админ
    // но именно с этого момента можно точно узнать, есть у него права или нет:
    if (GetUserAdmin(client) != INVALID_ADMIN_ID)
    {
        // права есть
    }
    else
    {
        // прав нет
    }
}
Если бы ты делал проверку if (GetUserAdmin(client) != INVALID_ADMIN_ID) в OnClientAuthorized или в OnClientPutInServer - возвращало бы всегда INVALID_ADMIN_ID (нет прав), т.к. это слишком рано, чтобы проверять, есть ли у него права. Так что событие OnClientPostAdminCheck гарантирует, что все флаги доступа уже были установлены игроку (если они у него есть, admins.cfg, admins_simple.ini).
 

neatek

Участник
Сообщения
424
Реакции
225
Привычка :(
Я все равно на сервере стараюсь плагины маскировать.
-------------
Изменил на твои :)
Это не честно. Люди сидели парились, писали, а если каждый будет делать как ты?
Какой толк вообще что-то делать для людей, если люди не будут тебя уважать хотя бы в пару строк...

вот поэтому я в паблик ничего и не выкладываю...
 

JumPixX

Админ. CSSRUS.ru
Сообщения
94
Реакции
14
Это не честно. Люди сидели парились, писали, а если каждый будет делать как ты?
Какой толк вообще что-то делать для людей, если люди не будут тебя уважать хотя бы в пару строк...

вот поэтому я в паблик ничего и не выкладываю...

Я вернул... Я просто не люблю когда школьники копируют список плагинов, а потом копии штампуют.
 

neatek

Участник
Сообщения
424
Реакции
225
Такой запрос не нужен: SELECT COUNT(*) FROM `steam` WHERE `SteamID` = '%s' LIMIT 1
Хватит такого SELECT * FROM `steam` WHERE `SteamID` = '%s'
0wn3r, Я считаю что это не особо правильно... Так как мы делаем проверку присутствует ли в базе игрок или нет...
А отсылать обратно на сервер список всех игроков которые в базе это будет жирно... я бы вообще сделал что-то вроде этого:
C-подобный:
SELECT `SteamID` FROM `steam` WHERE `SteamID` = '%s' LIMIT 1
чтобы он не считал всех в базе... а просто взял 1 ячейку и вернул...

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

к примеру взять замену OnClientPostAdminCheck(client) на OnClientPutInServer(client)
конечно база будет пустая, wS тебе объяснил...

maverick1660, OnClientPostAdminCheck(client) это не проверка на админ или нет, это событие
пост проверки флагов и.т.д клиента, как сказал semjef.
 
Сверху Снизу