Вопросы

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

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

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

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

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

 

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


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

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

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


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

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

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


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

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

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

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

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

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


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

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

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

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


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

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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 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 

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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 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);

 

 

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


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

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

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

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


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

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

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


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

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

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


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

@SCRIPTMAN теперь вот

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

 

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


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

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

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


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

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

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


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

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

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


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

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


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

@rediska 

Спойлер

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

 

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


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

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

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


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

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

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


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

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

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


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

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

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

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


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

@SCRIPTMAN ?

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

 

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


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

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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 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;
}

 

 

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


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

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

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

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

    • Triples
      От Triples
      При компиляции выдает ошибки
      space.pwn(5948) : error 035: argument type mismatch (argument 2) space.pwn(5948) : error 017: undefined symbol "ef" space.pwn(5948) : error 029: invalid expression, assumed zero space.pwn(5948) : fatal error 107: too many error messages on one line  
      Строчка на которую он жалуется
      cef_create_browser(playerid, LOGIN_BROWSER_ID, 'cef.utah-rp.ru/hud', false, false);  
    • Illya_Zaxatniy
      От Illya_Zaxatniy
      Доработка мода Samp-Rp
      Скачать файл Привет, у меня давно валяется данный мод который дорабатывался мною в 22  году, решил его выставить на продажу, поскольку деньги - не лишние.
       
      Ниже прикрепляю лог доработок а также айпи адрес для теста
      также к моду(после приобретения) прилагается список багов, найденных, они не значительные но имеются
       
      лог доработок: 
      1. Вырезана /alevel 2. Теперь чат администрации для всех общий 3. Вырезана команда /serverbonus 4. Теперь администрация от 8 уровня не отображается в /admins и при авторизации в панели администратора 5. Убрал бонус 6. Теперь при авторизации в панели администратора не пишет что ввёл неверный пароль 7. Переписал регистрацию 8. Теперь проверка на блокировку идёт при заходе на сервер, не после ввода пароля 9. Переписал авторизацию 10. Адрес электронной почты при регистрации теперь проверяется по всем параметрам 11. Реферальная система при регистрации теперь проверяет ник или промокод 12. Сделал выбор скинов на текстдравах 13. Переписал /makeleader в диалог (+ теперь выдаются женские скины) 14. Вырезана /fractionid 15. Вырезан ограничитель скорости 16. Теперь при выдаче предупреждения или бане указывается фракция и ранг игрока (Если он состоит в организации) 17. Теперь командой /spawn можно спавнить других игроков 18. Отредактирована команда /recon 19. Вырезан анти-БХ 20. Переписана команда /invite (+ добавлены женские скины) 21. Из главного меню вырезана система слива денег 22. Сделана система телепорта по метке на карте для администрации 23. Переписал систему навигатора (/gps) 24. Переписал /tp (Теперь он работает через навигатор) 25. /mute теперь выдаётся по минутам 26. Добавил команду /tmute для администрации с 1 уровня - просмотр времени до снятия мута у игрока 27. Изменена команда /pm 28. Для начала гонок и пейнтбола теперь достаточно 2 участников 29. Убрана команда ахелп, будет написана новая 30. Теперь в команде присон надо указывать причину 31. Добавлена команда /forum для оповещения об открытия заявок на лидерство на форуме 32. Новый логотип 33. Добавлена команда /rmute для выдачи бана репорта 34. Написана система для тестеров     АЙПИ ДЛЯ ТЕСТА И ПАРОЛЬ: IP 195.18.27.226:1235 PASSWORD : 1   ДЛЯ СВЯЗИ ВК: https://vk.com/iilyazaxodnoy       Добавил Illya_Zaxatniy Добавлено 30.12.2024 Категория Моды Автор @illyazaxodnoy  
    • Illya_Zaxatniy
      От Illya_Zaxatniy
      Привет, у меня давно валяется данный мод который дорабатывался мною в 22  году, решил его выставить на продажу, поскольку деньги - не лишние.
       
      Ниже прикрепляю лог доработок а также айпи адрес для теста
      также к моду(после приобретения) прилагается список багов, найденных, они не значительные но имеются
       
      лог доработок: 
      1. Вырезана /alevel 2. Теперь чат администрации для всех общий 3. Вырезана команда /serverbonus 4. Теперь администрация от 8 уровня не отображается в /admins и при авторизации в панели администратора 5. Убрал бонус 6. Теперь при авторизации в панели администратора не пишет что ввёл неверный пароль 7. Переписал регистрацию 8. Теперь проверка на блокировку идёт при заходе на сервер, не после ввода пароля 9. Переписал авторизацию 10. Адрес электронной почты при регистрации теперь проверяется по всем параметрам 11. Реферальная система при регистрации теперь проверяет ник или промокод 12. Сделал выбор скинов на текстдравах 13. Переписал /makeleader в диалог (+ теперь выдаются женские скины) 14. Вырезана /fractionid 15. Вырезан ограничитель скорости 16. Теперь при выдаче предупреждения или бане указывается фракция и ранг игрока (Если он состоит в организации) 17. Теперь командой /spawn можно спавнить других игроков 18. Отредактирована команда /recon 19. Вырезан анти-БХ 20. Переписана команда /invite (+ добавлены женские скины) 21. Из главного меню вырезана система слива денег 22. Сделана система телепорта по метке на карте для администрации 23. Переписал систему навигатора (/gps) 24. Переписал /tp (Теперь он работает через навигатор) 25. /mute теперь выдаётся по минутам 26. Добавил команду /tmute для администрации с 1 уровня - просмотр времени до снятия мута у игрока 27. Изменена команда /pm 28. Для начала гонок и пейнтбола теперь достаточно 2 участников 29. Убрана команда ахелп, будет написана новая 30. Теперь в команде присон надо указывать причину 31. Добавлена команда /forum для оповещения об открытия заявок на лидерство на форуме 32. Новый логотип 33. Добавлена команда /rmute для выдачи бана репорта 34. Написана система для тестеров     АЙПИ ДЛЯ ТЕСТА И ПАРОЛЬ: IP 195.18.27.226:1235 PASSWORD : 1   ДЛЯ СВЯЗИ ВК: https://vk.com/iilyazaxodnoy