PDA

Просмотр полной версии : [Вопрос] Вопрос про sscanf



JohnConor
05.05.2017, 20:46
Возможно ли как-то при использовании sscanf сохранять в опр место массива?

Код:


cache_get_value_name(0, "InvRow1",InvMassif[0],45);
cache_get_value_name(0, "InvRow2",InvMassif[1],45);
sscanf(InvMassif[0], "p<,>a<i>[4]",InvContent1[playerid]);
sscanf(InvMassif[1], "p<,>a<i>[4]",InvContent2[playerid]);


Это инвентарь в бд там по 4 ячейки хранится, а всего таких рядов 6 получается 24 ячейки в один массив, но как их закинуть через sscanf в один массив, ибо так получается не удобно использовать массив для каждого ряда с 0 по 3 для данных от инвентаря -*

DeimoS
05.05.2017, 20:59
Я бы на твоём месте не занимался мазохизмом, пытаясь скомкать все данные в одной таблице, а просто создал отдельную таблицу под инвентарь и связал бы его с таблицей аккаунтов через ID этих самых аккаунтов. И удобнее будет редактировать данные из БД, и из мода работать с данными будет проще (если нужно будет сохранить какое-либо значение, не нужно будет заниматься форматированием строки и т.п.). Это не файлы, где не разгуляешься особо без бубна. SQL тем и хорош, что одной простой строкой (запросом) позволяет достать нужные данные

Опиши подробнее как у тебя работает инвентарь и что именно ты в нём сохраняешь/планируешь сохранять. И я тебе подскажу какую структуру можно сделать для таблиц

JohnConor
05.05.2017, 21:14
Я сразу это в другой таблице, а структура следующая 24 слота у инвентаря, у каждого слота 3 переменных (1 - ид хранимого слота, 2 - кол-во, 3 - различные данные о хранимых вещах)

А ничего что мод будет сохранять/считывать/изменять 72 ячейки в бд будет, мне просто показалось что хранить по рядам лучше будет?

DeimoS
05.05.2017, 21:23
Я сразу это в другой таблице, а структура следующая 24 слота у инвентаря, у каждого слота 3 переменных (1 - ид хранимого слота, 2 - кол-во, 3 - различные данные о хранимых вещах)

А ничего что мод будет сохранять/считывать/изменять 72 ячейки в бд будет, мне просто показалось что хранить по рядам лучше будет?

Так а зачем под каждый слот создавать столбец, когда можно записывать слот как строку?
То бишь, таблица с инвентарём будет иметь такую структуру:

id //Просто ID строки. Является уникальным ключом тайблицы (AUTO_INCREMENT)
account_id // ID владельца инвентаря
slot // Номер слота из инвентаря
item // Тут хранится ID предмета
value // Тут хранится количество того предмета, что хранится в слоте
Ну и по желанию добавляешь нужные тебе столбцы
В итоге у тебя получится система, где ты можешь работать с конкретным слотом и где количество этих слотов не ограничено со стороны базы данных (для добавления нового столбца просто увеличиваешь массивы и всё).

В таблице данные будут выглядеть так:

1 | 12 | 0 | 1 | 30
2 | 12 | 1 | 7 | 2
3 | 12 | 2 | 7 | 5
4 | 12 | 3 | 1 | 22
5 | 12 | 4 | 9 | 11
6 | 12 | 5 | 21 | 1
7 | 12 | 6 | 1 | 30
Если слот пустой, просто не создавай/удаляй его.

Загрузка будет максимально проста:

SELECT slot, item, value FROM player_inventory WHERE accout_id = 12//Весь инвентарь аккаунта с ID 12
SELECT item, value FROM player_inventory WHERE accout_id = 12 AND slot = 12 //Определённый слот

Обновление данных тоже

UPDATE player_inventory SET item = 22, value = 1 WHERE account_id = 12 AND slot = 0//Записываем в нулевой слот инвентаря предмет с ID 22 и количеством, равным единице

JohnConor
06.05.2017, 18:55
https://pp.userapi.com/c637717/v637717567/40bbc/LdmB096A8Vw.jpg

Как то так получилось, а если таких записей около 9000 не будет задержки в чтении, при условии что считываться будет сначала с 6 id, а потом аж 550?
Ну и последний вопрос обратил внимание что все твои запросы начинаются с маленькой буквы, это имеет значение?

DeimoS
06.05.2017, 19:20
Как то так получилось, а если таких записей около 9000 не будет задержки в чтении, при условии что считываться будет сначала с 6 id, а потом аж 550?

Вопрос следует иначе: будет ли заметна задержка в указанном тобой случае. Ответ - нет, не будет. MySQL и не на такое способна.
Вообще почитай вот эту (https://ru.wikipedia.org/wiki/%D0%9D%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0) статью и все вложенные


Ну и последний вопрос обратил внимание что все твои запросы начинаются с маленькой буквы, это имеет значение?

Исключительно ради собственного удобства, ибо если использовать в именах баз данных/таблиц или столбцов буквы разного регистра, то, собственно, нужно помнить не только сами имена, но и регистр букв в них. И банально можно просто опечататься, а после думать, почему же не обработался запрос. Да и в самих запросах более наглядно видно где находятся зарезервированные слова, а-ля "SELECT" или "UPDATE", а где имена столбцов и всего остального.
Вообще вот тут (http://forum.sa-mp.com/showthread.php?t=489467) есть хорошие рекомендации по работе с MySQL (если вместо текста будут иероглифы всякие, то промотай страницу в самый низ и смени язык сайта на русский) - в том числе и касаемо имен

JohnConor
06.05.2017, 19:23
Благодарю за помощь, с БД только начал знакомиться, на sa-mp.com часто сижу

Тему можно закрывать