Autor | Zpráva | ||
---|---|---|---|
leorond Profil |
Ahoj, mám jeden takoví spíš větší problém který bych potřeboval nutně vyřešit.
Používám MSSQL 2005 a potřebuji udělat ochranu ze strany serveru proti duplikaci části řetězce, vím že ta část řetězce má vždy délku 32 a sloupec v DB je varbinary(8000). Dejme tomu že bych potřeboval vložit tuto část řetězce 2580D7000000000400D000FFFFFFFFFF z jiné tabulky v DB do jiné tabulky kde je několik podobných zápisů o stejné délce 32 znaků a zároveň nechci mít v řetězci 2 tyto totožné zápisy. Potřeboval bych pomoci pouze s podmínkou, zde přikládám část kódu se kterým pracuji. <?php elseif ($_POST['move_item']) { $ww_id = $_POST['ww_id']; if ($ww_id == "myww") { $ww_items = mssql_query(" declare @items varbinary(1920); set @items = (select webwarehouse from memb_info where memb___id='$username'); print @items;"); $ww_items = mssql_get_last_message(); $mycuritems = $ww_items; $item_code = $_POST['item_code']; $item = ItemInfo($item_code); $test = 0; $slot = vaultexplore($mycuritems, $item['x'], $item['y']); $test = $slot*$_SERVER['itemlenght']; if ($slot == 1337) { echo "<ul><li>".not_enouth_place."</ul>"; } else { $sqll = mssql_query(" declare @items varbinary(1920); set @items=(select items from warehouse where accountid='$username'); print @items;"); $sqll = mssql_get_last_message(); $sqll = substr($sqll, 2); if ($sqll == NULL) { echo "<ul><li>".wh_item_not."</li></ul>"; } else { $mynewitems = substr_replace($mycuritems, $item_code, ($test+2), $_SERVER['itemlenght']); $query = "update memb_info set webwarehouse=$mynewitems where memb___id='$username'"; if (!mssql_query($query)) { echo "<ul><li>".eror_while_adding."</li></ul>"; } else { $newitem = "0x".$item_code; $query = " declare @it varbinary(1920), @it1 varbinary(16), @it2 varbinary(16), @it3 int; set @it = (select items from warehouse where [accountid]='$username'); set @it1 = ".$newitem."; set @it3 = 0; while (@it3 < 121) BEGIN set @it2 = substring(@it,".($_SERVER['itemlenght']/2)."*@it3+1,".($_SERVER['itemlenght']/2)."); if (@it1 = @it2) BEGIN select @it3 as 'marked'; set @it3 = 120; END set @it3 = @it3+1; END"; $res = mssql_fetch_array(mssql_query($query)); mssql_query(" declare @items varbinary(1920); set @items = (select items from warehouse where AccountId='$username'); print @items;"); $ci = mssql_get_last_message(); $log_all = "Has moved item: $item[sn] into My Web Warehouse"; $insert_log = mssql_query("insert into EW_LOG (account,[index],credits,datetime) values ('$username','$log_all','0','$date')"); mssql_query("update warehouse set money=money-$_SERVER[ww_tva],items=".substr_replace($ci, $_SERVER['itemnull'], $res[0]*$_SERVER['itemlenght']+2, $_SERVER['itemlenght'])." where AccountId='$username'"); echo "<ul><li>".ww_sukk_move_it_f_ing_."</li></ul>"; } } } } else { $select_ww = mssql_query("select * from ew_warehouse where id='$ww_id'"); if (mssql_num_rows($select_ww) == 0) { echo "<ul><li>".ww_not_fount."</li></ul>"; } else { $ww_items = mssql_query(" declare @items varbinary(8000); set @items = (select items from ew_warehouse where id='$ww_id'); print @items;"); $ww_items = mssql_get_last_message(); $mycuritems = $ww_items; $myrow_ww = mssql_fetch_array($select_ww); $item_code = $_POST['item_code']; $item = ItemInfo($item_code); $test = 0; $slot = ew_vaultexplore($mycuritems, $item['x'], $item['y'],$myrow_ww['x'],$myrow_ww['y']); $test = $slot*$_SERVER['itemlenght']; if ($slot == 1337) { echo "<ul><li>".not_enouth_place."</ul>"; } else { $sqll = mssql_query(" declare @items varbinary(1920); set @items=(select items from warehouse where accountid='$username'); print @items;"); $sqll = mssql_get_last_message(); $sqll = substr($sqll, 2); if ($sqll == NULL) { echo "<ul><li>".wh_item_not."</li></ul>"; } else { $mynewitems = substr_replace($mycuritems, $item_code, ($test+2), $_SERVER['itemlenght']); $query = "update ew_warehouse set items=$mynewitems where id='$ww_id'"; if (!mssql_query($query)) { echo "<ul><li>".eror_while_adding."</li></ul>"; } else { $newitem = "0x".$item_code; $query = " declare @it varbinary(1920), @it1 varbinary(16), @it2 varbinary(16), @it3 int; set @it = (select items from warehouse where [accountid]='$username'); set @it1 = ".$newitem."; set @it3 = 0; while (@it3 < 121) BEGIN set @it2 = substring(@it,".($_SERVER['itemlenght']/2)."*@it3+1,".($_SERVER['itemlenght']/2)."); if (@it1 = @it2) BEGIN select @it3 as 'marked'; set @it3 = 120; END set @it3 = @it3+1; END"; $res = mssql_fetch_array(mssql_query($query)); mssql_query(" declare @items varbinary(1920); set @items = (select items from warehouse where AccountId='$username'); print @items;"); $ci = mssql_get_last_message(); $log_all = "Has moved item: $item[sn] into warehouse: $myrow_ww[name]"; $insert_log = mssql_query("insert into EW_LOG (account,[index],credits,datetime) values ('$username','$log_all','0','$date')"); mssql_query("update warehouse set money=money-$_SERVER[ww_tva],items=".substr_replace($ci, $_SERVER['itemnull'], $res[0]*$_SERVER['itemlenght']+2, $_SERVER['itemlenght'])." where AccountId='$username'"); echo "<ul><li>".ww_it_sukk_move_from_my."$myrow_ww[name]</li></ul>"; } } } } } } ?> Děkuji za pomoc Vím jak by měla zhruba ta podmínka vypadat ale stále tam mám jednu velkou mezeru a to prohledání řetězce v DB a nalezení té části if($item_code == ???) { echo ""; } else... Možná použitím StrPos bych mohl najít část řetězcetedy kde začíná a poté pomocí substr vypsat do podmínky tu danou část řetězce
|
||
leorond Profil |
a samozřejmě že když mám sloupec ve
varbinary tak musím vypisovat bin2hex že? To znamená že dotaz na DB bude vypadat nějak takto
$result = mssql_fetch_assoc(mssql_query("SELECT * FROM EW_WAREHOUSE WHERE id = '1'")); echo bin2hex($result["items"]); Tedy tento dotaz mi vypíše všechny informace uložené ve sloupci To znamená že by mohla podmínka vypadat i nějak takto že? $item_code = $_POST["item_code"]; $result = mssql_fetch_assoc(mssql_query("SELECT * FROM EW_WAREHOUSE WHERE id = '1'")); $zacatek_r = strpos(bin2hex($result["items"]), $item_code); // tohle mi najde kde začíná část řetězce $retezec = substr(bin2hex($result["items"]),$zacatek_r,32); // tohle mi vypíše tu část kterou potřebuji if($item_code == $retezec) // pokud se zadaný řetězec rovná s existující částí řetězce { echo "Řetězec již existuje!"; } else... // pokud ne tak pokračujem Tedy alespoň teoreticky by to mělo fungovat správně ale prakticky by tam mohl být problém s malými a velkými písmeny, jelikož části řetězce obsahují čísla a písmena takže to bude chtít také všechny části řetězce před porovnáním převést na malá písmena. Počítám že mohu klidně použít funkci strtolower což mi převede vše na malá písmena a tudíž bude podmínka vypadat takto
$item_code = strtolower($_POST["item_code"]); // převod na malá písmena $result = mssql_fetch_assoc(mssql_query("SELECT * FROM EW_WAREHOUSE WHERE id = '1'")); $zacatek_r = strpos(bin2hex($result["items"]), $item_code); // tohle mi najde kde začíná část řetězce $retezec = substr(bin2hex($result["items"]),$zacatek_r,32); // tohle mi vypíše tu část kterou potřebuji if($item_code == $retezec) // pokud se zadaný řetězec rovná s existující částí řetězce { echo "Řetězec již existuje!"; } else... // pokud ne tak pokračujem Ještě jednou se omlouvám že stále přidávám ale třeba to někomu do budoucna pomůže vyřešit podobný problém ;) Ještě bych to mohl vylepšit abych neopakoval bin2hex
$items = bin2hex($result["items"]); Teď už to jen správně zabudovat do scriptu a myslím že to mám vyřešené :D Znáte někdo jiný postup nebo nějakou radu jak to zjednodušit? |
||
leorond Profil |
Ještě bych tedy dodal že nemusím použít dotaz na
mssql jelikož už tam dotaz mám
takže to bude vypadat takto $ww_items = mssql_query(" declare @items varbinary(8000); set @items = (select items from ew_warehouse where id='$ww_id'); print @items;"); $ww_items = mssql_get_last_message(); $mycuritems = $ww_items; $myrow_ww = mssql_fetch_array($select_ww); $item_code = $_POST['item_code']; // kontrola $items = $ww_items; $zacatek_r = strpos($items, $item_code); // tohle mi najde kde začíná část řetězce $retezec = substr($items, $zacatek_r,32); // tohle mi vypíše tu část kterou potřebuji if($item_code == $retezec) // pokud se zadaný řetězec rovná s existující částí řetězce { echo "Retezec jiz existuje!"; } else... // pokud ne tak pokračujem |
||
Časová prodleva: 9 let
|
0