Вопросы

Начинаю разработку мода с нуля но каждый раз выдаёт ошибку при создании регистрации/авторизации

D:\SA-MP 0.3.7 Windows Server\gamemodes\new.pwn(239) : предупреждение 215: выражение не имеет эффекта
D:\SA-MP 0.3.7 Windows Server\gamemodes\new.pwn(239) : предупреждение 215: выражение не имеет эффекта
D:\SA-MP 0.3.7 Windows Server\gamemodes\new.pwn(239) : ошибка 001: ожидался токен ";", но найден ")"
D:\SA-MP 0.3.7 Windows Server\gamemodes\new.pwn(239) : ошибка 029: неправильное выражение, принят ноль
D:\SA-MP 0.3.7 Windows Server\gamemodes\new.pwn(239) : предупреждение 215: выражение не имеет эффекта
D:\SA-MP 0.3.7 Windows Server\gamemodes\new.pwn(243) : ошибка 029: неправильное выражение, принят ноль
D:\SA-MP 0.3.7 Windows Server\gamemodes\new.pwn(243) : предупреждение 215: выражение не имеет эффекта
D:\SA-MP 0.3.7 Windows Server\gamemodes\new.pwn(243) : предупреждение 215: выражение не имеет эффекта
D:\SA-MP 0.3.7 Windows Server\gamemodes\new.pwn(243) : предупреждение 215: выражение не имеет эффекта
D:\SA-MP 0.3.7 Windows Server\gamemodes\new.pwn(243) : ошибка 001: ожидался токен ";", но найден ")"
D:\SA-MP 0.3.7 Windows Server\gamemodes\new.pwn(243) : ошибка 029: неправильное выражение, принят ноль
D:\SA-MP 0.3.7 Windows Server\gamemodes\new.pwn(243) : фатальная ошибка 107: слишком много ошибок на одной строке

Компиляция остановлена.

Pawn compiler 3.2.3664 Copyright (c) 1997-2016, ITB CompuPhase
Ошибок:6.
Спойлер

public OnPlayerConnect(playerid)
{
    GetPlayerName(playerid,Player[playerid][pNick],MAX_PLAYER_NAME);
    new query[100];
    format(query,sizeof(query),"SELECT * FROM `account` WHERE `pNick` = '%s'",Player[playerid][pNick]);
    mysql_function_query(dbHandle,query,true,"CheckPlayerBD","i",playerid);
    return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case 1:
        {
            if(!response) return Kick(playerid);
            if(strlen(inputtext) < 4 || strlen(inputtext) > 32 || strlen(inputtext) == 0return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация""Длина пароля от 4 до 32 символов.\n Вы также не можете продолжить не указав пароль""Далее""");
            for(new i; i < strlen(inputtext); i++)
            {
                switch(inputtext)
                {
                    case 'A'..'Z','a'..'z','0'..'9':continue;
                    defaultreturn ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация""Пароль может быть только: a-z, A-Z,0-9""Далее""");
                }
            }
            new query[120 + MAX_PLAYER_NAME];
            format(query,sizeof(query),"INSERT INTO `account` (`pNick`,`pPassword`,`pLevel`) VALUES ('%s','%s','1')"),Player[playerid][pNick],inputtext);
            mysql_query(dbHandle,query);
            
            new query1[100];
            format(query1,sizeof(query1),"SELECT * FROM `account` WHERE `pNick` = '%s'",Player[playerid][pNick]);
            mysql_function_query(dbHandle,query1,true,,"LoadAcc","i",playerid);
        }
    }

    case 2:
    {
        if(!response) return Kick(playerid);
        if(strlen(inputtext) < 4 || strlen(inputtext) > 32 || strlen(inputtext) == 0return ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация""Неверный пароль""Далее""");
        for(new i; i < strlen(inputtext); i++)
        {
            switch(inputtext)
            {
                case 'A'..'Z','a'..'z','0'..'9'continue;
                defaultreturn ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация""Не верный пароль!""Далее""");
            }
        }

        new query[120];
        format(query,sizeof(query),"SELECT * FROM `account` WHERE `pNick` = '%s' AND `pPassword` = '%s'",Player[playerid][pNick],inputtext);
        mysql_function_query(dbHandle,query,true,"CheckPass","i",playerid);
    }
    return 1;
}

forward CheckPlayerBD(playerid);
public CheckPlayerBD(playerid)
{
    new rows,fields;
    cache_get_data(rows,fields);
    if(!rows)
    {
        ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация""Приветствуем Вас! Вы еще не зарегистрированы,введите свой пароль ниже.""Далее""");
    }
    else
    {
        ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация""Рады видеть Вас снова на Urok. Авторизуйтесь.""Далее""");
        cache_get_field_content(0,"pPassword",Player[playerid][pPassword],dbHandle);
     }
     return 1;
}

forward LoadAcc(playerid);
public LoadAcc(playerid)
{
    Player[playerid][pID] = cache_get_field_content_int(0,"pID",dbHandle);
    Player[playerid][pLevel] = cache_get_field_content_int(0,"pLevel",dbHandle);
}

forward CheckPass(playerid);
public CheckPass(playerid)
{
    new rows,fields;
    cache_get_data(rows,fields);
    if(rows)
    {
        SpawnPlayer(playerid);
        SendClientMessage(playerid,-1,"Вы успешно авторизовались!");
    }
    else
    {
        SetPVarInt(playerid,"wrong_password",GetPVarInt(playerid,"wrong_password") + 1)
        ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Авторизация","Не верный пароль!","Далее","");
        new str[64];
        format(str,sizeof(str),"У вас осталось: %d попыток",GetPVarInt(playerid,"wrong_password"));
        SendClientMessage(playerid,-1,str);
        if(GetPVarInt(playerid,"wrong_password") >= 5return Kick(playerid);
    }
}

 

 

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

Заметка от Cawfee , создано

3.2. Код необходимо брать в тег "Код", а код более 10 строк – еще и в "Спойлер". Как это сделать рассказано в разделе "FAQ".

Устное предупреждение.

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


Ссылка на сообщение

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

  • 0

Ну во-первых, в одной из функций MySQL вы либо пропустили параметр, либо случайно поставили лишнюю запятую, а именно в этом фрагменте:

mysql_function_query(dbHandle,query1,true,,"LoadAcc","i",playerid);
// Указать на какой строке это не могу, ибо вы сами их не разметили :)

Так же ошибка у вас в каждой проверку символов пароля, а именно:

switch(inputtext)
{
    //...
}
// Код выше в корне неврный, так как вы указываете строку, а не символ
// Для перебора символов строки надо использовать такой код:
switch(inputtext[i])
{
    //...
}

При оповещение игрока во время авторизации о том, сколько у него осталось попыток вы выводите такой текст:

format(str,sizeof(str),"У вас осталось: %d попыток",GetPVarInt(playerid,"wrong_password"));

Это неверно, так как временная переменная wrong_password у вас начинается с нуля, то есть при постоянном вводе неверного пароля со стороны игрока будет такая ситуация:

У вас осталось: 1 попыток
У вас осталось: 2 попыток
У вас осталось: 3 попыток
У вас осталось: 4 попыток
У вас осталось: 5 попыток
*Кик игрока*

Для верного отображения используйте такой код:

format(str,sizeof(str),"У вас осталось: %d попыток",5-GetPVarInt(playerid,"wrong_password"));

Так же мне хотелось разобрать данную проверку:

if(strlen(inputtext) < 4 || strlen(inputtext) > 32 || strlen(inputtext) == 0//..

Я думаю, что 0 и так меньше 4-х, поэтому сравнение длинные строки с нулём можно убрать:

if(strlen(inputtext) < 4 || strlen(inputtext) > 32//...

Ещё я не вижу смысла создавать отдельные переменные для каждого запроса, как это вы делаете в данном фрагменте кода:

new query[120 + MAX_PLAYER_NAME];
format(query,sizeof(query),"INSERT INTO `account` (`pNick`,`pPassword`,`pLevel`) VALUES ('%s','%s','1')"),Player[playerid][pNick],inputtext);
mysql_query(dbHandle,query);
new query1[100];
format(query1,sizeof(query1),"SELECT * FROM `account` WHERE `pNick` = '%s'",Player[playerid][pNick]);
mysql_function_query(dbHandle,query1,true,,"LoadAcc","i",playerid);

Гораздо проще и логичней использовать старую переменную, ведь она уже и не нужна:

new query[120 + MAX_PLAYER_NAME];
format(query,sizeof(query),"INSERT INTO `account` (`pNick`,`pPassword`,`pLevel`) VALUES ('%s','%s','1')"),Player[playerid][pNick],inputtext);
mysql_query(dbHandle,query);
format(query1,sizeof(query),"SELECT * FROM `account` WHERE `pNick` = '%s'",Player[playerid][pNick]);
mysql_function_query(dbHandle,query,true,,"LoadAcc","i",playerid);

На этом вроде бы всё.

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


Ссылка на сообщение
  • 0

D:\m\gamemodes\new.pwn(60) : ошибка 017: необъявленный символ "mysql_function_query"

D:\m\gamemodes\new.pwn(241) : предупреждение 215: выражение не имеет эффекта

D:\m\gamemodes\new.pwn(241) : предупреждение 215: выражение не имеет эффекта

D:\m\gamemodes\new.pwn(241) : ошибка 001: ожидался токен ";", но найден ")"

D:\m\gamemodes\new.pwn(241) : ошибка 029: неправильное выражение, принят ноль

D:\m\gamemodes\new.pwn(241) : предупреждение 215: выражение не имеет эффекта

D:\m\gamemodes\new.pwn(244) : ошибка 017: необъявленный символ "mysql_function_query"

D:\m\gamemodes\new.pwn(244) : предупреждение 215: выражение не имеет эффекта

D:\m\gamemodes\new.pwn(244) : предупреждение 215: выражение не имеет эффекта

D:\m\gamemodes\new.pwn(244) : предупреждение 215: выражение не имеет эффекта

D:\m\gamemodes\new.pwn(244) : ошибка 001: ожидался токен ";", но найден ")"

D:\m\gamemodes\new.pwn(244) : ошибка 029: неправильное выражение, принят ноль

D:\m\gamemodes\new.pwn(244) : фатальная ошибка 107: слишком много ошибок на одной строке

 

Компиляция остановлена.

 

Pawn compiler 3.2.3664 Copyright (c) 1997-2016, ITB CompuPhase

 

 

Ошибок:7.

Спойлер

public OnPlayerConnect(playerid)
{
    GetPlayerName(playerid,Player[playerid][pNick],MAX_PLAYER_NAME);
    new query[100];
    format(query,sizeof(query),"SELECT * FROM `account` WHERE `pNick` = '%s'",Player[playerid][pNick]);
    mysql_function_query(dbHandle,query,true,"CheckPlayerBD","i",playerid);
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case 1:
        {
            if(!response) return Kick(playerid);
            if(strlen(inputtext) < 4 || strlen(inputtext) > 32return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация""Длина пароля от 4 до 32 символов.\n Вы также не можете продолжить не указав пароль""Далее""");
            for(new i; i < strlen(inputtext); i++)
            {
                switch(inputtext)
                {
                    case 'A'..'Z','a'..'z','0'..'9':continue;
                    defaultreturn ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация""Пароль может быть только: a-z, A-Z,0-9""Далее""");
                }
            }

            new query[120 + MAX_PLAYER_NAME];
            format(query,sizeof(query),"INSERT INTO `account` (`pNick`,`pPassword`,`pLevel`) VALUES ('%s','%s','1')"),Player[playerid][pNick],inputtext); mysql_query(dbHandle,query);
            mysql_query(dbHandle,query);
            new query1[100];
            format(query1,sizeof(query),"SELECT * FROM `account` WHERE `pNick` = '%s'",Player[playerid][pNick]); mysql_function_query(dbHandle,query,true,,"LoadAcc","i",playerid);
            mysql_function_query(dbHandle,query1,true,"LoadAcc","i",playerid);
        }
    }

    case 2:
    {
        if(!response) return Kick(playerid);
        if(strlen(inputtext) < 4 || strlen(inputtext) > 32 || strlen(inputtext) == 0return ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация""Неверный пароль""Далее""");
        for(new i; i < strlen(inputtext); i++)
        {
            switch(inputtext)
            {
                case 'A'..'Z','a'..'z','0'..'9'continue;
                defaultreturn ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация""Не верный пароль!""Далее""");
            }
        }

        new query[120];
        format(query,sizeof(query),"SELECT * FROM `account` WHERE `pNick` = '%s' AND `pPassword` = '%s'",Player[playerid][pNick],inputtext)
        mysql_function_query(dbHandle,query,true,"CheckPass","i",playerid);
    }
    return 1;
}

forward LoadAcc(playerid);
public LoadAcc(playerid)
{
    Player[playerid][pID] = cache_get_field_content_int(0,"pID",dbHandle);
    Player[playerid][pLevel] = cache_get_field_content_int(0,"pLevel",dbHandle);
}

forward CheckPass(playerid);
public CheckPass(playerid)
{
    new rows,fields;
    cache_get_data(rows,fields);
    if(rows)
    {
        SpawnPlayer(playerid);
        SendClientMessage(playerid,-1,"Вы успешно авторизовались!");
    }
    else
    {
    SetPVarInt(playerid,"wrong_password",GetPVarInt(playerid,"wrong_password") + 1)
        ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Авторизация","Не верный пароль!","Далее","");
        new str[64];
        format(str,sizeof(str),"У вас осталось: %d попыток",5-
        GetPVarInt(playerid,"wrong_password"));
        SendClientMessage(playerid,-1,str);
        if(GetPVarInt(playerid,"wrong_password") >= 5return Kick(playerid);
    }
}

forward CheckPlayerBD(playerid);
public CheckPlayerBD(playerid)
{
    new rows,fields;
    cache_get_data(rows,fields);
    if(!rows)
    {
        ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация""Приветствуем Вас! Вы еще не зарегистрированы,введите свой пароль ниже.""Далее""");
    }
    else
    {
        ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация""Рады видеть Вас снова на Urok. Авторизуйтесь.""Далее""");
        cache_get_field_content(0,"pPassword",Player[playerid][pPassword],dbHandle);
    }
    return 1;
}

 

 

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

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


Ссылка на сообщение
  • 0
В 20.10.2023 в 23:20, Sleash сказал:

Ну во-первых, в одной из функций MySQL вы либо пропустили параметр, либо случайно поставили лишнюю запятую, а именно в этом фрагменте:


mysql_function_query(dbHandle,query1,true,,"LoadAcc","i",playerid);
// Указать на какой строке это не могу, ибо вы сами их не разметили :)

Так же ошибка у вас в каждой проверке символов пароля, а именно:


switch(inputtext)
{
    //...
}
// Код выше в корне неврный, так как вы указываете строку, а не символ
// Для перебора символов строки надо использовать такой код:
switch(inputtext[i])
{
    //...
}

 

В 20.10.2023 в 23:20, Sleash сказал:

Ещё я не вижу смысла создавать отдельные переменные для каждого запроса, как это вы делаете в данном фрагменте кода:


new query[120 + MAX_PLAYER_NAME];
format(query,sizeof(query),"INSERT INTO `account` (`pNick`,`pPassword`,`pLevel`) VALUES ('%s','%s','1')"),Player[playerid][pNick],inputtext);
mysql_query(dbHandle,query);
new query1[100];
format(query1,sizeof(query1),"SELECT * FROM `account` WHERE `pNick` = '%s'",Player[playerid][pNick]);
mysql_function_query(dbHandle,query1,true,,"LoadAcc","i",playerid);

Гораздо проще и логичней использовать старую переменную, ведь она уже и не нужна:


new query[120 + MAX_PLAYER_NAME];
format(query,sizeof(query),"INSERT INTO `account` (`pNick`,`pPassword`,`pLevel`) VALUES ('%s','%s','1')"),Player[playerid][pNick],inputtext);
mysql_query(dbHandle,query);
format(query1,sizeof(query),"SELECT * FROM `account` WHERE `pNick` = '%s'",Player[playerid][pNick]);
mysql_function_query(dbHandle,query,true,,"LoadAcc","i",playerid);

Все ошибки, которые я процитировал выше ещё сохранились в вашем коде
В добавок мне интересен этот момент:

format(str,sizeof(str),"У вас осталось: %d попыток",5-
GetPVarInt(playerid,"wrong_password"));

Этот фрагмент выбьет ошибку, почему просто нельзя было написать так:

format(str,sizeof(str),"У вас осталось: %d попыток",5-GetPVarInt(playerid,"wrong_password"));

Ну а если вам принципиально сделать этот код в 2 строчки, то пользуйтесь обратным слешем для переноса кода:

format(str,sizeof(str),"У вас осталось: %d попыток",5-\
GetPVarInt(playerid,"wrong_password"));

@grmpng 

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


Ссылка на сообщение
  • 0
6 часов назад, Sleash сказал:

Этот фрагмент выбьет ошибку, почему просто нельзя было написать так:

Проблемы могут возникнуть лишь с переносом строк без отсутствия обратного слэша. Все остальное любой компилятор нормально жует. Да и вообще удобно так описывать так значения аргументов функций.

 

Спойлер

main() {
    
    /* пример 1 */
    new const vehicleID1 = CreateVehicle( // создадим транспортное средство
        427// id модели - полицейская газель
        
        0// координата по оси OX
        0// координата по оси OY
        0// координата по оси OZ
        0// угол поворота
        
        0// первичный цвет - черный
        0// вторичный цвет - черный
        
        -1// отключить автовозрождение
        0 // сирену не добавлять
    );
    
    /* пример 2 */
    new const vehicleID2 = CreateVehicle(
        .vehicletype = 427// id модели - полицейская газель
        .respawn_delay = -1// отключить автовозрождение
        
        .color1 = 0// первичный цвет - черный
        .color2 = 0// вторичный цвет - черный
               
        .x = 0,
        .y = 0,
        .z = 0,
        .rotation = 0
        
        // addsiren - параметр по умолчанию, можем не задавать
    );
}

 

 

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


Ссылка на сообщение
  • 0

@Cawfee Понял, да, сейчас протестил, это в самом деле так.

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


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

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

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

    • Sten Developer
      От Sten Developer
      Объясню всю ситуацию, пишу систему смерти игрока но она не работает. Решил по приколу написать туда обычный вывод текста SCM(playerid, COLOR_RED, "Вы умерли");
      Но однако после смерти текст не выводиться. Не работает абсолютно все. Кто знает как решить эту проблему?