MySQL String problem
#1

Hi guys, i have a severe problem. I implemented MySQL into my script, and one vital part is the SavePlayerData function. This is my code:

pawn Код:
public SavePlayerData( playerid )
{
    printf("TEST1");
    if(Player[playerid][Authenticated] == 1 )
    {
        printf("TEST2");
        new saveQuery[3643]; // This makes the server crash

        GetPlayerPos( playerid, Player[playerid][LastX], Player[playerid][LastY], Player[playerid][LastZ]);
        Player[playerid][LastInterior] = GetPlayerInterior( playerid );
        Player[playerid][LastWorld] = GetPlayerVirtualWorld(playerid);
        GetPlayerHealth(playerid, Player[playerid][LastHealth]);
        GetPlayerArmour(playerid, Player[playerid][LastArmour]);
        printf("TEST1");
        format(saveQuery, sizeof(saveQuery), "UPDATE playerAccounts SET Banned = '%d', SecondsLoggedIn = '%d', LastSkin = '%d', Money = '%d', BankMoney = '%d'", Player[playerid][Banned], Player[playerid][SecondsLoggedIn], Player[playerid][LastSkin], Player[playerid][Money], Player[playerid][BankMoney]);

        format(saveQuery, sizeof(saveQuery), "%s, LastInterior = '%d', LastWorld = '%d', LastHealth = '%f', LastArmour = '%f', LastX = '%f', LastY = '%f', LastZ = '%f'", saveQuery, Player[playerid][LastInterior], Player[playerid][LastWorld], Player[playerid][LastHealth], Player[playerid][LastArmour], Player[playerid][LastX], Player[playerid][LastY], Player[playerid][LastZ]);

        format(saveQuery, sizeof(saveQuery), "%s, Accent = '%s', AdminLevel = '%d', Job = '%d', WepSlot0 = '%d', WepSlot1 = '%d', WepSlot2 = '%d', WepSlot3 = '%d'", saveQuery, Player[playerid][Accent], Player[playerid][AdminLevel], Player[playerid][Job], Player[playerid][WepSlot0], Player[playerid][WepSlot1], Player[playerid][WepSlot2], Player[playerid][WepSlot3]);

        format(saveQuery, sizeof(saveQuery), "%s, Ammo0 = '%d', Ammo1 = '%d', Ammo2 = '%d', Ammo3 = '%d, Ammo11 = '%d'", saveQuery, Player[playerid][Accent], Player[playerid][AdminLevel], Player[playerid][Job], Player[playerid][Ammo0], Player[playerid][Ammo1], Player[playerid][Ammo2], Player[playerid][Ammo3], Player[playerid][Ammo11]);

        format(saveQuery, sizeof(saveQuery), "%s, Ammo4 = '%d', Ammo5 = '%d', Ammo6 = '%d', Ammo7 = '%d', Ammo8 = '%d', Ammo9 = '%d', Ammo10 = '%d'", saveQuery, Player[playerid][Ammo4], Player[playerid][Ammo5], Player[playerid][Ammo6], Player[playerid][Ammo7], Player[playerid][Ammo8], Player[playerid][Ammo9], Player[playerid][Ammo10]);
       
        format(saveQuery, sizeof(saveQuery), "%s, WepSlot4 = '%d', WepSlot5 = '%d', WepSlot6 = '%d', WepSlot7 = '%d', WepSlot8 = '%d', WepSlot9 = '%d', WepSlot10 = '%d'", saveQuery, Player[playerid][WepSlot4], Player[playerid][WepSlot5], Player[playerid][WepSlot6], Player[playerid][WepSlot7], Player[playerid][WepSlot8], Player[playerid][WepSlot9], Player[playerid][WepSlot10]);

        format(saveQuery, sizeof(saveQuery), "%s, WepSlot11 = '%d', Materials = '%d', PlayingHours = '%d'", saveQuery, Player[playerid][WepSlot11], Player[playerid][Materials], Player[playerid][PlayingHours]);

        format(saveQuery, sizeof(saveQuery), "%s, Warning1 = '%s', Warning2 = '%s', Warning3 = '%s', Hospitalized = '%d', FirstLogin = '%d', PrisonDuration = '%d', PrisonID = '%d', PhoneN = '%d, HelperLevel = '%d'", saveQuery, Player[playerid][Warning1], Player[playerid][Warning2], Player[playerid][Warning3], Player[playerid][Hospitalized], Player[playerid][FirstLogin],
        Player[playerid][PrisonDuration], Player[playerid][PrisonID], Player[playerid][PhoneN], Player[playerid][HelperLevel]);

        format(saveQuery, sizeof(saveQuery), "%s, House = '%d', Muted = '%d', oMuted = '%d', nMuted = '%d', Identity = '%d', Age = '%d', ContractPrice = '%d', Contract = '%s', Tutorial = '%d', CriminalOffences = '%d', Offence1 = '%s', Offence2 = '%s'", saveQuery, Player[playerid][House], Player[playerid][Muted],
        Player[playerid][oMuted], Player[playerid][nMuted], Player[playerid][Identity], Player[playerid][Age], Player[playerid][ContractPrice], Player[playerid][Contract], Player[playerid][Tutorial], Player[playerid][CriminalOffences], Player[playerid][Offence1], Player[playerid][Offence2]);
       
        format(saveQuery, sizeof(saveQuery), "%s, Offence3 = '%s', Offence4 = '%s', Offence5 = '%s', Offence6 = '%s', Gender = '%d', Materials = '%d', Pot = '%d', Business = '%d', PhoneBook = '%d', InabilityToMatrun = '%d', InabilityToDropCar = '%d', CantFish = '%d', CollectedFish = '%d'", saveQuery, Player[playerid][Offence3], Player[playerid][Offence4], Player[playerid][Offence5],
        Player[playerid][Offence6], Player[playerid][Gender], Player[playerid][Materials], Player[playerid][Pot], Player[playerid][Business], Player[playerid][PhoneBook], Player[playerid][InabilityToMatrun], Player[playerid][InabilityToDropCar], Player[playerid][CantFish], Player[playerid][CollectedFish]);

        format(saveQuery, sizeof(saveQuery), "%s, Rope = '%d', Rags = '%d', FailedHits = '%d', SuccessfulHits = '%d', Radio = '%d', CollegeLaw = '%d', CollegeMedia = '%d', CollegeEng = '%d', CollegeMath = '%d', CollegeChem = '%d', MarriedTo = '%s', FightBox = '%d'", saveQuery, Player[playerid][Rope], Player[playerid][Rags], Player[playerid][FailedHits], Player[playerid][SuccessfulHits], Player[playerid][Radio], Player[playerid][CollegeLaw],
        Player[playerid][CollegeMedia], Player[playerid][CollegeEng], Player[playerid][CollegeMath], Player[playerid][CollegeChem], Player[playerid][MarriedTo], Player[playerid][FightBox]);
   
        format(saveQuery, sizeof(saveQuery), "%s, Note = '%s', MeActions = '%d', AdsPlaced = '%d', MatrunsExecuted = '%d', HasMapApp = '%d', HasAdApp = '%d', HasPagesApp = '%d', HasRadioApp = '%d', AnsweredQuizQuestions = '%d', AchievementRank = '%d', Tester = '%d'", saveQuery,
        Player[playerid][Note], Player[playerid][MeActions], Player[playerid][AdsPlaced], Player[playerid][MatrunsExecuted], Player[playerid][HasMapApp],
        Player[playerid][HasAdApp], Player[playerid][HasPagesApp], Player[playerid][HasRadioApp], Player[playerid][AnsweredQuizQuestions], Player[playerid][AchievementRank], Player[playerid][Tester]);

        format(saveQuery, sizeof(saveQuery), "%s, CheckBalance = '%d', ReportBanStatus = '%d', AdminDuty = '%d', CarKeys = '%d', Kills = '%d', Deaths = '%d', CantFindGold = '%d', GoldCollected = '%d', GoldAttempts = '%d', CellphoneConsole = '%d'", saveQuery, Player[playerid][CheckBalance], Player[playerid][ReportBanStatus], Player[playerid][AdminDuty],
        Player[playerid][CarKeys], Player[playerid][Kills], Player[playerid][Deaths], Player[playerid][CantFindGold], Player[playerid][GoldCollected], Player[playerid][GoldAttempts], Player[playerid][CellphoneConsole]);

        format(saveQuery, sizeof(saveQuery), "%s, FightKungfu = '%d', Group = '%d', GroupRank = '%d', LastIP = '%s', FightGrabkick = '%d', FightKneehead = '%d', VipRank = '%d', WalkieTalkie = '%d', BankStatus = '%d', PhoneCredit = '%d', PlayerSkinSlot1 = '%d', PlayerSkinSlot2 = '%d', PlayerSkinSlot3 = '%d', AdminPIN = '%d', AdminSkin = '%d', WalkieFrequency = '%d', PortableRadio = '%d' WHERE InternalID = '%d'", saveQuery, Player[playerid][FightKungfu],
        Player[playerid][Group], Player[playerid][GroupRank], Player[playerid][LastIP], Player[playerid][FightGrabkick], Player[playerid][FightKneehead], Player[playerid][VipRank], Player[playerid][WalkieTalkie], Player[playerid][BankStatus], Player[playerid][PhoneCredit], Player[playerid][PlayerSkinSlot1], Player[playerid][PlayerSkinSlot2], Player[playerid][PlayerSkinSlot3],
        Player[playerid][AdminPIN], Player[playerid][AdminSkin], Player[playerid][WalkieFrequency], Player[playerid][PortableRadio], Player[playerid][InternalID]);
        printf("TEST45");
        mysql_query(saveQuery);
    }
    return 1;
}
If i set the saveQuery string to anything below 3643(or 3643), the server crashes. If i set the saveQuery to more than 3643(3644 and up), everything works but "TEST45" won't show up in the console. Help please!

Thanks in advance
Bates
Reply
#2

I really need some help one this one.
Reply
#3

You're formatting the same string over and over.. Why not format,query, format, query, etc?
Reply
#4

I'll give it a try, but i thought it could be inefficient.
Reply
#5

Quote:
Originally Posted by Bates
Посмотреть сообщение
I'll give it a try, but i thought it could be inefficient.
No because

pawn Код:
new str[ 128 ];
format( str, sizeof str, "a" );
format( str, sizeof str, "b" );
format( str, sizeof str, "c" );
format( str, sizeof str, "d" );
format( str, sizeof str, "e" );
format( str, sizeof str, "f" );
SendClientMessage( playerid, -1, str );
Would just print f because format replaces the string, it doesn't add a new one.

So if you do
pawn Код:
new query[ qsize ];
format( query, sizeof query, "UPDATE `db`.`table` SET `something1` = '1' WHERE `table`.`trololo` = 'myn'" );
format( query, sizeof query, "UPDATE `db`.`table` SET `something1` = '1' WHERE `table`.`trololo` = 'myn2'" );
format( query, sizeof query, "UPDATE `db`.`table` SET `something1` = '1' WHERE `table`.`trololo` = 'myn3'" );
format( query, sizeof query, "UPDATE `db`.`table` SET `something1` = '1' WHERE `table`.`trololo` = 'myn4'" );
mysql_query( query );
It executes the last query (myn4 query).
Reply
#6

Use strcat.

And if you knew '' was used only for strings and that spaces are useless you would probably not crash your server.

And also you don't need to save all stuff on disconnect. Save it when it actually changes. I'm sure adminlevel doesn't change every session, does it?
Reply
#7

use strcat()
UPDATE: sorry I haven't seen the very last post.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)