Avatar billede bjering Nybegynder
03. september 2004 - 17:38 Der er 14 kommentarer og
1 løsning

hjælp, mysql problem, kun en simpel en tror jeg.

okay hejsa igen alle sammen, nu har jeg prøvet næsten 20 timer at få den her til at virke.. (ms visual c++ 6)
---------------------------
int createnewchar(const char * accid, const char * name, BYTE charclass, BYTE gender, BYTE str, BYTE dex, BYTE con, BYTE wis, BYTE cha, BYTE intel)
{
    unsigned int num_rows;
    char* query = new char[100];
    sprintf(query,"SELECT * FROM characters WHERE name='%s'", name);

    if(mysql_query(pConn,query))
    {
        // error doing the query
        Log2File(TRUE, "(MySQL) ERROR : %s\n", mysql_error(pConn));
        return 0;
    }
    else
    {
        // <<<---------- here the accid = OK
        result = mysql_store_result(pConn);
        // fetch all the rows from the query.
        // <<<---------- FROM here and down the accid = BAD
        num_rows = mysql_num_rows(result);
        // character exsist.
        if(num_rows >= 1)
        {
            mysql_free_result(result);
            return 0;
        }

        // no such character name, make one is ok
        else if(num_rows == 0)
        {
            Log2File(TRUE, "(createnewchar 1) Accound id to insert statement %s\n", accid);
            char* inquery = new char[200];
            sprintf(inquery, "INSERT INTO characters (accountid, name, clanname, class, gender, lawful, hp, maxhp, mp, maxmp, level, armor, str, dex, con, wis, cha, intel) VALUES ('%s', '%s', '', '%i', '%i', '0', '10', '10', '10', '10', '1', '10', '%i', '%i', '%i', '%i', '%i', '%i')", accid , name, charclass, gender, str, dex, con, wis, cha, intel);
            Log2File(TRUE, "Query = %s\n", inquery);

            if(mysql_query(pConn,inquery))
            {
                // error doing the query
                Log2File(TRUE, "(MySQL) ERROR : %s\n", mysql_error(pConn));
                mysql_free_result(result);
                return 0;
            }
            else
            {
                //result = mysql_store_result(pConn);
                mysql_free_result(result);
                return 1;
            }
            num_rows = mysql_num_rows(result);
        }
        num_rows = mysql_num_rows(result);
    }
    return 0;
}
---------------------------
okay accid skulle være : 1 (da jeg testede)
og den var den oxo hele vejen ned indtil det punkt jeg har markeret med:

// <<<---------- FROM here and down the accid = BAD

derefter er accid = "characters" (??)

hvordan kan det ske ???

nogen der kan se det, jeg kan bare ikke se nogen fejl her...
Avatar billede arne_v Ekspert
03. september 2004 - 17:47 #1
result variablen som jeg ikke kan hvor erklæres må vel pege
på samme memory som accid ...
Avatar billede bjering Nybegynder
03. september 2004 - 17:51 #2
de ligger lige over den

MYSQL *pConn;
MYSQL_ROW row;
MYSQL_RES *result;

glemte at paste dem, kan være jeg skal prøve at lave en ny result eg. result1 og se hvad der så sker... det er vældig wierd (set fra min side)
Avatar billede bjering Nybegynder
03. september 2004 - 17:53 #3
det bliver det samme :P... o well, var et skud i tågen værd, har efterhånden prøvet alting syntes jeg
Avatar billede arne_v Ekspert
03. september 2004 - 17:57 #4
Og hvad bliver createnewchar kaldt med som første argument ?
Avatar billede bjering Nybegynder
03. september 2004 - 18:01 #5
med

    if (createnewchar(accid, (char *)ch.charname.c_str(), ch.charclass, ch.gender, ch.str, ch.dex, ch.con, ch.wis, ch.cha, ch.intel) == 0)
    {
        // create char failed
        unsigned char failed[] = { 0x30, 0x06, 0x00, 0x8F, 0xB2, 0x28, 0x01, 0x53 };
        sendpacket(failed, ptr);
    }
    else
    {
        unsigned char success[] = { 0x30, 0x02, 0x66, 0x2D, 0x01, 0x56, 0xB7, 0x2D };
        sendpacket(success, ptr);
        // create char success

    }

note : jeg har logget mine strenge ud i en tekstfil hele vejen igennem, alt data er ok lige intil den rammer ved num_rows = mysql_num_rows(result); så passer alt pånær min accid.
Avatar billede arne_v Ekspert
03. september 2004 - 18:05 #6
Og hvor kommer accid fra ude på det niveau ?
Avatar billede bjering Nybegynder
03. september 2004 - 18:11 #7
okay efter en user logger ind, henter den hans ID felt fra databasen og smider den i min std::map

struct usersonline
{
    unsigned int socket;
    char * accountid;
    string username;
};

map<int,struct usersonline> m;

med

void addaccountidmemory(int cp, char * id)
{
    struct usersonline test;
    test.socket = cp;
    test.accountid = id;
    test.username = test.username;
    Log2File(TRUE, "addusers int cp = %s", id);
    pair<int ,struct usersonline> p(cp,test);
    m.insert(p);
}

(jeg har indsat test.socket = cp; test.accountid = "0"; test.username = username; før med den info jeg fik fra den anden tråd)

har logger accountid og den er go nok..

okay, får en pakke ind til at create en account..

            case 0x4D:
                // create char
                {
                char * acc = m[cp].accountid;
                createchar(acc, (char *)&recdata[1], ptr);
                }
            break;

okay, den bliver så smidt over i :

void createchar(char * accid, char * buffer, DWORD ptr)
{
.........

}

hvor den data jeg postet lige over er, den kalder jo så som sagt createnetchar...

og alt data jeg har passer 100% som sagt indtil den rammer result .... du ved..
Avatar billede bjering Nybegynder
03. september 2004 - 18:12 #8
okay, får en pakke ind til at create en account..
=
okay, får en pakke ind til at create en char..
Avatar billede arne_v Ekspert
03. september 2004 - 18:32 #9
Og hvordan ser kaldet til addaccountidmemory ud ?

(og jeg spørger ikke kun for at jage dig rundt i manegen - jeg er 95% sikker
på at jeg hvilken konstruktion det er som er skyld i problemet)
Avatar billede arne_v Ekspert
03. september 2004 - 18:36 #10
Jeg tror at den accid pointer peger på noget memory som faktisk er
blevet frigivet til andet brug.
Avatar billede bjering Nybegynder
03. september 2004 - 18:47 #11
int checklogin(DWORD ptr, char * username, char * password)
{
    CConnection* c = reinterpret_cast <CConnection*> (ptr);
    char            cip[15];
    unsigned int    cp = 0;
    c->PeerInfo (&cip[0], 15, &cp);

    unsigned int num_rows;

    char* query = new char[100];
    sprintf(query,"SELECT * FROM account WHERE name='%s' && password='%s'", username, password);
   
    if(mysql_query(pConn,query))
    {
        // error doing the query
        Log2File(TRUE, "(MySQL) ERROR : %s\n", mysql_error(pConn));
        return 0;
    }
    else
    {
        result = mysql_store_result(pConn);
        // fetch all the rows from the query.
        num_rows = mysql_num_rows(result);
        // the username and password match, return accountid
        row = mysql_fetch_row(result);
        if(num_rows >= 1)
        {
            addaccountidmemory(cp, row[0]);
            mysql_free_result(result);
            return 1;
        }

        // no such username
        else if(num_rows == 0)
        {
            mysql_free_result(result);
            return 0;
        }
        mysql_free_result(result);
    }
    return 0;
}

den smider den ind ved addaccountidmemory(cp, row[0]);
Avatar billede arne_v Ekspert
03. september 2004 - 18:50 #12
Bingo.

den accid ligger i resultatet fra en query !

så kan det jo ikke overraske at et nyt kald til mysql_store_result overskriver den !
Avatar billede arne_v Ekspert
03. september 2004 - 18:51 #13
Erstat:

test.accountid = id;

med:

test.accountid = new char[strlen(id)+1];
strcpy(test.accountid,id);
Avatar billede bjering Nybegynder
03. september 2004 - 18:56 #14
du har sq ret... damn... (ikke fordi jeg tvivlede på dig, jeg ved du styrer den her c++ område).

hvis du smider et svar får du points'ne så jeg endelig kan få 5 minutter på øjet.. og en panodil... :P
Avatar billede arne_v Ekspert
03. september 2004 - 19:00 #15
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester