| 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čujemTedy 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čujemJeš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: 10 let
|
|||
0