Странная ерунда, перелистываем на вторую страницу, открываем информацию, и получаем ошибку... Возвращаемся на первую страницу, открываем информацию, всё нормально...
Так а что странного? Ты либо показываешь вторую страницу, хотя данных у тебя есть только на первую/выбираешь пункт, которого не существует, либо у тебя ошибки в формулах/в присвоении значений переменным.
Повторяю уже, наверное, в третий раз: вместо этих рассуждений о странностях просто залогируй свой код и изучи логи на предмет странностей. Делов на 10 минут, если заняться.
Эмм, что? Если у тебя в бд есть данные и на вторую страницу, то ты выгружаешь их СРАЗУ в кэш и уже дальше работаешь с кэшем. Никаких повторных запросов не потребуется. В этом и смысл такого метода.
Я же тебе выше давал практически готовый код на pVar. Там остаётся только внутренности диалога дописать и всё.
Яя кароче понял, проблема в самой формуле, т.е, если у нас открыта первая страница всё нормально, перелиснул страницу на другую, сделал формулу в обратном направлении, как-бы и открывает информацию, но, неправильную)
UPD: не могу я вообщем придумать универсальную формулу, ничего не получается
Покажи весь код, что у тебя получился сейчас.
Ничего не изменилось, ибо работал по разным направлениям, искал баг возможно с переменными, и в итоге пришёл был к тому, что формула работает только в 1-дно стороннем порядке, новую я сделать увы не могу...
UPD: Обновил подсчётыPHP код:
new names_player[MAX_PLAYER_NAME];
strmid(names_player,"Test_Names",0,strlen("Test_Names"),MAX_PLAYER_NAME);
new dates3[12];
format(dates3,sizeof(dates3),"28/08/2019");
new string[78 + MAX_PLAYER_NAME + 50];
format(string, sizeof(string), "SELECT * FROM `prizz` WHERE BINARY `nickname`='%s' AND `dates`='%s' ORDER BY `mysql_id` DESC;",names_player,dates3);
mysql_function_query(m_connect, string, true, "OnLoadIRSCallBack", "d",playerid);
forward OnLoadIRSCallBack(playerid);
public OnLoadIRSCallBack(playerid)// Пришёл ответ от запроса
{
new rows = cache_get_row_count(m_connect);
if(rows == 0) return SCM(playerid,-1,"ничего нет");
if(GetPVarInt(playerid,"tr_ID_Player") == 1)
{
DeletePVar(playerid,"_NickName");
DeletePVar(playerid,"tr_ID_Player");
DeletePVar(playerid,"UpdateIDPlayer");
cache_delete(Cache:CacheID_List[playerid],m_connect);
PageCount_List[playerid] = _:CacheID_List[playerid] = -1;
}
CacheID_List[playerid] = cache_save(m_connect);
PageID_List[playerid] = 0;
PageCount_List[playerid] = rows;
SetPVarInt(playerid,"tr_ID_Player",1);
Show_PlayerListID(playerid);
return 1;
}
stock Show_PlayerListID(playerid)
{
if(CacheID_List[playerid] == Cache:-1) return SCM(playerid,-1,"Нет активного кэша с информацией");
cache_set_active(CacheID_List[playerid],m_connect);
static dialog_string[750];
dialog_string[0] = EOS;
new load_p_act[30],rows,i,load_name[MAX_PLAYER_NAME],load_mysql_dd;
i = PageID_List[playerid]*20;
rows = i+20;
if(rows > PageCount_List[playerid]) rows = PageCount_List[playerid];
for(; i < rows; i++)
{
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_string, sizeof(dialog_string), "%s[%d] | %s\n", dialog_string,load_mysql_dd, load_p_act);
}
if(PageCount_List[playerid] > MAX_ROWS_LIST && rows != PageCount_List[playerid]) strcat(dialog_string, "Далее \n");
if(PageID_List[playerid] != 0) strcat(dialog_string, "Назад");
new str[30];
format(str,sizeof(str),"{FFFFFF}%s",load_name);
SPD(playerid, 100500, DIALOG_STYLE_LIST, str, dialog_string, "Выбор", "Отмена");
SetPVarString(playerid,"_NickName",load_name);
return 1;
}
case 100500:
{
if(response)
{
if(!strcmp_with_isnull(inputtext, "Далее >>>"))
{
SetPVarInt(playerid,"UpdateIDPlayer",2);
PageID_List[playerid] ++;
Show_PlayerListID(playerid);
return 1;
}
else if(!strcmp_with_isnull(inputtext, "<<< Назад"))
{
SetPVarInt(playerid,"UpdateIDPlayer",1);
if(PageID_List[playerid] != 0)PageID_List[playerid] --;
else if(PageID_List[playerid] == 0) PageID_List[playerid] = 0;
Show_PlayerListID(playerid);
return 1;
}
else Show_InPlayers(playerid,listitem);
}
}
stock Show_InPlayers(playerid,listitem)
{
new count[3] = 0;
count[0] = PageID_List[playerid];
count[1] = PageCount_List[playerid];
new idx;
if(GetPVarInt(playerid,"UpdateIDPlayer") == 2) idx = count[0]*count[1]+listitem;
else if(GetPVarInt(playerid,"UpdateIDPlayer") == 1) idx = idx = count[0]*count[1]-listitem;
printf("idx: %d",idx);
new load_act[30],load_result_1[30],load_result_2[30],load_Dates[30];
new load_name[MAX_PLAYER_NAME];
cache_set_active(CacheID_List[playerid],m_connect);
cache_get_field_content(idx,"p_act",load_act,m_connect,30);
cache_get_field_content(idx,"result_1",load_result_1,m_connect,30);
cache_get_field_content(idx,"result_2",load_result_2,m_connect,30);
cache_get_field_content(idx,"p_date",load_Dates,m_connect,30);
//=========//
GetPVarString(playerid,"_NickName",load_name,MAX_PLAYER_NAME);
new str_r[400];
format(str_r,sizeof(str_r),"%s\n%s\n%s\n%s",load_name,load_act,load_result_1,load_result_2,load_Dates);
SPD(playerid, 100501, DIALOG_STYLE_MSGBOX, "Информация", str_r, "Ок","Назад");
return 1;
}
Для первой и второй страницы работает отлично, перехожу на 3-тью, и снова подсчёты нужно менять)PHP код:
new idx[2];
if(GetPVarInt(playerid,"UpdateLogPlayer") == 1) idx[1] = count[0]*count[1]+listitem;
else if(GetPVarInt(playerid,"UpdateLogPlayer") == 2) idx[0] = count[1]+count[0],idx[1] = idx[0]/(count[0]+count[0])+listitem-count[0];
else if(GetPVarInt(playerid,"UpdateLogPlayer") == 3) idx[1] = count[1]+listitem-count[0];
Как-то не очень хочется для каждой страницы делать нужные именно этой странице подсчёты.
Эмм, что у тебя тут за каша?
new idx;
Зачем тут разные формулы? Формула всегда будет одна: сначала количество страниц умножаешь на максимальное число строк на странице, тем самым узнавая какой первый ID строки будет показываться на этой странице, а потом к этому значению прибавляешь значение listitem, получая уже конкретную строку, которую выбрал игрок.
Вообще код крайне запутанным у тебя вышел. Я выше показывал как всё гораздо проще написать.
const PRIZE_MAX_ROW_IN_PAGE = 20; new pVarName__Prize_CacheID[] = "pVarName__Prize_CacheID"; new pVarName__Prize_Page[] = "pVarName__Prize_Page"; new pVarName__Prize_RowIDX[] = "pVarName__Prize_RowIDX"; CMD:test(playerid) { ClearPrizeMySQLInfo(playerid);// Удаляем кэш на случай, если игрок уже работал с кэшем, но открытый диалог закрылся другим диалогом и старый кэш не удалился. new names_player[MAX_PLAYER_NAME]; new dates3[12]; new query_string[80 + MAX_PLAYER_NAME + sizeof(dates3) + 1]; format(query_string, sizeof(query_string), "SELECT * FROM prizz WHERE BINARY nickname='%s' AND dates='%s' ORDER BY mysql_id DESC", names_player,dates3); mysql_tquery(Mysql_Log, query_string, "@MySQL__ShowPrizeList", "i", playerid); return 1; } @MySQL__ShowPrizeList(playerid); @MySQL__ShowPrizeList(playerid) { new row_count; { row_count = cache_get_row_count(); if(!row_count) { SenPrizelientMessage(playerid, 0xFF0000FF, "Ошибка: {FFFFFF}Таблица пуста."); return 1; } } else { cache_set_active(Cache:0); row_count = cache_get_row_count(); } new i = page*PRIZE_MAX_ROW_IN_PAGE; static dialog_string[750]; dialog_string[0] = EOS; new load_p_act[30], load_name[MAX_PLAYER_NAME], load_mysql_dd; for(new j; i < row_count; i++, j++) { if(j == PRIZE_MAX_ROW_IN_PAGE) break; 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); format(dialog_string, sizeof(dialog_string), "%s[%d] | %s\n", dialog_string, load_mysql_dd, load_p_act); } if(row_count > (page*PRIZE_MAX_ROW_IN_PAGE)+PRIZE_MAX_ROW_IN_PAGE) { if(page > 0) { } } else if(page > 0) { } new dialog_header[8+MAX_PLAYER_NAME+1]; SPD(playerid, 100500, DIALOG_STYLE_LIST, dialog_header, dialog_string, "Выбор", "Отмена"); return 1; } { if(dialogid == 100500) { if(!response) { ClearPrizeMySQLInfo(playerid); return 1; } { @MySQL__ShowPrizeList(playerid); } { @MySQL__ShowPrizeList(playerid); } else { cache_set_active(Cache:0); new row_count = cache_get_row_count(); new idx = PRIZE_MAX_ROW_IN_PAGE*page+listitem; new load_act[30], load_result_1[30], load_result_2[30], load_Dates[30], load_name[MAX_PLAYER_NAME]; cache_get_field_content(idx, "nickname", load_name, m_connect); cache_get_field_content(idx, "p_act", load_act, m_connect); cache_get_field_content(idx, "result_1", load_result_1, m_connect); cache_get_field_content(idx, "result_2", load_result_2, m_connect); cache_get_field_content(idx, "p_date", load_Dates, m_connect); //=========// new str_r[400]; format(str_r, sizeof(str_r),"%s\n%s\n%s\n%s", load_name, load_act, load_result_1, load_result_2, load_Dates); SPD(playerid, 100501, DIALOG_STYLE_MSGBOX, "Информация", str_r, "Ок","Назад"); } return 1; } else if(dialogid == 100501) { if(!response) { @MySQL__ShowPrizeList(playerid); return 1; } cache_set_active(Cache:0); new string[144+1]; cache_get_field_content(idx, "nickname", string, m_connect, MAX_PLAYER_NAME); ClearPrizeMySQLInfo(playerid); return 1; } return 1; } { ClearPrizeMySQLInfo(playerid); return 1; } stock ClearPrizeMySQLInfo(playerid) { { } return 1; }
На ошибки не проверял, но общий принцип работы с кэшем должен быть таким. Никаких формул для каждой отдельной страницы не нужно.