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

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

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

Зарегистрироваться!
  • Если Вы желаете помогать развитию проекта, готовы заполнять раздел(-ы) и подсказывать другим пользователям на портале, есть возможность попасть в команду редакторов. Для этого следует обратиться в техническую поддержку
Статус
В этой теме нельзя размещать новые ответы.
Пользователь
Регистрация
14 Авг 2023
Сообщения
111
Пароль от админки неправильно сохраняется в базу данных и получает от туда число 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
Сообщения
111
Сохраняется целое число 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;
}
 
Создатель WayDev
Команда форума
Администратор
Регистрация
13 Мар 2022
Сообщения
881
Создатель WayDev
Команда форума
Администратор
Регистрация
13 Мар 2022
Сообщения
881
Проверка на ввод в 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;
}
Тут так же нет никакой проверки на число.
 
Создатель WayDev
Команда форума
Администратор
Регистрация
13 Мар 2022
Сообщения
881
Мне не надо сделать проверку, у меня в БД просто не правильно сохраняется и из БД не извлекается
Речь идет про диалог DLG_NEWAPASS. При сохранении нового пароля нет никакой проверки на ввод числа.
 
Пользователь
Регистрация
14 Авг 2023
Сообщения
111
Код:
[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
Сообщения
111
Создатель WayDev
Команда форума
Администратор
Регистрация
13 Мар 2022
Сообщения
881
Пользователь
Регистрация
14 Авг 2023
Сообщения
111
Создатель WayDev
Команда форума
Администратор
Регистрация
13 Мар 2022
Сообщения
881
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); //îòïðàâëÿåì ñîîáùåíèå àäìèíèñòðàòîðàì
 
Создатель WayDev
Команда форума
Администратор
Регистрация
13 Мар 2022
Сообщения
881
Проблемы в этот раз уже не будет. Проблема была в одном - ты в строку `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
Сообщения
111
Проблемы в этот раз уже не будет. Проблема была в одном - ты в строку `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");
Спасибо в бд все норм записалось
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху