Welcome!

By registering with us, you'll be able to discuss, share and private message with other members of our community.

SignUp Now!

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

Статус
В этой теме нельзя размещать новые ответы.
Авг
170
8
Пользователь
Пароль от админки неправильно сохраняется в базу данных и получает от туда число 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");
Авг
170
8
Пользователь
Сохраняется целое число 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;
}
 
𝚖𝚎𝚖𝚎𝚗𝚝𝚘 𝚖𝚘𝚛𝚒.
Мар
1,147
11,886
Команда форума
Администратор
𝚖𝚎𝚖𝚎𝚗𝚝𝚘 𝚖𝚘𝚛𝚒.
Мар
1,147
11,886
Команда форума
Администратор
Проверка на ввод в 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;
}
Тут так же нет никакой проверки на число.
 
𝚖𝚎𝚖𝚎𝚗𝚝𝚘 𝚖𝚘𝚛𝚒.
Мар
1,147
11,886
Команда форума
Администратор
Мне не надо сделать проверку, у меня в БД просто не правильно сохраняется и из БД не извлекается
Речь идет про диалог DLG_NEWAPASS. При сохранении нового пароля нет никакой проверки на ввод числа.
 
Авг
170
8
Пользователь
Код:
[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)
 
𝚖𝚎𝚖𝚎𝚗𝚝𝚘 𝚖𝚘𝚛𝚒.
Мар
1,147
11,886
Команда форума
Администратор
Авг
170
8
Пользователь
𝚖𝚎𝚖𝚎𝚗𝚝𝚘 𝚖𝚘𝚛𝚒.
Мар
1,147
11,886
Команда форума
Администратор
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); //îòïðàâëÿåì ñîîáùåíèå àäìèíèñòðàòîðàì
 
𝚖𝚎𝚖𝚎𝚗𝚝𝚘 𝚖𝚘𝚛𝚒.
Мар
1,147
11,886
Команда форума
Администратор
Проблемы в этот раз уже не будет. Проблема была в одном - ты в строку `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");
 
Авг
170
8
Пользователь
Проблемы в этот раз уже не будет. Проблема была в одном - ты в строку `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");
Спасибо в бд все норм записалось
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху