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

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

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

Зарегистрироваться!
Статус
В этой теме нельзя размещать новые ответы.
Пользователь
Регистрация
14 Авг 2023
Сообщения
158
Пароль от админки неправильно сохраняется в базу данных и получает от туда число 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
Сообщения
158
Сохраняется целое число 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,069
𝚖𝚎𝚖𝚎𝚗𝚝𝚘 𝚖𝚘𝚛𝚒.
Команда форума
Администратор
Регистрация
13 Мар 2022
Сообщения
1,069
Проверка на ввод в 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,069
Мне не надо сделать проверку, у меня в БД просто не правильно сохраняется и из БД не извлекается
Речь идет про диалог DLG_NEWAPASS. При сохранении нового пароля нет никакой проверки на ввод числа.
 
Пользователь
Регистрация
14 Авг 2023
Сообщения
158
Код:
[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
Сообщения
158
𝚖𝚎𝚖𝚎𝚗𝚝𝚘 𝚖𝚘𝚛𝚒.
Команда форума
Администратор
Регистрация
13 Мар 2022
Сообщения
1,069
Пользователь
Регистрация
14 Авг 2023
Сообщения
158
𝚖𝚎𝚖𝚎𝚗𝚝𝚘 𝚖𝚘𝚛𝚒.
Команда форума
Администратор
Регистрация
13 Мар 2022
Сообщения
1,069
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,069
Проблемы в этот раз уже не будет. Проблема была в одном - ты в строку `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
Сообщения
158
Проблемы в этот раз уже не будет. Проблема была в одном - ты в строку `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");
Спасибо в бд все норм записалось
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху