Решено Неправильно сохраняется и не получает данные из БД

Добро пожаловать!

Зарегистрировавшись у нас, вы сможете обсуждать, делиться и отправлять личные сообщения другим участникам нашего сообщества.

Зарегистрироваться!
Статус
В этой теме нельзя размещать новые ответы.
Пользователь
Регистрация
14 Авг 2023
Сообщения
166
Пароль от админки неправильно сохраняется в базу данных и получает от туда число 0. В базу данных всегда сохраняет одно и тоже число 52.
Код сохранения:
Pawn:
        case DLG_NEWAPASS:
        {
            if(response)
            {
                new name[MAX_PLAYER_NAME];
                new glstr[512];
                GetPlayerName(playerid, name, sizeof(name)); //Ïîëó÷àåì íèê
                strins(player_info[playerid][APASS], inputtext, 0); //Ôèêñèðóåì ïàðîëü â ïåðåìåííîé
                //
                static const fmt_query[] = "UPDATE `users` SET `apass` = '%d' WHERE `id` ='%d'";
                new query[sizeof(fmt_query)+(-2+4)+(-2+8)];
                format(query, sizeof(query), fmt_query, player_info[playerid][APASS], player_info[playerid][ID]);
                mysql_query(dbHandle, query, false);
                //
                SendClientMessage(playerid,-1,"Âû óñïåøíî âîøëè â ñèñòåìó"); //Ñîîáùåíèå èãðîêó
                player_info[playerid][ALOG] = 1;
                format(glstr, 256, "[A] %s âîø¸ë êàê àäìèíèñòðàòîð %d óðîâíÿ.",name, player_info[playerid][ADMIN]); //Ôîðìàòèðóåì ñîîáùåíèå àäìèíèñòðàòîðàì
                AdmChat(COLOR_WHITE,glstr); //îòïðàâëÿåì ñîîáùåíèå àäìèíèñòðàòîðàì
Код загрузки:

Pawn:
         cache_get_value_name_int(0, "apass", player_info[playerid][APASS], int_dest);
         printf("Çíà÷åíèå â ñòîëáöå 'apass' ðàâíî '%d'.", int_dest);
 
Решение
Проблемы в этот раз уже не будет. Проблема была в одном - ты в строку `apass` в базе со структурой integer (не в массив) вписываешь пустой inputtext без обработки функцией strval. strval - считывает целочисленное значение из строки.


К примеру:
C++:
// неверный вариант. вероятнее всего, inputtext точно так же выдаст число 52.
if(inputtext != 99)
    return SendClientMessage(playerid, -1, "Число не равно 99");

// верный вариант с функцией strval (считывание целочисленного значения из строки)
if(strval(inputtext) != 99)
    return SendClientMessage(playerid, -1, "Число не равно 99");
Пользователь
Регистрация
14 Авг 2023
Сообщения
166
Сохраняется целое число integer, В коде диалога не вижу ниодной проверки на ввод ТОЛЬКО чисел в поле.
Проверка на ввод в forward'е
Код:
forward CheckApass(playerid);
public CheckApass(playerid)
{
    new name[MAX_PLAYER_NAME];
    new glstr[256];
    GetPlayerName(playerid, name, sizeof(name)); //Получаем ник
    {
        SendClientMessage(playerid,-1,"Вы успешно вошли в систему"); //сообщение если игрок вошёл в систему
        player_info[playerid][ALOG] = 1;
        format(glstr, 256, "[A] %s вошёл как администратор %d уровня.",name, player_info[playerid][ADMIN]); //Форматируем сообщение в Админ чат
        AdmChat(COLOR_WHITE,glstr); //отправляем сообщение в админ-чат
    }
    return 1;
}
 
𝚖𝚎𝚖𝚎𝚗𝚝𝚘 𝚖𝚘𝚛𝚒.
Команда форума
Администратор
Регистрация
13 Мар 2022
Сообщения
1,080
𝚖𝚎𝚖𝚎𝚗𝚝𝚘 𝚖𝚘𝚛𝚒.
Команда форума
Администратор
Регистрация
13 Мар 2022
Сообщения
1,080
Проверка на ввод в forward'е
Код:
forward CheckApass(playerid);
public CheckApass(playerid)
{
    new name[MAX_PLAYER_NAME];
    new glstr[256];
    GetPlayerName(playerid, name, sizeof(name)); //Получаем ник
    {
        SendClientMessage(playerid,-1,"Вы успешно вошли в систему"); //сообщение если игрок вошёл в систему
        player_info[playerid][ALOG] = 1;
        format(glstr, 256, "[A] %s вошёл как администратор %d уровня.",name, player_info[playerid][ADMIN]); //Форматируем сообщение в Админ чат
        AdmChat(COLOR_WHITE,glstr); //отправляем сообщение в админ-чат
    }
    return 1;
}
Тут так же нет никакой проверки на число.
 
𝚖𝚎𝚖𝚎𝚗𝚝𝚘 𝚖𝚘𝚛𝚒.
Команда форума
Администратор
Регистрация
13 Мар 2022
Сообщения
1,080
Мне не надо сделать проверку, у меня в БД просто не правильно сохраняется и из БД не извлекается
Речь идет про диалог DLG_NEWAPASS. При сохранении нового пароля нет никакой проверки на ввод числа.
 
Пользователь
Регистрация
14 Авг 2023
Сообщения
166
Код:
[03/30/24 09:06:03] [ERROR] cache_get_value_name_int: no active cache (C:\Users\Тигран\Documents\Mod\gamemodes\project.pwn:1104)
[03/30/24 09:08:53] [ERROR] cache_get_value_name: no active cache (C:\Users\Тигран\Documents\Mod\gamemodes\project.pwn:1104)
[03/30/24 09:23:22] [ERROR] error #1064 while executing query "INSERT INTO `users` SET `apass` = '52' WHERE `id` ='8'": You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'WHERE `id` ='8'' at line 1 (C:\Users\Тигран\Documents\Mod\gamemodes\project.pwn:1138)
 
Пользователь
Регистрация
14 Авг 2023
Сообщения
166
𝚖𝚎𝚖𝚎𝚗𝚝𝚘 𝚖𝚘𝚛𝚒.
Команда форума
Администратор
Регистрация
13 Мар 2022
Сообщения
1,080
Пользователь
Регистрация
14 Авг 2023
Сообщения
166
𝚖𝚎𝚖𝚎𝚗𝚝𝚘 𝚖𝚘𝚛𝚒.
Команда форума
Администратор
Регистрация
13 Мар 2022
Сообщения
1,080
C++:
// проверка на число в поле ввода
stock isNumeric(const string[]) {
    new i;
    while(string[i]) switch(string[i++])
    {
        case '0'..'9':
            continue;
        default:
            return false;
    }
    return true;
}

C++:
case DLG_NEWAPASS:
{
    if(response)
    {
        new name[MAX_PLAYER_NAME];
        new glstr[512];
        
        if(!isNumeric(inputtext))
            return SendClientMessage(playerid, -1, "Ввести можно только число!");
        
        GetPlayerName(playerid, name, sizeof(name)); //Ïîëó÷àåì íèê
        player_info[playerid][APASS] = strval(inputtext); //Ôèêñèðóåì ïàðîëü â ïåðåìåííîé
        //
        static const fmt_query[] = "UPDATE `users` SET `apass` = '%d' WHERE `id` ='%d'";
        new query[sizeof(fmt_query)+(-2+4)+(-2+8)];
        format(query, sizeof(query), fmt_query, player_info[playerid][APASS], player_info[playerid][ID]);
        mysql_query(dbHandle, query, false);
        //
        SendClientMessage(playerid,-1,"Âû óñïåøíî âîøëè â ñèñòåìó"); //Ñîîáùåíèå èãðîêó
        player_info[playerid][ALOG] = 1;
        format(glstr, 256, "[A] %s âîø¸ë êàê àäìèíèñòðàòîð %d óðîâíÿ.",name, player_info[playerid][ADMIN]); //Ôîðìàòèðóåì ñîîáùåíèå àäìèíèñòðàòîðàì
        AdmChat(COLOR_WHITE,glstr); //îòïðàâëÿåì ñîîáùåíèå àäìèíèñòðàòîðàì
 
𝚖𝚎𝚖𝚎𝚗𝚝𝚘 𝚖𝚘𝚛𝚒.
Команда форума
Администратор
Регистрация
13 Мар 2022
Сообщения
1,080
Проблемы в этот раз уже не будет. Проблема была в одном - ты в строку `apass` в базе со структурой integer (не в массив) вписываешь пустой inputtext без обработки функцией strval. strval - считывает целочисленное значение из строки.


К примеру:
C++:
// неверный вариант. вероятнее всего, inputtext точно так же выдаст число 52.
if(inputtext != 99)
    return SendClientMessage(playerid, -1, "Число не равно 99");

// верный вариант с функцией strval (считывание целочисленного значения из строки)
if(strval(inputtext) != 99)
    return SendClientMessage(playerid, -1, "Число не равно 99");
 
Пользователь
Регистрация
14 Авг 2023
Сообщения
166
Проблемы в этот раз уже не будет. Проблема была в одном - ты в строку `apass` в базе со структурой integer (не в массив) вписываешь пустой inputtext без обработки функцией strval. strval - считывает целочисленное значение из строки.


К примеру:
C++:
// неверный вариант. вероятнее всего, inputtext точно так же выдаст число 52.
if(inputtext != 99)
    return SendClientMessage(playerid, -1, "Число не равно 99");

// верный вариант с функцией strval (считывание целочисленного значения из строки)
if(strval(inputtext) != 99)
    return SendClientMessage(playerid, -1, "Число не равно 99");
Спасибо в бд все норм записалось
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху