[HELP]SQL Query

egyéb dolgok, amik már nem férnek bele másik kategóriába

[HELP]SQL Query

HozzászólásSzerző: Afronaut » 2011.09.30. 18:49

Van 1 adott weblap (mssql db-vel) és van 1 (jelenleg csak egyet találtam) hiba benne.
Van rajta vote reward function viszont valamiért a vote adatokat nem írja adatbázisba viszont az rewardot kiadja... :evil:

Kód: Egész kijelölése
      case 'vote':
         $day = (3600*24);
         $vote['id']= $_GET['id'];
         foreach($_config['vote_sites'] as $v =>$v1) {
              if (in_array($vote['id'], $v1)) {
               $vote['key'] = $v1; $vote['keyid'] = $v;
              }
              $vote['code_generic'][$v1[0]] = array('date'=>time()-$day,'votes'=>0);
         }
         $vote['code_generic_serial'] = serialize($vote['code_generic']);
         //generate user vote db
         $rs = $db->Execute('select * from toolz_vote where userid = ?', array($user_auth->username));
         $rs = $rs->FetchRow();
         if (!$rs) $db->Execute('insert into toolz_vote (userid,votedata) values (?,\''.$vote['code_generic_serial'].'\')',array($user_auth->username));
         else $vote['code_generic_serial'] = $rs['votedata'];
         
         $vote['code'] = unserialize($vote['code_generic_serial']);
         //end user vote db
         //print_r($vote);
         if ($vote['id']) {
            if ($vote['key']) {
               $date = $vote['code'][$vote['id']]['date'];
               $diff = round((time()-$date)/$day,0);
               $diffH = round((($date+$day)-time())/(3200),0);
               $diffH = date_formats(time(),$date+$day);
               if ($diff > 0) {
                  if ($vote['code'][$vote['id']]['votes'] < $vote['key'][2]) {
                  
                     //generate vote code
                     $vote['code'][$vote['id']]['votes']++;
                     $msg = 'Vote Accepted!!! You have been awarded '.$vote['key'][1] .' CASH';
                     if ($vote['code'][$vote['id']]['votes'] == $vote['key'][2]) {
                        $vote['code'][$vote['id']]['date'] = time();
                        $vote['code'][$vote['id']]['votes'] = 0;
                     } else $msg .= ' You have '.($vote['key'][2]-$vote['code'][$vote['id']]['votes'] ).' more votes for this Vote Rewards.';
                     $vote['code_serial'] = serialize($vote['code']);
                     $db->Execute(_CASH_UPDATE,array($vote['key'][1],$user_auth->username));
                     $db->Execute('update toolz_vote set votedata = \''.$vote['code_serial'].'\' where userid = ?',array($user_auth->username));   

                     //print_r($vote['code']);
                     $go = $vote['key'][3];
                     
                  } else $msg = 'Vote Limit Reached. Please try again Later. Next vote in '. $diffH; ;
               } else  $msg = 'You already voted today! Next vote in '. $diffH;
            } else $msg = 'Vote is Invalid! Please try Again!';
         }
         echo 'VoteScript(';
         
         //print_r($vote);
         foreach($_config['vote_sites'] as $v =>$v1) {
          $_config['vote_sites'][$v][2] = $vote['code'][$v1[0]]['votes'].'/'.$_config['vote_sites'][$v][2];
         }
         
         $result = array('data'=>$_config['vote_sites']);
         if ($msg) $result = array('msg'=>$msg,'data'=>$_config['vote_sites']);
         if ($go) $result = array('go'=>$go,'msg'=>$msg,'data'=>$_config['vote_sites']);
         echo array2json($result);
         echo " )";   
         
      break;

Na most ez a rész működik benne:
Kód: Egész kijelölése
$db->Execute(_CASH_UPDATE,array($vote['key'][1],$user_auth->username));


define.php részlet a fenti _CASH_UPDATE-hez
Kód: Egész kijelölése
define('_CASH_UPDATE','Update '.$_config['DB3'].'.dbo.CashAccount set Cash=Cash+? where UserID = ?');


Előre is köszönöm a segítséget.
Afronaut
 
Hozzászólások: 33
Csatlakozott: 2010.04.30. 23:52

Re: [HELP]SQL Query

HozzászólásSzerző: l2sh » 2011.09.30. 19:08

Hali!

Először is, nem ír semmit php error logba? Mert éles szerveren stderr kimenetre írják a hibákat stdout helyett.
Másodszor, var_dump-pal végignézted, mik a változók értékei? Esetleg rossz adatot tárol a $vote tömb a code_serial asszociáció helyén.
Több infó kellene, kódstruktúra változó értékekkel, esetleg táblatruktúra adatbázisból.

Nem ismerem a Microsoft SQL-t, de megpróbálhatod tesztelni, hogy lefutnak-e a parancsok kézi futtatáskor.
l2sh
 
Hozzászólások: 95
Csatlakozott: 2009.03.22. 13:01

Re: [HELP]SQL Query

HozzászólásSzerző: Afronaut » 2011.09.30. 19:20

Frontend:
vote.rar
Frontend rész
(1.79 KiB) 269 alkalommal.


Backend:
backend.rar
Backend rész
(16.31 KiB) 271 alkalommal.


Tábla szerkezetek:
Kód: Egész kijelölése
use CabalCash; 
CREATE TABLE [dbo].[WebShop]( 
[ID] [int] IDENTITY(1,1) NOT NULL, 
[Name] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL, 
[Description] [varchar](200) COLLATE Chinese_PRC_CI_AS NOT NULL, 
[ItemIdx] [int] NOT NULL, 
[Options] [int] NOT NULL, 
[Image] [varchar](200) COLLATE Chinese_PRC_CI_AS NOT NULL, 
[Cash] [int] NULL, 
[Alz] [int] NULL, 
[Category] [int] NOT NULL, 
[Available] [int] NOT NULL, 
[TimeLimit] [int] NOT NULL, 
[Total] [int] NOT NULL CONSTRAINT [DF_WebShop_Total]  DEFAULT ((0)))

CREATE TABLE [dbo].[WebShop_Category]( 
[ID] [smallint] IDENTITY(1,1) NOT NULL, 
[Category] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL, 
[Access] [smallint] NOT NULL)

USE ACCOUNT
CREATE TABLE toolz_vote(
userid VARCHAR(50) NULL,
votedata INT NULL
)


Edit: Igen kézinél lefutnak ill másik php scriptel tökéletesen tudok beküldeni queryt csak ez valamiért nem akarja az igazat. :S
Afronaut
 
Hozzászólások: 33
Csatlakozott: 2010.04.30. 23:52

Re: [HELP]SQL Query

HozzászólásSzerző: l2sh » 2011.09.30. 19:32

Ha leírod, miket kellene tartalmaznia az egyes változóknak, annak örülnék, mert a kód nekem jónak tűnik, de az is közrejátszik, mit tartalmaz, mivel a php nem különböztet meg típusokat, csak speciális esetekben.
l2sh
 
Hozzászólások: 95
Csatlakozott: 2009.03.22. 13:01

Re: [HELP]SQL Query

HozzászólásSzerző: Afronaut » 2011.11.21. 18:10

Először is bocsesz, hogy nem reagáltam azóta de közben lecseréltük a vote scriptet meg még más moduljait is mert még pár hiba előkerült.

Újabb segítségre lenne szükségem.
A következő a helyzet:
Adott a játék adatbázisában egy "stored procedure" amivel a megadott játékos id-je alapján kiolvasható a játékos "raktárának" tartalma.
Rengeteg típusú item lehet benne (a maximális számát most pontosan nem tudom) és ezen itemek dekódolásához kezdtem el írni egy funkciót ami eddig a következőket tudja:

kapcsolat.php

Kód: Egész kijelölése
<?

class database
{
    public static $connected = false;
   
    static function connect_db()
    {
        if(!self::$connected)
        {
            $link = mssql_pconnect('127.0.0.1', 'sa','jelszó');
            if($link)
                self::$connected = true;
        }
        echo self::$connected;
    }
}
class use_db extends database
{
    function __construct()
    {
        if(!parent::$connected)
        {
            parent::connect_db();
            echo " kapcsolat.<br />";
        }
        else
        {
            echo "Sikeres adatbázis kapcsolat.<br />";
        }
    }
}

?>


itemdekódoló.php

Kód: Egész kijelölése
<?
include('kapcsolat.php');

$connect=new use_db;

$check_CharIdxItem = mssql_query("EXEC GAMEDB.dbo.cabal_tool_GetEquipment 64");

$check_Char_result=mssql_fetch_row($check_CharIdxItem);

$titem=$check_Char_result[1];

$titemc=substr($titem, 2); //Bináris adatról az első két karaktert levágja mivel azok a raktár kezdő adatai utána jönnek az itemek.

$titemsbh=bin2hex($titem);

echo '<br />'.$titemsbh.'<br />';  //Kiírja a kapott adatot (csak az ellenőrzés végett, hogy helyes adatot mutat-e ki.)

$str = str_split($titemsbh, 32); //Feldarabolja 32 karakterenként (1x32 az egy itemnek felel meg)

echo '<br />';

echo print_r($str) //Kiprintelem az adatot ellenőrzésképp.

?>


Nos ezekután még több darabra kellene darabolni egyenként a 32 karakteres adatokat a következőképpen:
Ehhez lenne szükségem segítségre.
Kód: Egész kijelölése
0x440047000028000000000000896B4685
0x lecsípve:

    44: Item ID
    00: Item szintje (0--->7) itt csak az első 0-ás karakter változik az adott opciók alapján.
    47: Item széria száma (a későbbiekben a végeredményél szükségtelen)
    000028: Eddig nem jöttem rá mire jó
    00: Item 1 slotjának tartalma (ezekbe a slotokba kerülhetnek + opciók)
    00: Item 2 slotjának tartalma (ezekbe a slotokba kerülhetnek + opciók)
    00: Item kraftolásának típusa és szintje (1. karakter a típus 2. a szint)
    00: Item slotok száma (00 = 0 slot, 10 = 1 slot, 20 = 2 slot)
    0000: Item elhelyezkedése a raktárban (1-2. karakter a sort jelzi 3-4. az oszlopot)
    896B4685: Item lejárati ideje (Végeredménynél szükségtelen)

És ezt ugyebár az adott játékos összes item-jén végrehajtani.
Ha ezekkel megvagyok akkor kell egy másik funkció ami majd egy array-ból kiolvasva párosítja aztán megmondja, hogy milyen item+szint+opció+slot+slotokban opció+kraft.
Ezekben kellene kis segítség, kis útmutatás.
Előre is köszönöm.
Legjobbakat.
Afronaut
 
Hozzászólások: 33
Csatlakozott: 2010.04.30. 23:52

Re: [HELP]SQL Query

HozzászólásSzerző: l2sh » 2011.11.22. 18:28

Hali!

Érdekes, hogy itemeknél így oldottad meg. Ezt a módszert packetek olvasásakor alkalmazzák. Ugyanaz az eljárás, mint abban az esetben. A 32 bájt hosszúságú hexa stringet fel kell bontanod egy struktúra sablont használva, tehát bájtokra osztva: 1,1,1,4,3?,1,1,1,1,2,4. Az a 3 bájt eléggé fura, azért tettem kérdőjelet, mert 3 bájtos adattárolás nincsen. :D
Készíthetsz akár egy külön modult hozzá, ha szép kódot akarsz, egy függvényben eléggé össze lenne mocskolva, de a célra végülis megfelel.

Egy kis példa:

DataStructure.php
Kód: Egész kijelölése
<?php

class DataStructure {

    private 
$index;
    private 
$data;
    private 
$char_len;

    public function 
__construct($data$char_len 2){
        
$this->index 0;
        
$this->data $data;
        
$this->char_len $char_len;
    }

    public function 
readBytes($length){
        
$shift_len $length $this->char_len;
        
$str substr($this->data$this->index$shift_len);
        
$this->index += $shift_len;
        return 
$str;
    }

    
/**
     * @return egy bájt
     */
    
public function readC(){
        return 
$this->readBytes(1);
    }

    
/**
     * @return egy halfword
     */
    
public function readH(){
        return 
$this->readBytes(2);
    }

    
/**
     * @return egy doubleword
     */
    
public function readD(){
        return 
$this->readBytes(4);
    }

    
/**
     * @return egy quadword
     */
    
public function readQ(){
        return 
$this->readBytes(8);
    }

    public function 
reset(){
        
$this->index 0;
    }



EgyikStructType.php
Kód: Egész kijelölése
<?php

class EgyikStructType extends DataStructure 
{

    private $item_id;
    private $item_level;
    private $item_serial;
    private $unknown;

    public function read(){
        $this->item_id = $this->readC();
        $this->item_level = $this->readC();
        $this->item_serial = $this->readC();
        $this->unknown = $this->readD();
        // és így tovább
    }

    public function getItemId(){
        return $this->item_id;
    }

    public function getItemLevel(){
        return $this->item_level;
    }

    public function getItemSerial(){
        return $this->item_serial;
    }

    public function getUnknown(){
        return $this->unknown;
    }

}


teszt
Kód: Egész kijelölése
<?php

$ds 
= new EgyikStructType('440047000028000000000000896B4685');
$ds->read();

var_dump($ds->getItemId(), $ds->getItemLevel(), $ds->getItemSerial(), $ds->getUnknown()); exit;
l2sh
 
Hozzászólások: 95
Csatlakozott: 2009.03.22. 13:01

Re: [HELP]SQL Query

HozzászólásSzerző: Afronaut » 2011.11.23. 23:13

l2sh írta:Hali!

Érdekes, hogy itemeknél így oldottad meg. Ezt a módszert packetek olvasásakor alkalmazzák. Ugyanaz az eljárás, mint abban az esetben. A 32 bájt hosszúságú hexa stringet fel kell bontanod egy struktúra sablont használva, tehát bájtokra osztva: 1,1,1,4,3?,1,1,1,1,2,4. Az a 3 bájt eléggé fura, azért tettem kérdőjelet, mert 3 bájtos adattárolás nincsen. :D
Készíthetsz akár egy külön modult hozzá, ha szép kódot akarsz, egy függvényben eléggé össze lenne mocskolva, de a célra végülis megfelel.

Egy kis példa:

DataStructure.php
Kód: Egész kijelölése
<?php

class DataStructure 
{

    private $index;
    private $data;
    private $char_len;

    public function __construct($data, $char_len = 2){
        $this->index = 0;
        $this->data = $data;
        $this->char_len = $char_len;
    }

    public function readBytes($length){
        $shift_len = $length * $this->char_len;
        $str = substr($this->data, $this->index, $shift_len);
        $this->index += $shift_len;
        return $str;
    }

    /**
     * @return egy bájt
     */
    public function readC(){
        return $this->readBytes(1);
    }

    /**
     * @return egy halfword
     */
    public function readH(){
        return $this->readBytes(2);
    }

    /**
     * @return egy doubleword
     */
    public function readD(){
        return $this->readBytes(4);
    }

    /**
     * @return egy quadword
     */
    public function readQ(){
        return $this->readBytes(8);
    }

    public function reset(){
        $this->index = 0;
    }



EgyikStructType.php
Kód: Egész kijelölése
<?php

class EgyikStructType extends DataStructure 
{

    private $item_id;
    private $item_level;
    private $item_serial;
    private $unknown;

    public function read(){
        $this->item_id = $this->readC();
        $this->item_level = $this->readC();
        $this->item_serial = $this->readC();
        $this->unknown = $this->readD();
        // és így tovább
    }

    public function getItemId(){
        return $this->item_id;
    }

    public function getItemLevel(){
        return $this->item_level;
    }

    public function getItemSerial(){
        return $this->item_serial;
    }

    public function getUnknown(){
        return $this->unknown;
    }

}


teszt
Kód: Egész kijelölése
<?php

$ds 
= new EgyikStructType('440047000028000000000000896B4685');
$ds->read();

var_dump($ds->getItemId(), $ds->getItemLevel(), $ds->getItemSerial(), $ds->getUnknown()); exit;


Közben elfelejtettem 1 nagyon fontos infót megadni (amire nem rég jöttem rá >< ) és úgy néz ki sikerült megoldani (kicsit másképpen)

Szóval maga az item ID- a következőképpen számolhatom ki.

Példa:

fae000000000f1400040000000000000

a színekkel jelőlteket felcserélve kapom meg az item ID hex adatát
vagyis az e0fa-t.
Ezt konvertálom:
Kód: Egész kijelölése
<?
$itemid='e0fa';
$itemidxCombined = hexdec($itemid);
?>


Nos az első karakterből (e) számolhatom ki az item szintjét:

Kód: Egész kijelölése
    0: +0 Tradelhető
    1: +0 Nem tradelhető (character bind)
    2: +1 Tradelhető
    3: +1Nem tradelhető (character bind)
    4: +2 Tradelhető
    5: +2 Nem tradelhető (character bind)
    6: +3 Tradelhető
    7: +3 Nem tradelhető (character bind)
    8: +4 Tradelhető
    9: +4 Nem tradelhető (character bind)
    A: +5 Tradelhető
    B: +5 Nem tradelhető (character bind)
    C: +6 Tradelhető
    D: +6 Nem tradelhető (character bind)
    E: +7 Tradelhető
    F: +7 Nem tradelhető (character bind)


Ha tradelhető az item akkor minden egyes szint decimálisban +8192(+7en 7x8192) ha nem tradelhető akkor 1x4096+8192 (utána szintenként 8192 ugyanúgy - a 4096 egyszeri az jelzi a nem tradelhetőségét)
Az előzőleg kapott szám: 57594
e = tradelhető 7-es szintű azaz 7x8192-t kell kivonni a fentiből azaz 57344-et ami megadja az item eredeti IDjét.
57594-57344=250

Huh nem tudom mennyire érthető >< így jön ki az eredeti itemid (mivel bizonyos opciók/szint/tradelhetőség hozzáadásánál változhat az adatbázisba bevitt decimális ID ezért viszakell fejteni és ezen a módon visszaszámolni az eredeti idhez.
Afronaut
 
Hozzászólások: 33
Csatlakozott: 2010.04.30. 23:52

Re: [HELP]SQL Query

HozzászólásSzerző: Afronaut » 2011.12.12. 23:36

Amint kicsit több időm lesz (és nem leszek lusta foglalkozni vele) a példád alapján megcsinálom és postolom, hogy sikerült-e vagy sem ><
Afronaut
 
Hozzászólások: 33
Csatlakozott: 2010.04.30. 23:52


Vissza: Segédletek, Tippek, Egyebek

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 2 vendég

cron