Вопросы

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], checkpassfalse32== 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, -10, " ", " ", " ", "");
                        return Kick(playerid);
                    }
                    ShowLogin(playerid);
                }
            }
            else
            {
                SCM(playerid, COLOR_RED, "Èñïîëüçóéòå \"/q(uit)\", äëÿ âûõîäà èç èãðû");
                SPD(playerid, -10, " ", " ", " ", "");
                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, -10" "" "" """);
        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, 000000000000);
        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, -10" "" "" """);
            return Kick(playerid);
        }
        ShowLogin(playerid);
    }
    
    return 1;
}

 

 

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


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

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

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

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

    • Vladislav Diachenko
      От Vladislav Diachenko
      Привет! Мы разрабатываем модульный RP-проект нового поколения и сейчас расширяем команду разработки.
      Если тебе надоело ковыряться в гигантских монолитах со сливов и ты хочешь писать чистый, структурированный код — мы сработаемся.
      Что нужно будет делать:
      Разрабатывать новые системы и оптимизировать текущий функционал.
      Работать с модульной структурой мода (разделение по инклудам, y_hooks).
      Взаимодействовать с базой данных (MySQL R41).
      Наши ожидания от тебя:
      Уверенные знания Pawn и понимание работы MySQL.
      Опыт работы с современным инструментарием (VS Code, компилятор Zeex, git — приветствуется).
      Понимание принципов оптимизации (не писать код, который «ложится» при онлайне).
      Умение трезво оценивать сроки своих задач.
      Что мы предлагаем:
      Адекватное ТЗ без формулировок «сделай то, не знаю что».
      Свободу в реализации технических решений (главное — качество и стабильность).
      Своевременную оплату ([подоговорно / за каждую выполненную задачу / фикс. оклад]).
      Работу в дружной и заряженной на результат команде.
      Заинтересовало? Напиши в ЛС телеграмм: [@VladislaHR]. Расскажи пару слов о своем опыте и, если есть возможность, прикрепи пример своего кода (кусочек системы или ссылку на GitHub).
      Давай делать крутой проект вместе!
    • danya_white
      От danya_white
      Доброго времени суток, хочу выставить на продажу уникального игровой мод проекта Action Games ( Revent RP )
      Известный мод проекта который существовал с 2016 года, 
      Мод уникальный и многофункциональный, но требует доработок и улучшений достаточно много недороботок/багов
      Продаю потому что нет времени и желание продолжать работу над этим модом
      Основа мода Revent RP, разрабатывался под проект Action Games
       
      Информация о моде:
      Версия MYSQL -  MySQL R41-4
      Античит - NEX-AC
      Стример - Streamer Plugin v2.9.6 by Incognito
      Командный процессор - Pawn.CMD
      Хэширование паролей - MD5
      Игровой мод разбит на файлы
      Остальное Все плагины обновлены до последней версии

      Функционал, интерфейс можно посмотреть по скриншотам и видеообзорам ниже.
       
    • danya_white
      От danya_white


      Скачать файл Оригинальный мод SA:MP Action Games aka Revent RP
      Доброго времени суток, хочу выставить на продажу уникального игровой мод проекта Action Games ( Revent RP )
      Известный мод проекта который существовал с 2016 года, 
      Мод уникальный и многофункциональный, но требует доработок и улучшений достаточно много недороботок/багов
      Продаю потому что нет времени и желание продолжать работу над этим модом
      Основа мода Revent RP, разрабатывался под проект Action Games
       
      Информация о моде:
      Версия MYSQL -  MySQL R41-4
      Античит - NEX-AC
      Стример - Streamer Plugin v2.9.6 by Incognito
      Командный процессор - Pawn.CMD
      Хэширование паролей - MD5
      Игровой мод разбит на файлы
      Остальное Все плагины обновлены до последней версии

      Функционал, интерфейс можно посмотреть по скриншотам и видеообзорам ниже.
       
      Добавил danya_white Добавлено 05/31/26 Категория Моды Автор danya_whtie  
    • мурзик НЕРНО
      От мурзик НЕРНО
      Помогите пожалуйста у меня есть мод от нового RUSSIA RP и там баг есть некоторые места на карте ваще дырки как будто вырезанные так же и с интерьерами вроде в моде написаны я сам лично проверял на другом моде работают а на этотм ваще некоторый из них не отображается и вот когда я захожу на другой проект все нормально с картой и не куда не проваливаюсь так же и на пк тоже я посоветовался с другими разработчиками они сказал дело в этом файле только я не понимаю что там надо ваще поменять или добавить буду рад если поможете
       
      Скрины так же есть там таких мест очень много
      MAP.inc