PDA

Просмотр полной версии : [Вопрос] Загрузка вещей из инвентаря



verteich
24.05.2019, 20:27
Подскажите, как можно реализовать систему загрузки вещей из инвентаря MySQL r39-6
enum e_inventar_INFO {
e_IItemId,
e_ICount
}
new pInventory[MAX_PLAYERS][e_inventar_INFO][37];
stock SaveInventory(playerid)
{
new quers[440],stris[330];
for(new l; l < 36; l++)
{
format(stris, sizeof(stris), "%s%d,",stris,pInventory[playerid][e_IItemId][l]);
format(quers,sizeof(quers),"UPDATE `qelksekm` SET `inventory`='%s' WHERE `NickName`='%s'",stris, PN(playerid));
mysql_query(mysql, quers);
stris[0] = EOS;
format(stris, sizeof(stris), "%s%d,",stris,pInventory[playerid][e_ICount][l]);
format(quers,sizeof(quers),"UPDATE `qelksekm` SET `inventorykolvo`='%s' WHERE `NickName`='%s'",stris, PN(playerid));
mysql_query(mysql, quers);
}
}

DeimoS
24.05.2019, 23:51
Во-первых, что это за сохранение? Формируй один большой запрос и отправляй, а не флуди кучей мелких запросов.
Хотя запрос сам по себе странный. У тебя каждый раз одна и та же строка будет перезаписываться данными всех слотов и, в итоге, в таблице будут только данные последнего слота.

Во-вторых, всё зависит от того, как ты хранишь данные. Лучше всего создать отдельную таблицу со структурой:

id | account_id | slot_id | item_id | item_count
При этом, нужно создать индекс по столбцу "account_id", чтоб поиск был быстрым.

Собственно, далее просто делаешь запрос

SELECT * FROM table WHERE account_id = %d ORDER BY slot_id ASC
И выгружаешь. Столбец "slot_id" будет указывать номер ячейки.
А заодно проверяешь, существуют ли в таблице столбцы для всех нужных слотов (просто создай локальный массив, размер которого будет равен количеству слотов, и при загрузке присваивай ячейкам, равным ID слота, единицу. А после загрузки запускай цикл и смотри, все ли ячейки в этом массиве равны единице. Если не все - отправляй запрос на создание недостающих столбцов).

Сохранение лучше делать сразу после изменения данных и сохранять конкретную ячейку.

verteich
25.05.2019, 07:48
По загрузке понял, по сохранению не очень, вы имели ввиду так? (таблицу отдельная больно не нужна, удобней будет в одной, для меня):
stock SaveInventory(playerid)
{
new quers[1000];
for(new l; l < 36; l++)
{
format(quers,sizeof(quers),"UPDATE `qelksekm` SET `inventory`='%s%d,', `inventorykolvo`='%s%d,' WHERE `NickName`='%s'",pInventory[playerid][e_IItemId][l], pInventory[playerid][e_ICount][l], PN(playerid));
mysql_query(mysql, quers);
}
}

DeimoS
25.05.2019, 10:54
В смысле? У тебя запрос работает с одними и теми же полями - "inventory" и "inventorykolvo". Соответственно, каждую итерацию эти поля будут перезаписываться новой информацией. И, в итоге, в поле будет записана лишь информация из последнего слота.

Хотя в текущем виде запрос вообще что-то непонятное будет отсылать, ибо форматирование у тебя вообще непонятно как реализовано. Ты хоть код проверял, перед тем, как сюда писать? Ну или хотя бы вдумывался, когда писал его?

verteich
25.05.2019, 14:07
В смысле? У тебя запрос работает с одними и теми же полями - "inventory" и "inventorykolvo". Соответственно, каждую итерацию эти поля будут перезаписываться новой информацией. И, в итоге, в поле будет записана лишь информация из последнего слота.

Хотя в текущем виде запрос вообще что-то непонятное будет отсылать, ибо форматирование у тебя вообще непонятно как реализовано. Ты хоть код проверял, перед тем, как сюда писать? Ну или хотя бы вдумывался, когда писал его?

не понял, но код не работает :D и не вдумывался
покажи рабочий вариант не пойму ни***

DeimoS
25.05.2019, 18:17
Я уже в первом сообщении расписал как всё сделать. Осталось лишь в код превратить всё. Если нужен рабочий код - это уже в стол заказов.