[Help] Clear Inventory Query

LasTCursE

Active Member
Joined
Jun 5, 2013
Messages
165
Reaction score
47
"UPDATE Character SET [inventory]=CONVERT(varbinary(1560), null) WHERE memb___id = accto"

Това ми трие целия инвентар на героя (сложени итеми + всичко отдолу като колби и тн)

Въпросът ми е, как да го направя да трие само тези които са "облечени" (сложени) на самия герой?

Или как да прави проверка дали въобще има такива още по-добре? (think) :D
 
Здрасти.
Прочетох текста поне 5 пъти, и да ти кажа имам много въпроси.

За коя версия става въпрос, защото или Аз нещо изоставам с материала,
или Вие напредвате много-бързо...
Известните за мен стойности на колоната [Inventory] както следва:
Старите версии, които ползват 20 битови предмети >> varbinary(760)
Новите версии, които ползват 32 битови предмети >> varbinary(1728)

И не че нещо, ама направо се изумявам как изобщо работи тая заявка,
която търси [memb___id] в таблицата [Character] ...

Може-би тук трябва да се намеси някой от ранга на DarkMaster,
за да не те объркам нещо, но видях че 2 дена никой не е писал,
и реших да разгледам въпросът от моята гледна точка.

Мисля че картинката е достатъчно подробна - даже претрупана с информация,
но ако и тя не ти помогне, съжалявам наистина.
Това е за 97d-99i
Основното е >> 0xFFFFFFFF... и така 1520 пъти "F" (като приемам всеки "F" за 1 бит)
Ако ти трябва да едитваш предметите, които са на самия герой,
това са първите 240 "F"(горните 12 предмета по 20 бита), като не включвам в това число "0х".
Останалите 1280 "F" са за предметите под героя.(8х8=64)(64х20 бита=1280)

Затова съм ги разделил по 20 "F" на ред, за да е по-нагледно.
Ако става дума за новите версии, там предметите са 32 битови.
(това е дължината на всеки предмет)
Ето ти примерна заявка за 20 и за 32 бита предмети,
и ако ти върне само "0xFFFFFFFF..." или "NULL",
значи в горната част на героя няма нищо.
Code:
declare @it varbinary(120); set @it=(SELECT [Inventory] FROM [Character] WHERE [Name]='[COLOR="Red"]ИмЕтО_На_ГеРоЯ[/COLOR]'); print @it
declare @it varbinary(192); set @it=(SELECT [Inventory] FROM [Character] WHERE [Name]='[COLOR="Red"]ИмЕтО_На_ГеРоЯ[/COLOR]'); print @it

Обаче с долната част е малко по-сложно, защото след всеки предмет,
има по един празен ред "F", а когато сменя нов ред, има по 8 предмета дължина празни (8x20 бита = 160),
и тогава продължава с новия ред...
Предполагам тук се намесва алгоритъмът на предметите и тяхната големина "X" & "Y".


8898926N.jpg
 
Za 97d99i stavashe vupros, propusnah da spomena
Varbinary760 e razmera na inventory

Mnogo blagodarq!! Mislq, che tochno tova mi trqbva. Shte go testvam kato se pribera ot rabota :)

Inache me interesuva samo gornata(da e "sublechen" geroq za da polzva modula), poneje kato smenih rasata na edin geroi ot bk na mg i glavata mu stana kato kris :D :D :D

PS: izvinqvam se za latinicata
 
Функция за SQL Server 2008 или по-нов

PHP:
function hasEquippedItems($name) {
	$inventoryBinary = mssql_fetch_row(mssql_query("select SUBSTRING(Inventory, 1, 120) from Character where Name = '".$name."'"));

	return preg_match('/[^f]/i', bin2hex($inventoryBinary[0]));
}

Функция за SQL Server 2000

PHP:
function hasEquippedItems($name) {
	$inventoryBinary = mssql_fetch_row(mssql_query("select Inventory from Character where Name = '".$name."'"));

	return preg_match('/[^f]/i', substr(bin2hex($inventoryBinary[0]), 0, 240));
}

С тази функция ще можеш да провериш дали има сложени предмети по самия герой.

Забележка: Тази функция е просто пример и така написана подлежи на атака от тип "SQL Injection".
 
Last edited:
  • Like
Reactions: LasTCursE
Здрасти.
Прочетох текста поне 5 пъти, и да ти кажа имам много въпроси.

За коя версия става въпрос, защото или Аз нещо изоставам с материала,
или Вие напредвате много-бързо...
Известните за мен стойности на колоната [Inventory] както следва:
Старите версии, които ползват 20 битови предмети >> varbinary(760)
Новите версии, които ползват 32 битови предмети >> varbinary(1728)

И не че нещо, ама направо се изумявам как изобщо работи тая заявка,
която търси [memb___id] в таблицата [Character] ...

Може-би тук трябва да се намеси някой от ранга на DarkMaster,
за да не те объркам нещо, но видях че 2 дена никой не е писал,
и реших да разгледам въпросът от моята гледна точка.

Мисля че картинката е достатъчно подробна - даже претрупана с информация,
но ако и тя не ти помогне, съжалявам наистина.
Това е за 97d-99i
Основното е >> 0xFFFFFFFF... и така 1520 пъти "F" (като приемам всеки "F" за 1 бит)
Ако ти трябва да едитваш предметите, които са на самия герой,
това са първите 240 "F"(горните 12 предмета по 20 бита), като не включвам в това число "0х".
Останалите 1280 "F" са за предметите под героя.(8х8=64)(64х20 бита=1280)

Затова съм ги разделил по 20 "F" на ред, за да е по-нагледно.
Ако става дума за новите версии, там предметите са 32 битови.
(това е дължината на всеки предмет)
Ето ти примерна заявка за 20 и за 32 бита предмети,
и ако ти върне само "0xFFFFFFFF..." или "NULL",
значи в горната част на героя няма нищо.
Code:
declare @it varbinary(120); set @it=(SELECT [Inventory] FROM [Character] WHERE [Name]='[COLOR="Red"]ИмЕтО_На_ГеРоЯ[/COLOR]'); print @it
declare @it varbinary(192); set @it=(SELECT [Inventory] FROM [Character] WHERE [Name]='[COLOR="Red"]ИмЕтО_На_ГеРоЯ[/COLOR]'); print @it

Обаче с долната част е малко по-сложно, защото след всеки предмет,
има по един празен ред "F", а когато сменя нов ред, има по 8 предмета дължина празни (8x20 бита = 160),
и тогава продължава с новия ред...
Предполагам тук се намесва алгоритъмът на предметите и тяхната големина "X" & "Y".


8898926N.jpg

Леко пояснение:

varbinary(760) означава поле от тип binary с дължина 760 байта. Предметите имат дължина 10 байта всеки или общо 80 бита. Като разглеждаш предметите kato HEX код всеки 4 байта се преобразуват в HEX число и по този начин се получават по 20 символа за всеки предмет.
 
Функция за SQL Server 2000

PHP:
function hasEquippedItems($name) {
	$inventoryBinary = mssql_fetch_row(mssql_query("select Inventory from Character where Name = '".$name."'"));

	return preg_match('/[^f]/i', substr(bin2hex($inventoryBinary[0]), 0, 240));
}

С тази функция ще можеш да провериш дали има сложени предмети по самия герой.

Забележка: Тази функция е просто пример и така написана подлежи на атака от тип "SQL Injection".

А как би изглеждала защитена? (wasntme)