Question

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

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;

 

 

Share this post


Link to post
Share on other sites

24 answers to this question

  • 0

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

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

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

 

Share this post


Link to post
Share on other sites
  • 0

@Antoxa39 пропускает любой пароль

Share this post


Link to post
Share on other sites
  • 0

@rediska ну я в этом уже не могу никак помочь,т.к сам учусь Pawn.

Share this post


Link to post
Share on other sites
  • 0

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

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

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

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

Share this post


Link to post
Share on other sites
  • 0

@rediska strmid(p_info[playerid][pass],inputtext,0,strlen(inputtext),26);

держи,вырезал со своего мода

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 0

 @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 

Edited by Antoxa39

Share this post


Link to post
Share on other sites
  • 0

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

Цитата

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

 

 

Share this post


Link to post
Share on other sites
  • 0

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

Edited by Antoxa39

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 0

@Antoxa39 У меня все работает, все добавляется кроме этой проверки 

Share this post


Link to post
Share on other sites
  • 0

@SCRIPTMAN теперь вот

local variable "query" shadows a variable at a preceding level

 

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 0

@SCRIPTMAN да вроде бы всё нормально, на что он жалуется та

Share this post


Link to post
Share on other sites
  • 0

@rediska вот дай мне пвн, я тебе за минуту как увижу твоё сообщение найду

Share this post


Link to post
Share on other sites
  • 0

@rediska 

Спойлер

620522812bdf2_10-02-2022173359.thumb.png.75e39dace26ac88aea3802034916b461.png

 

Share this post


Link to post
Share on other sites
  • 0

@SCRIPTMAN так а на что там жаловаться то?

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 0

@SCRIPTMAN ну а так нормально проверка сделана? или опять фигни понаписал я

Share this post


Link to post
Share on other sites
  • 0

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

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

Share this post


Link to post
Share on other sites
  • 0

@SCRIPTMAN ?

if(strfind(player_info[playerid][NAME], player_info[playerid][PASSWORD], true) != -1)

 

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 0

@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;
}

 

 

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • Nik_Rofid
      By Nik_Rofid
          if(IsPlayerInRangeOfPoint(playerid, 5.0, -433.155, 782.72, 12.5547)) Dialog(playerid, DIALOG_WSP_ELOMS, DIALOG_STYLE_MSGBOX, "{ffffff}Разработчик","{ffffff}Взломаем сервер?","Да", "Нет");
          }
          else //Еррор здесь
          {
          SCM(playerid, 0xCECECEFF, "2331");
          }
      Проблема: Здравсвуйте, При компиляции вылезла 1 ошибка C:\Users\User\Desktop\Мод 7.1 с гс чат\gamemodes\new.pwn(20655) : error 010: invalid function or declaration
      Буду рад если поможете!