Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 3 1 2 3 ПоследняяПоследняя
Показано с 1 по 10 из 30
  1. #1
    Аватар для Сергей
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Сообщений
    161
    Репутация:
    3 ±

    Как сделать систему страниц для диалога с информацией из базы данных

    День добрый
    Вопрос такой, значит делаю кнопки в диалоге: Далее и Назад
    Дело дошло до того, что нужно подгрузить из БД по конкретному mysql_id информацию
    Так вот, нажимаю я допустим в диалоге не на кнопки Далее или Назад, а на информацию

    и в принте следующая информация

    PHP код:
    M-ID: - [ 1394 ] | Авторизован 
    Так вот для того чтобы подгрузить информацию, хочу использовать strdel для того, чтобы удалить всё, кроме чисел: 1394

    И вот логический вопрос, как это сделать?)
    Последний раз редактировалось Сергей; 28.08.2019 в 16:54.

  2. #2
    Аватар для m1n1vv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±
    В чем смысл?

  3. #3
    Аватар для Сергей
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Сообщений
    161
    Репутация:
    3 ±
    Цитата Сообщение от m1n1vv Посмотреть сообщение
    В чем смысл?
    Дальше мне нужно загрузить данные, и показать их игроку, а чтобы их загрузить нужен mysql_id в моем случае это
    1394
    Или вот ещё вопрос, как можно скрыть mysql_id при отображении диалогового окна
    Т.е в данный момент так:

    PHP код:
    load_mysql_dd cache_get_field_content_int(i"mysql_id",m_connect); 
    cache_get_field_content(i"p_act"load_p_act,Mysql_Log,30);
    format(dialog_stringsizeof(dialog_string), "%s[%d] | %s\n"dialog_string,load_mysql_ddload_p_act); 
    Вот убрать из диалога, это легко, но, дальше мне нужно будет работать с mysql_id
    Я могу сейчас с ним в принципе работать, но, при условии того, что он остается в диалоге.
    НО, я же не ищу легких путей, и хочу избавиться от него именно в диалоговом окне, может записывать все mysql_id'ы в переменную?
    Последний раз редактировалось Сергей; 28.08.2019 в 17:50.

  4. #4
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    А не проще сохранить кэш и при выборе конкретного пункта просто работать с кэшем? Параметр listitem будет идентичен индексу строки в кэше. Если у тебя диалог может содержать несколько страниц, то тот же самый индекс можно получить по формуле "номер_страницы*максимальное_число_строк_на_странице+listitem"
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  5. #5
    Аватар для Сергей
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Сообщений
    161
    Репутация:
    3 ±
    Хорошо, вот к примеру вся система целиком:


    После запроса, ответ.
    PHP код:
        CacheID_List[playerid] = cache_save(Mysql_Log);
        
    PageID_List[playerid] = 0;
        
    PageCount_List[playerid] = rows
    #define MAX_ROWS_LIST 20
    PHP код:
    forward Show_PlayerListID(playerid);
    public 
    Show_PlayerListID(playerid

        if(
    CacheID_List[playerid] == Cache:-1) return SCMError(playerid"[Server]: {FFFFFF}Нет активного кэша с информацией"); 
        
    cache_set_active(CacheID_List[playerid],Mysql_Log); 

        static 
    dialog_string[750];
        
    dialog_string[0] = EOS;
        new 
    load_p_act[30],rows,i,load_name[MAX_PLAYER_NAME],load_mysql_dd
        
    PageID_List[playerid]*20
        
    rows i+20
        if(
    rows PageCount_List[playerid]) rows PageCount_List[playerid]; 
        for(; 
    rowsi++)  
        {
            
    load_mysql_dd cache_get_field_content_int(i"mysql_id",Mysql_Log); 
            
    cache_get_field_content(i"nickname"load_name,Mysql_Log,MAX_PLAYER_NAME);         
            
    cache_get_field_content(i"p_act"load_p_act,Mysql_Log,30);  
            
    format(dialog_stringsizeof(dialog_string), "%s[%d] | %s\n"dialog_string,load_mysql_ddload_p_act); 
        }  
        if(
    PageCount_List[playerid] > MAX_ROWS_LIST && rows != PageCount_List[playerid])   strcat(dialog_string"Далее\n"); 
        if(
    PageID_List[playerid] != 0strcat(dialog_string"Назад"); 
        
        
        new 
    str[26];
        
    format(str,sizeof(str),"%s",load_name);
        
    SPD(playeriddID_Dialog_pyatbDIALOG_STYLE_LISTstrdialog_string"Выбор""Отмена");  
        return 
    1

    В диалоге:
    PHP код:
                if(!strcmp_with_isnull(inputtext"Далее >>>"))
                    {
                        
    PageID_List[playerid] += 1;
                        
    Show_PlayerListID(playerid);
                        return 
    1;
                    }
                    else if(!
    strcmp_with_isnull(inputtext"<<< Назад"))
                    {
                        
    PageID_List[playerid] -= 1;
                        
    Show_PlayerListID(playerid);
                        return 
    1;
                    }
                    else
                    {
    printf("Kol_Vo: %d",PageID_List[playerid]*PageCount_List[playerid]+listitem);

                                    } 
    Складываем формулу, и получаем результат, в итоге ко мне не приходит то, что сейчас делать дальше с ней

  6. #6
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    1. if(!strcmp_with_isnull(inputtext, "Далее >>>"))
    2. {
    3. PageID_List[playerid] += 1;
    4. Show_PlayerListID(playerid);
    5. return 1;
    6. }
    7. else if(!strcmp_with_isnull(inputtext, "<<< Назад"))
    8. {
    9. PageID_List[playerid] -= 1;
    10. Show_PlayerListID(playerid);
    11. return 1;
    12. }
    13. else
    14. {
    15. new idx = PageID_List[playerid]*PageCount_List[playerid]+listitem;
    16.  
    17. new load_p_act[30],
    18. load_name[MAX_PLAYER_NAME],
    19. load_mysql_dd;
    20. load_mysql_dd = cache_get_field_content_int(idx, "mysql_id",Mysql_Log);
    21. cache_get_field_content(idx, "nickname", load_name,Mysql_Log,MAX_PLAYER_NAME);
    22. cache_get_field_content(idx, "p_act", load_p_act,Mysql_Log,30);
    23.  
    24. printf("RowID: %d\nNicnName: %s\np_act: %s", load_mysql_dd, load_name, load_p_act);
    25. }


    Главное не забывай вовремя удалять кэш (при любом закрытии диалога + при выходе игрока перепроверяй, удалён ли он).
    И тут, кстати, очень хорошо подходят pVar для хранения ID кэша и номера страницы. Количество строк можно узнавать их того же сохранённого кэша.
    Как-то так:
    1. const MAX_ROW_IN_PAGE = 30;
    2. new pVarName__CacheID[] = "pVarName__CacheID";
    3. new pVarName__Page[] = "pVarName__Page";
    4.  
    5. CMD:test(playerid)
    6. {
    7. new query_string[...];
    8. format(query_string, sizeof(query_string), "SELECT ... FROM ... WHERE ...", ...);
    9. mysql_tquery(mysql_connection_ID, query_string, "@MySQL__SomeFunc", "i", playerid);
    10. return 1;
    11. }
    12.  
    13.  
    14. @MySQL__SomeFunc(playerid);
    15. @MySQL__SomeFunc(playerid)
    16. {
    17. new row_count;
    18. if(!GetPVarType(playerid, pVarName__CacheID))
    19. {
    20. cache_get_row_count(row_count);
    21. if(!row_count)
    22. {
    23. SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}Таблица пуста.");
    24. return 1;
    25. }
    26. SetPVarInt(playerid, pVarName__CacheID, _:cache_save());
    27. }
    28. else
    29. {
    30. cache_unset_active();// Это для того, чтоб в лог не писало предупреждение о том, что кэш уже активен, если он действительно был активен
    31. cache_set_active(Cache:GetPVarInt(playerid, pVarName__CacheID));
    32. cache_get_row_count(row_count);
    33. }
    34.  
    35. new page = GetPVarInt(playerid, pVarName__Page);
    36. new i = page*MAX_ROW_IN_PAGE;
    37.  
    38. // Форматируем диалог
    39. return 1;
    40. }

    И если нужно повторно показать диалог, вызываем
    1. @MySQL__SomeFunc(playerid);

    напрямую.

    Ну и удаление кэша можно сделать так:
    1. stock SomeFunc(playerid)
    2. {
    3. if(GetPVarType(playerid, pVarName__CacheID))
    4. {
    5. cache_delete(Cache:GetPVarInt(playerid, pVarName__CacheID));
    6. DeletePVar(playerid, pVarName__CacheID);
    7. DeletePVar(playerid, pVarName__Page);
    8. }
    9. return 1;
    10. }
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  7. #7
    Аватар для Сергей
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Сообщений
    161
    Репутация:
    3 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    1. if(!strcmp_with_isnull(inputtext, "Далее >>>"))
    2. {
    3. PageID_List[playerid] += 1;
    4. Show_PlayerListID(playerid);
    5. return 1;
    6. }
    7. else if(!strcmp_with_isnull(inputtext, "<<< Назад"))
    8. {
    9. PageID_List[playerid] -= 1;
    10. Show_PlayerListID(playerid);
    11. return 1;
    12. }
    13. else
    14. {
    15. new idx = PageID_List[playerid]*PageCount_List[playerid]+listitem;
    16.  
    17. new load_p_act[30],
    18. load_name[MAX_PLAYER_NAME],
    19. load_mysql_dd;
    20. load_mysql_dd = cache_get_field_content_int(idx, "mysql_id",Mysql_Log);
    21. cache_get_field_content(idx, "nickname", load_name,Mysql_Log,MAX_PLAYER_NAME);
    22. cache_get_field_content(idx, "p_act", load_p_act,Mysql_Log,30);
    23.  
    24. printf("RowID: %d\nNicnName: %s\np_act: %s", load_mysql_dd, load_name, load_p_act);
    25. }


    Главное не забывай вовремя удалять кэш (при любом закрытии диалога + при выходе игрока перепроверяй, удалён ли он).
    И тут, кстати, очень хорошо подходят pVar для хранения ID кэша и номера страницы. Количество строк можно узнавать их того же сохранённого кэша.
    Как-то так:
    1. const MAX_ROW_IN_PAGE = 30;
    2. new pVarName__CacheID[] = "pVarName__CacheID";
    3. new pVarName__Page[] = "pVarName__Page";
    4.  
    5. CMD:test(playerid)
    6. {
    7. new query_string[...];
    8. format(query_string, sizeof(query_string), "SELECT ... FROM ... WHERE ...", ...);
    9. mysql_tquery(mysql_connection_ID, query_string, "@MySQL__SomeFunc", "i", playerid);
    10. return 1;
    11. }
    12.  
    13.  
    14. @MySQL__SomeFunc(playerid);
    15. @MySQL__SomeFunc(playerid)
    16. {
    17. new row_count;
    18. if(!GetPVarType(playerid, pVarName__CacheID))
    19. {
    20. cache_get_row_count(row_count);
    21. if(!row_count)
    22. {
    23. SendClientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}Таблица пуста.");
    24. return 1;
    25. }
    26. SetPVarInt(playerid, pVarName__CacheID, _:cache_save());
    27. }
    28. else
    29. {
    30. cache_unset_active();// Это для того, чтоб в лог не писало предупреждение о том, что кэш уже активен, если он действительно был активен
    31. cache_set_active(Cache:GetPVarInt(playerid, pVarName__CacheID));
    32. cache_get_row_count(row_count);
    33. }
    34.  
    35. new page = GetPVarInt(playerid, pVarName__Page);
    36. new i = page*MAX_ROW_IN_PAGE;
    37.  
    38. // Форматируем диалог
    39. return 1;
    40. }

    И если нужно повторно показать диалог, вызываем
    1. @MySQL__SomeFunc(playerid);

    напрямую.

    Ну и удаление кэша можно сделать так:
    1. stock SomeFunc(playerid)
    2. {
    3. if(GetPVarType(playerid, pVarName__CacheID))
    4. {
    5. cache_delete(Cache:GetPVarInt(playerid, pVarName__CacheID));
    6. DeletePVar(playerid, pVarName__CacheID);
    7. DeletePVar(playerid, pVarName__Page);
    8. }
    9. return 1;
    10. }
    Хорошо, а без использования кэша, и всей этой кучи мороки, проще же будет прыгать по лимитам?

  8. #8
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Сергей Посмотреть сообщение
    Хорошо, а без использования кэша, и всей этой кучи мороки, проще же будет прыгать по лимитам?
    По каким лимитам?

    Это наоборот самый универсальный и простой способ сделать диалог-список, который может содержать в себе сколько угодно строк одновременно.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  9. #9
    Аватар для Сергей
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Сообщений
    161
    Репутация:
    3 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    По каким лимитам?

    Это наоборот самый универсальный и простой способ сделать диалог-список, который может содержать в себе сколько угодно строк одновременно.
    Каждый раз чистить просто... Я по пробую второй вариант с Пварами и отпишу

  10. #10
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Сергей Посмотреть сообщение
    Каждый раз чистить просто... Я по пробую второй вариант с Пварами и отпишу
    В смысле? Тяжело вставить удаление кэша при выходе из сервера, отмене/закрытии диалога и выполнении действия? Ничего сложного же
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

 

 
Страница 1 из 3 1 2 3 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •