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ězce


tedy 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

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: