Вопросы

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 пользователей онлайн

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

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

    • Helados
      От Helados
      Короче, мы протестировали наш GTA на другом хостинге — голосовой чат там работает, всё включается нормально. Также проверили на другом хостинге с нашим игровым модом — voice chat тоже работает.
      Но на нашем личном хостинге, который мы купили на OVH и установили панель, не получается запустить голосовой чат. Похоже, проблема связана с портами. После перезапуска сервер почему-то случайным образом выбирает порты сам и мы не можем это исправить.
      Если кто-то знает человека, который может помочь разобраться с этой проблемой, буду благодарен.
    • тимормо
      От тимормо
      Копия Diamond RP (основа State 99)
      Скачать файл Мод DIAMOND RP (ver. 1.0)
      Основа: State 99
      Автор мода: #TomSnow
      Вопросы/Баги: https://vk.com/etalon_dev
       
      Приветствую всех! На связи #TomSnow
       
      Я принял решение начать поэтапную разработку и восстановление легендарного мода Diamond RolePlay образца 2015–2017 годов, взяв за основу мод State 99 (оригинальная основа DRP).
       
      Каждая новая версия разрабатываемого мода будет публиковаться в открытом доступе для всех участников и подписчиков сообщества (https://vk.com/etalon_dev). Это позволит вам не только следить за процессом разработки, но и принимать непосредственное участие в развитии проекта: тестировать обновления, находить баги, сообщать о недоработках и помогать делать мод максимально качественным и стабильным.
       
      Если вам интересна данная тематика и вы хотите наблюдать за ходом разработки, подписывайтесь на нашу группу ВКонтакте (https://vk.com/etalon_dev) и ожидайте публикацию версий проекта.
       
      Спасибо всем за поддержку! Впереди нас ждёт много интересной работы и возвращение атмосферы классического Diamond RolePlay. 
       
      Информация о моде:
       
      Версия MySQL R 39-6
      Античит Nex-AC (Доработанный)
      Стример Streamer Plugin v2.9.4
      Командный процессор Pawn CMD
       
      Список обновлений мода
       
       
      Добавил тимормо Добавлено 07/15/26 Категория Моды Автор #TomSnow  
    • тимормо
      От тимормо
      Мод DIAMOND RP (ver. 1.0)
      Основа: State 99
      Автор мода: #TomSnow
      Вопросы/Баги: https://vk.com/etalon_dev
       
      Приветствую всех! На связи #TomSnow
       
      Я принял решение начать поэтапную разработку и восстановление легендарного мода Diamond RolePlay образца 2015–2017 годов, взяв за основу мод State 99 (оригинальная основа DRP).
       
      Каждая новая версия разрабатываемого мода будет публиковаться в открытом доступе для всех участников и подписчиков сообщества (https://vk.com/etalon_dev). Это позволит вам не только следить за процессом разработки, но и принимать непосредственное участие в развитии проекта: тестировать обновления, находить баги, сообщать о недоработках и помогать делать мод максимально качественным и стабильным.
       
      Если вам интересна данная тематика и вы хотите наблюдать за ходом разработки, подписывайтесь на нашу группу ВКонтакте (https://vk.com/etalon_dev) и ожидайте публикацию версий проекта.
       
      Спасибо всем за поддержку! Впереди нас ждёт много интересной работы и возвращение атмосферы классического Diamond RolePlay. 
       
      Информация о моде:
       
      Версия MySQL R 39-6
      Античит Nex-AC (Доработанный)
      Стример Streamer Plugin v2.9.4
      Командный процессор Pawn CMD
       
      Список обновлений мода