Дак яж не спорю, просто кто-то называет это геморный вариант, и предложил прыганье по страницам с использованием лимита именно в запросе
А, то есть, один раз отправить запрос и после работать с выгруженными данными гемморнее, чем постоянно форматировать и отсылать в базу новый запрос, всё так же выгружая данные и так же работая с кэшем, что и в первом варианте? Тот, кто тебе это посоветовал, явно знает как жить (нет).
Иными словами, в варианте с LIMIT ты лишь добавишь дополнительную отправку запроса в базу, тратя на это процессорное время и усложнив код в несколько раз. Весь остальной код у тебя будет практически таким же, за исключением отсутствия удаления кэша (но отчищать переменные при закрытии диалога всё так же придётся, а так же придётся как-то определять какую именно строку выбрал игрок, соотнося её с данными в таблице).
В общем, твой советчик - Григорий Остер от мира программирования :)
Спасибо за пояснение)
UPD, по теме.
Вообщем, я по пробовал работать с индексом.
По страницам бегаю отлично, но, беда в том, что после первого ввода команды, выходит ошибка с нет активного кэша.
И сам диалог:PHP код:
new string[78 + MAX_PLAYER_NAME + 50];
format(string, sizeof(string), "SELECT * FROM `"TABLES"` WHERE BINARY `nickname`='%s' AND `dates`='%s' ORDER BY `mysql_id` DESC;",names_player,dates3);
mysql_function_query(m_connect, string, true, "OnLoadCallBack", "d",playerid);
forward OnLoadCallBack(playerid);
public OnLoadCallBack(playerid)// Пришёл ответ из самого стока
{
new rows = cache_get_row_count(m_connect);
if(rows == 0) return SCMError(playerid,"[Log Info]: {FFFFFF}Логов не найдено.");
if(GetPVarInt(playerid,"ID_Test") == 1)
{
DeletePVar(playerid,"_NickName");
DeletePVar(playerid,"ID_Test");
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,"ID_Test",1);
Show_PlayerListID(playerid);
return 1;
}
stock Show_PlayerListID(playerid)
{
if(CacheID_List[playerid] == Cache:-1) return SCMError(playerid, "[Server]: {FFFFFF}Нет активного кэша с информацией");
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",m_connect);
cache_get_field_content(i, "nickname", load_name,m_connect,MAX_PLAYER_NAME);
cache_get_field_content(i, "p_act", load_p_act,m_connect,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[27];
format(str,sizeof(str),""COLOR_SERVER"%s",load_name);
SPD(playerid, dID_A_Panel_Logs, DIALOG_STYLE_LIST, str, dialog_string, "Выбор", "Отмена");
SetPVarString(playerid,"log_NickName",load_name);
return 1;
}
Ошибка:PHP код:
stock Show_InPlayer(playerid,listitem)
{
new idx = PageID_List[playerid]*PageCount_List[playerid]+listitem;
printf("idx: %d",idx);
new test_0[30],test_1[30],test_2[30],test_3[30];
new load_name[MAX_PLAYER_NAME];
cache_get_field_content(idx,"test_1",test_0,Mysql_Log,30);
cache_get_field_content(idx,"test_2",test_1,Mysql_Log,30);
cache_get_field_content(idx,"test_3",test_2,Mysql_Log,30);
cache_get_field_content(idx,"test_4",test_3,Mysql_Log,30);
//=========//
GetPVarString(playerid,"_NickName",load_name,MAX_PLAYER_NAME);
new str_r[400];
format(str_r,sizeof(str_r),"%s\n%s\n%s\%s",load_name,test_0,test_1,test_2,test_3);
SPD(playerid, dID_Dialog, DIALOG_STYLE_MSGBOX, "Info", str_r, "Ок","Назад");
return 1;
}
Я так понимаю, что жалуется на загрузку данных из стока, НО, вот вопрос, если idx совпадает, и всё как бы нормально должно быть, почему же ошибка?PHP код:
[07:31:28 08/30/19] [WARNING] cache_get_field_content - no active cache
[07:31:28 08/30/19] [WARNING] cache_get_field_content - no active cache
[07:31:28 08/30/19] [WARNING] cache_get_field_content - no active cache
[07:31:28 08/30/19] [WARNING] cache_get_field_content - no active cache
Она появляется именно тогда, когда кэша в принципе и не может быть, жмем в диалоге кнопку назад, и снова нажимаем на 1 наименование из списка, и вуаля, всё нормально работает, закрываем диалог, открываем снова, и снова ошибка с загрузкой данных....
cache_set_active используй при всяком обращении к сохранённому кэшу. Стоит отправить какой-то другой запрос в БД и плагин сразу переключается с твоего сохранённого кэша, из-за чего ошибка и появляется.
Хорошо, добавляем cache_set_active в сток с показом инфы, вводим команду, нажимаем на 1 из пунктов в диалоге, инфа появляется, пробуем повторить комбинацию ещё несколько раз, работает, НО, на 4-тый раз уже всё не так, на 5-тый раз уже всё ломается, непонятно почему...
Ошибка:
PHP код:
[15:47:55 08/30/19] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('42') (Query: "SELECT * FROM `accounts` WHERE BINARY `nickname`='Names' AND `dates`='28/08/2019' ORDER BY `mysql_id` DESC;")
[15:47:55 08/30/19] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('42') (Query: "SELECT * FROM `accounts` WHERE BINARY `nickname`='Names' AND `dates`='28/08/2019' ORDER BY `mysql_id` DESC;")
[15:47:55 08/30/19] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('42') (Query: "SELECT * FROM `accounts` WHERE BINARY `nickname`='Names' AND `dates`='28/08/2019' ORDER BY `mysql_id` DESC;")
[15:47:55 08/30/19] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('42') (Query: "SELECT * FROM `accounts` WHERE BINARY `nickname`='Names' AND `dates`='28/08/2019' ORDER BY `mysql_id` DESC;")
Эмм, а это тот запрос, с которым ты работаешь изначально? Если нет, то не везде проставил cache_set_active
Если это изначальный запрос, значит проблема в формуле, по которой определяешь индекс строки. Ну той, которая
Логируй все переменные.Цитата:
"номер_страницы*максимальное_число_строк_на_странице+listitem"
Система, на самом деле, крайне простая. Главное раз вникнуть и понять принципы её работы. Там всё работает на нескольких переменных и, при этом, нет никаких лимитов на количество данных, которые возвращаются из базы.