Вопросы

rediska
Освоившийся

Я пишу систему авторизации, и у меня такая ошибка:

error 035: argument type mismatch (argument 1)

Жалуется на эту строчку:

mysql_tquery(inputtext, player_info[playerid][PASSWORD], checkpass, 32);

И сам код авторизации:

Спойлер

 


case DLG_LOG:
        {
            if(response)
            {
                new checkpass[32];
                mysql_tquery(inputtext, player_info[playerid][PASSWORD], checkpass, 32);
                if(strcmp(player_info[playerid][PASSWORD], checkpass, false, 32) == 0 && isnull(checkpass))
                {
                    static const fmt_query[] = "SELECT * FROM `users` WHERE `name` = '%s' AND `password` = '%s'";
                    new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME)+(-2+32)];
                    format(query, sizeof(query), fmt_query, player_info[playerid][NAME], player_info[playerid][PASSWORD]);
                    mysql_tquery(dbHandle, query, "PlayerLogin", "i", playerid);
                }
                else
                {
                    new string[87];
                    SetPVarInt(playerid, "WrongPassword", GetPVarInt(playerid, "WrongPassword")-1);
                    if(GetPVarInt(playerid, "WrongPassword") > 0)
                    {
                        format(string, sizeof(string), "[Îøèáêà] {FFFFFF}Âû ââåëè íåâåðíûé ïàðîëü îò àêêàóíòà. Ó âàñ îñòàëîñü %d ïîïûòîê ââîäà.", GetPVarInt(playerid, "WrongPassword"));
                        SCM(playerid, COLOR_RED, string);
                    }
                    if(GetPVarInt(playerid, "WrongPassword") == 0)
                    {
                        SCM(playerid, COLOR_RED, "[Îøèáêà] {FFFFFF} Âû èñ÷åðïàëè ëèìèò ïîïûòîê ââîäà è áûëè îòêëþ÷åíûé îò ñåðâåðà.");
                        SPD(playerid, -1, 0, " ", " ", " ", "");
                        return Kick(playerid);
                    }
                    ShowLogin(playerid);
                }
            }
            else
            {
                SCM(playerid, COLOR_RED, "Èñïîëüçóéòå \"/q(uit)\", äëÿ âûõîäà èç èãðû");
                SPD(playerid, -1, 0, " ", " ", " ", "");
                return Kick(playerid);
            }
        }
    }
    return 1;

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

24 ответа на этот вопрос

  • 0
Antoxa39
Dance 80-90, mmm Nice)

@rediska Мне кажется,или ты забыл написать ИД подключения. Ну переменую, котораая отвечает у тебя за подключение к бд. Например dbHandle.

Выглядеть это должно так:

mysql_tquery(dbHandle,inputtext, player_info[playerid][PASSWORD], checkpass, 32);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
SCRIPTMAN
Великий Гуру

Советую ознакомиться с документацией по MySQL (клик)

1 аргумент - имя переменной

2 аргумент - запрос, а ты пытаешься в запрос записать введённый игроком текст

И т. д., там даже есть пример использования. Не ту функцию ты используешь для записи пароля в массив

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
rediska
Освоившийся

@Antoxa39 а запросов в mysql на проверку пароля у тебя там нету никаких? или оно просто ставится так без запроса

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
Antoxa39
Dance 80-90, mmm Nice)

 @rediska strmid(p_info[playerid][pass],inputtext,0,strlen(inputtext),26); эта функция записывает веденный текст игроком в переменную где хранится пароль. На проверку нет

 

strmid(dest[], const source[], start, end, maxlength=sizeof dest)

 

dest[]Массив, для записи символов из строки source.

const source[]Массив со строкой, часть которой требуется скопировать.

start Позиция начала копирования (нумерация начинается с 0).

end Позиция завершения копирования. Копируются символы из диапазона start..end-1.

maxlength Размер массива dest (необязательный параметр).

 

mysql_fetch_field_row
 

Функция получает данные из указанного столбца
string[]: строка куда будет помещен результат из столбца
const fieldname[]: имя столбца, из которого будем брать данные
connectionHandle: ID соединения@rediska 

Отредактировано пользователем Antoxa39

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
rediska
Освоившийся

@SCRIPTMAN я так понимаю это вот это?:

Цитата

new query[128];
format(query, sizeof(query), "SELECT * FROM `players` WHERE `id` = %d", Player[playerid][ID]);
mysql_tquery(MySQL, query, "OnStuffSelected", "d", playerid);

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
Antoxa39
Dance 80-90, mmm Nice)

@rediska чтобы добавить акк в бд нужно использовать запрос INSERT INTO *жмяк.
P.S квадратные скобки которые там указаны,не нужны их писать в запросе Pawn

Отредактировано пользователем Antoxa39

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
SCRIPTMAN
Великий Гуру

@rediska да, это правильный метод использования функции. А у тебя, как видишь - совсем какая-то ерунда

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
SCRIPTMAN
Великий Гуру

@rediska переводчик в помощь. Я в какой-то теме видел твой код и видел созданную 2 раза переменную, она локальная, просто другая ниже уровнем. Смотри внимательно переменную с этим названием

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
SCRIPTMAN
Великий Гуру

@rediska подумай. А то совсем уже ленитесь, хотите что бы сделали вам. Я тебе подчеркнул, ошибку переведи в гугле

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
SCRIPTMAN
Великий Гуру

@rediska там бред полный. Найди функцию здесь, ознакомься с ней, а потом вернись к коду и прочти, что ты написал.

А вообще, совет ВСЕМ НОВИЧКАМ. Начинайте не с написания мода с нуля, а с доработки модов с пабликов. Мод с нуля - не такое простое дело как кажется, и писать его по видосам какого-то чувака, а самому не обучаться - бред полный.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
SCRIPTMAN
Великий Гуру

@rediska  вообще не туда идёшь. Сам не понимаешь, что нужно сделать. Меньше смотрите пишущих с нуля - от них нет смысла, потому что вы не думаете, вы только копируете чужой код, даже не пытаетесь разобраться. Я тебе целый диалог в теме написал и расписал что не так, а ты даже не смог посмотреть это, попытаться понять. Смотри последние 2 сообщения, дальше без меня

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
Cawfee
Великий Гуру

@rediska, а зачем вам вообще здесь strcmp? Вы разве где-то заранее загружали в эту переменную пароль?

 

Запрос к базе данных (например, на поиск аккаунта) можно реализовать, грубо говоря, двумя путями:

  1. Отправить запрос и заставить машину ждать, пока сервер базы данных вернет ответ. Соответственно, чем больше нагружен сервер, чем больше забита база данных, чем сложнее запрос, тем больше время ответа. И пока выполняется этот запрос, весь сервер, можно сказать, зависает. Для этого используют mysql_query.
  2. Отправить запрос к базе данных без принудительного ожидания ответа (в отдельном потоке). Соответственно, отправляете запрос, далее продолжает исполняться ваш программный код. Как только сервер базы данных подготовит ответ, так в ближайший допустимый момент вызовется та public-функция, которую вы зададите. Для этого используют функции mysql_tquery, mysql_pquery (mysql_pquery используется, когда нужна многопоточность, – лучше с ней не играйтесь пока что).

Что мы видим у вас сейчас (на момент последней редакции)? К базе данных отправляется запрос в отдельном потоке при помощи функции mysql_tquery (речь идет о строке 631 на изображении, приведенном пользователем @SCRIPTMAN). Результат этого запроса (все данные об аккаунте с некоторым ником и некоторым паролем) вы увидите в функции PlayerLogin. Но при этом пароль пытаетесь сверять в строке 632. То есть из базы данных пароль еще не был получен, но вы уже сравниваете его. Проверку необходимо проводить в функции PlayerLogin в вашем случае.

 

Что касается PlayerLogin. Просто в самом начале этой функции необходимо добавить проверку, возвращена ли хотя бы 1 строка. Возвращена? Превосходно, введенный пароль правильный, идем на авторизацию. Нет? Значит в базе данных нет аккаунта с такой комбинацией логина и пароля, то есть введен неверный пароль.

 

В результате ваш диалог авторизации приобретает примерно следующий вид:

Спойлер

case DLG_LOG:
{
    if(response)
    {
        if(!strlen(inputtext))
        {
            ShowLogin(playerid);
        }
        new query[128];
        format(query, sizeof(query), "SELECT * FROM `users` WHERE `name = %s` AND `password = %s`", player_info[playerid][PASSWORD]);
        mysql_tquery(dbHandle, query, "PlayerLogin", "i", playerid);
        // здесь больше ничего не нужно, все дальнейшие события в функции PlayerLogin
    }
    else
    {
        SCM(playerid, COLOR_RED, "Используйте \"/q(uit)\", для выхода из игры");
        SPD(playerid, -1, 0, " ", " ", " ", "");
        return Kick(playerid);
    }
}

 

 

А функция PlayerLogin преобразуется в следующий вариант:

Спойлер

public PlayerLogin(playerid)
{
    new rows;
    cache_get_row_count(rows);
    if(rows) // нашлась ли хотя бы одна строка? Авторизуем игрока
    {
        SCM(playerid, COLOR_RED, "Вы авторизовались!");
        
        cache_get_value_name_int(0, "id", player_info[playerid][ID]);
        cache_get_value_name(0, "email", player_info[playerid][EMAIL], 64);
        cache_get_value_name_int(0, "ref", player_info[playerid][REF]);
        cache_get_value_name_int(0, "sex", player_info[playerid][SEX]);
        cache_get_value_name_int(0, "race", player_info[playerid][RACE]);
        cache_get_value_name_int(0, "age", player_info[playerid][AGE]);
        cache_get_value_name_int(0, "skin", player_info[playerid][SKIN]);
        cache_get_value_name(0, "regdata", player_info[playerid][REGDATA], 13);
        cache_get_value_name(0, "regip", player_info[playerid][REGIP], 16);
        cache_get_value_name_int(0, "money", player_info[playerid][ADMIN]);
        cache_get_value_name_int(0, "admin", player_info[playerid][MONEY]);
        cache_get_value_name_int(0, "lvl", player_info[playerid][LVL]);
        cache_get_value_name_int(0, "exp", player_info[playerid][EXP]);
        cache_get_value_name_int(0, "mins", player_info[playerid][MINS]);
        
        SetPVarInt(playerid, "logged", 1);
        SetSpawnInfo(playerid, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
        TogglePlayerSpectating(playerid, 0);
    }
    else { // не нашлось строк (т.е. введен неверный пароль)? Считаем попытки входа...
        new string[87];
        SetPVarInt(playerid, "WrongPassword", GetPVarInt(playerid, "WrongPassword")-1);
        if(GetPVarInt(playerid, "WrongPassword") > 0)
        {
            format(string, sizeof(string), "[Ошибка] {FFFFFF}Вы ввели неверный пароль от аккаунта. У вас осталось %d попыток ввода.", GetPVarInt(playerid, "WrongPassword"));
            SCM(playerid, COLOR_RED, string);
        }
        if(GetPVarInt(playerid, "WrongPassword") == 0)
        {
            SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF} Вы исчерпали лимит попыток ввода и были отключеный от сервера.");
            SPD(playerid, -1, 0, " ", " ", " ", "");
            return Kick(playerid);
        }
        ShowLogin(playerid);
    }
    
    return 1;
}

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Гость
Эта тема закрыта для публикации ответов.

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • Samolet
      От Samolet
      Здраствуйте, cоздаю копию Arizona на ОМП, опен мультиплеер, загрузил и подключил бд, но сервер не хочет вот лог :[2026-10-20T21:03:32+0300] [Info] Log file reloaded. Starting open.mp server (1.5.8.3079) from commit c6759bd8d265171ae3d86598895a23d5a8d92a3b Loading component $CAPI.so Successfully loaded component C-API (1.5.8.3079) with UID 10467dd8d4c56fc6 Loading component LegacyConfig.so Successfully loaded component LegacyConfig (1.5.8.3079) with UID 24ef6216838f9ffc Loading component NPCs.so Successfully loaded component NPCs (1.5.8.3079) with UID 3d0e59e87f4e90bc Loading component Recordings.so Successfully loaded component Recordings (1.5.8.3079) with UID 871144d399f5f613 Loading component Checkpoints.so Successfully loaded component Checkpoints (1.5.8.3079) with UID 44a937350d611dde Loading component TextDraws.so Successfully loaded component TextDraws (1.5.8.3079) with UID 9b5dc2b1d15c992a Loading component Pawn.so Successfully loaded component Pawn (1.5.8.3079) with UID 78906cd9f19c36a6 Loading component GangZones.so Successfully loaded component GangZones (1.5.8.3079) with UID b3351d11ee8d8056 Loading component Actors.so Successfully loaded component Actors (1.5.8.3079) with UID c81ca021eae2ad5c Loading component Pickups.so Successfully loaded component Pickups (1.5.8.3079) with UID cf304faa363dd971 Loading component Dialogs.so Successfully loaded component Dialogs (1.5.8.3079) with UID 44a111350d611dde Loading component Objects.so Successfully loaded component Objects (1.5.8.3079) with UID 59f8415f72da6160 Loading component Console.so Successfully loaded component Console (1.5.8.3079) with UID bfa24e49d0c95ee4 Loading component TextLabels.so Successfully loaded component TextLabels (1.5.8.3079) with UID a0c57ea80a009742 Loading component Variables.so Successfully loaded component Variables (1.5.8.3079) with UID 75e121848bc01fa2 Loading component Databases.so Successfully loaded component Databases (1.5.8.3079) with UID 80092e7eb5821a96 Loading component LegacyNetwork.so Successfully loaded component RakNetLegacyNetwork (1.5.8.3079) with UID ea9799fd79cf8442 Loading component CustomModels.so Successfully loaded component CustomModels (1.5.8.3079) with UID 15e3cb1e7c77ffff Loading component Menus.so Successfully loaded component Menus (1.5.8.3079) with UID 621e219eb97ee0b2 Loading component Vehicles.so Successfully loaded component Vehicles (1.5.8.3079) with UID 3f1f62ee9e22ab19 Loading component Classes.so Successfully loaded component Classes (1.5.8.3079) with UID 8cfb3183976da208 Loading component Timers.so Successfully loaded component Timers (1.5.8.3079) with UID 2ad8124c5ea257a3 Loaded 22 component(s) from /home/gs113492/components Executing Server Config... [2026-10-20T21:03:33+0300] [Info] Loading plugin: crashdetect.so [2026-10-20T21:03:33+0300] [Info] CrashDetect plugin 4.19 [2026-10-20T21:03:33+0300] [Info] Loading plugin: mapandreas.so [2026-10-20T21:03:33+0300] [Info] Loading plugin: streamer.so [2026-10-20T21:03:33+0300] [Info] *** Streamer Plugin v2.9.4 by Incognito loaded *** [2026-10-20T21:03:33+0300] [Info] Loading plugin: sscanf.so [2026-10-20T21:03:33+0300] [Info] [2026-10-20T21:03:33+0300] [Info] =============================== [2026-10-20T21:03:33+0300] [Info] sscanf plugin loaded. [2026-10-20T21:03:33+0300] [Info] Version: 2.8.3 [2026-10-20T21:03:33+0300] [Info] (c) 2018 Alex "Y_Less" Cole [2026-10-20T21:03:33+0300] [Info] =============================== [2026-10-20T21:03:33+0300] [Info] Loading plugin: TOTP.so [2026-10-20T21:03:33+0300] [Info] TOTP plugin v1.0.1 by Games loaded. [2026-10-20T21:03:33+0300] [Info] Loading plugin: mysql_static.so [2026-10-20T21:03:33+0300] [Info] >> plugin.mysql: R39-6 successfully loaded. [2026-10-20T21:03:33+0300] [Info] Loading plugin: libpawn_json.so [2026-10-20T21:03:34+0300] [Error] Function not registered: YSF_SetTickRate [2026-10-20T21:03:34+0300] [Error] Function not registered: PC_Init [2026-10-20T21:03:34+0300] [Info] [debug] Run time error 19: "File or function is not found" [2026-10-20T21:03:34+0300] [Info] [debug] PC_Init [2026-10-20T21:03:34+0300] [Info] [debug] YSF_SetTickRate [2026-10-20T21:03:34+0300] [Error] File or function is not found [2026-10-20T21:03:34+0300] [Error] Function not registered: PC_RegAlias [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_GetWriteOffset [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_Reset [2026-10-20T21:03:34+0300] [Error] Function not registered: PR_RegHandler [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_Delete [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_New [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_ResetReadPointer [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_SetWriteOffset [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_IgnoreBits [2026-10-20T21:03:34+0300] [Error] Function not registered: PR_Init [2026-10-20T21:03:34+0300] [Error] Function not registered: PR_SendRPC [2026-10-20T21:03:34+0300] [Error] Function not registered: PR_SendPacket [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_WriteValue [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_GetNumberOfBytesUsed [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_ReadValue [2026-10-20T21:03:34+0300] [Error] Function not registered: PC_Init [2026-10-20T21:03:34+0300] [Info] [debug] Run time error 19: "File or function is not found" [2026-10-20T21:03:34+0300] [Info] [debug] PC_Init [2026-10-20T21:03:34+0300] [Info] [debug] BS_ReadValue [2026-10-20T21:03:34+0300] [Info] [debug] BS_GetNumberOfBytesUsed [2026-10-20T21:03:34+0300] [Info] [debug] BS_WriteValue [2026-10-20T21:03:34+0300] [Info] [debug] PR_SendPacket [2026-10-20T21:03:34+0300] [Info] [debug] PR_SendRPC [2026-10-20T21:03:34+0300] [Info] [debug] PR_Init [2026-10-20T21:03:34+0300] [Info] [debug] BS_IgnoreBits [2026-10-20T21:03:34+0300] [Info] [debug] BS_SetWriteOffset [2026-10-20T21:03:34+0300] [Info] [debug] BS_ResetReadPointer [2026-10-20T21:03:34+0300] [Info] [debug] BS_New [2026-10-20T21:03:34+0300] [Info] [debug] BS_Delete [2026-10-20T21:03:34+0300] [Info] [debug] PR_RegHandler [2026-10-20T21:03:34+0300] [Info] [debug] BS_Reset [2026-10-20T21:03:34+0300] [Info] [debug] BS_GetWriteOffset [2026-10-20T21:03:34+0300] [Info] [debug] PC_RegAlias [2026-10-20T21:03:34+0300] [Error] File or function is not found [2026-10-20T21:03:34+0300] [Info] [debug] Run time error 19: "File or function is not found" [2026-10-20T21:03:34+0300] [Info] [debug] PC_Init [2026-10-20T21:03:34+0300] [Info] [debug] YSF_SetTickRate [2026-10-20T21:03:34+0300] [Error] File or function is not found [2026-10-20T21:03:34+0300] [Info] [debug] Run time error 19: "File or function is not found" [2026-10-20T21:03:34+0300] [Info] [debug] PC_Init [2026-10-20T21:03:34+0300] [Info] [debug] BS_ReadValue [2026-10-20T21:03:34+0300] [Info] [debug] BS_GetNumberOfBytesUsed [2026-10-20T21:03:34+0300] [Info] [debug] BS_WriteValue [2026-10-20T21:03:34+0300] [Info] [debug] PR_SendPacket [2026-10-20T21:03:34+0300] [Info] [debug] PR_SendRPC [2026-10-20T21:03:34+0300] [Info] [debug] PR_Init [2026-10-20T21:03:34+0300] [Info] [debug] BS_IgnoreBits [2026-10-20T21:03:34+0300] [Info] [debug] BS_SetWriteOffset [2026-10-20T21:03:34+0300] [Info] [debug] BS_ResetReadPointer [2026-10-20T21:03:34+0300] [Info] [debug] BS_New [2026-10-20T21:03:34+0300] [Info] [debug] BS_Delete [2026-10-20T21:03:34+0300] [Info] [debug] PR_RegHandler [2026-10-20T21:03:34+0300] [Info] [debug] BS_Reset [2026-10-20T21:03:34+0300] [Info] [debug] BS_GetWriteOffset [2026-10-20T21:03:34+0300] [Info] [debug] PC_RegAlias [2026-10-20T21:03:34+0300] [Info] Legacy Network started on ***.**.**.***:2717. Помогите пожалуйста