sscanf mit MySQL.

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • new _query[512],_string[2048],_empty[128];
    format(_query,sizeof(_query),"SELECT * FROM accounts WHERE Name='%s'",PlayerName(playerid));
    mysql_query(_query);
    mysql_store_result();
    while(mysql_fetch_row(_string,"|"))
    {
    sscanf(_string,"p<|>s[128]s[128]s[128]iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
    _empty,
    ------
    }


    schau dir mal den code an der dürfte dir alles sagen

  • Huhu,


    ich wollte meine Werte aus MySQL auslesen klappt alles wunderbar, will aber jetzt auf sscanf umsteigen. (Schneller besser etc)
    Aber woher weis scanff das er jetzt der Variable X den wert Y geben soll.


    an den parametern die man angibt in was er es splitten soll und beim delimiter wann er es soll


    so um das näher zu verdeutlichen ein beispiel aus meinem autohaus


    enum BuyCar
    {
    ID,
    Model,
    Float:X,
    Float:Y,
    Float:Z,
    Float:R,
    Color1,
    Color2,
    Preis,
    Edit,
    Autohaus,
    }
    sscanf(Query, "p<|>e<iiffffiiiii>", BuyInfo[i]);


    Query ist hier ein definierter string der zum beispiel das beinhaltet.


    0|560|1953.37|1325.35|8.92012|175.621|2|2|5000|0|1


    So nun bearbeitet sscanf den string p<|> bedeutet das er den string splittet ab dem delimiter |
    also
    in

    0
    560
    1953.37
    1325.35
    8.92012
    175.621
    2
    2
    5000
    0
    1


    was danach den werten welche im enum aufgelistet sind zugeordnet werden.


    BuyCar[i][ID]= 0
    BuyCar[i][Model]= 560
    BuyCar[i][X]= 1953.37
    BuyCar[i][Y]= 1325.35
    BuyCar[i][Z]= 8.92012
    BuyCar[i][R]= 175.621
    BuyCar[i][Color1]= 2
    BuyCar[i][Color2]= 2
    BuyCar[i][Preis]= 5000
    BuyCar[i][Edit]= 0
    BuyCar[i][Autohaus]= 1


    Zu dem kannst du den delimiter beliebig ändern sei es ein | , / usw es ist alles möglich.


    du musst das ganze nichtmal einem enum dann zuordnen normale werte gehen auch


    sscanf(Query, "p<|>iiffffiiiii", BuyInfo[i][ID],BuyInfo[i][Model],BuyInfo[i][X],BuyInfo[i][Y]...);


    du kannst auch das in arrays splitten ist auch möglich

    new arr[5];
    sscanf("1,2,3,4,5", "p<|>a<i>[5]", arr);


    Ich hoffe mal deine Frage ist damit geklärt :D
    weite infos findest auch hier


    http://forum.sa-mp.com/showthread.php?t=120356


    //edit


    @ huGGy
    dein code sagt eindeutig aus das


    while(mysql_fetch_row(_string,"|"))
    unnötig ist
    "|"


    oder sollte man es gleich über mysql_fetch_row splitten
    so ist p<|> unnötig

  • Habe es jetzt so. Nur liest er nchts mehr aus.
    format(string, sizeof(string), "SELECT * FROM `accounts` WHERE `Name` = '%s'", PlayerInfo[playerid][pSpielername]);
    mysql_query(string);
    mysql_free_result();
    while(mysql_fetch_row_format(string, "|", MySQLHandle))
    {
    sscanf(string, "e<p<|>{i}iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiis[30]s[30]s[30]iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii>", PlayerInfo[playerid]);
    print(string);
    }
    mysql_free_result();
    mysql_query(string);

  • Auf Linux buggt die enum Funktion :S


    MFG Arendium


    Hm es kommt natürlich auch drauf an , was man für eine Linuxbetriebsystem benutzt Debian, ubuntu, CentOS etc... .
    Ich hab auch schon öfters mal gehört das dies buggen sollte mit dem auslesen , jedoch nicht bei jedem ^^


    zu einen da p ein spezieler specifier darf diese nicht innerhalb des e specifier benutzt werden.
    zu dem poste einfach mal dein enum da es bei sowas auch zu problemen kommen kan.


    format(string, sizeof(string), "SELECT * FROM `accounts` WHERE `Name` = '%s'", PlayerInfo[playerid][pSpielername]);
    mysql_query(string);
    mysql_store_result();
    while(mysql_fetch_row_format(string))
    {
    sscanf(string, "p<|>e<{i}iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiis[30]s[30]s[30]iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii>", PlayerInfo[playerid]);
    print(string);
    }
    mysql_free_result();
    mysql_query(string);


    zu dem benutzt man mysql_free_result(); nicht nach dem ausfürhen eines querys wenn man den inhalt weiter nutzt.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Du kannst alternativ auch eine for Schleife nehmen und wenn mysql_num_rows nicht mehr passt breaken

    Es ist beim auslesen des accounts nichtmal nötig


    if(mysql_fetch_row_format(string))das würde ganz reichen


    zu dem musst du nicht mysql_fetch_row_format
    verwenden sondern kannst auch mysql_fetch_row(string[]); nehmen

  • IPrototypeI Ja dort haste recht, ich dachte eher an Häuser/Bizes/Fahrzeuge etc. Mann kann sich aber natürlich auch den höchsten ID Wert returnen lassen


    Ja das wusste ich das du dies meinst ^^ da hast du in der variante auch völlig recht da unterstell ich dir nix.
    Ich wollte es nur hinzufügen und
    @BlackAce-Junier poste mal dein enum da macht man auch gerne fehler.


    format(string, sizeof(string), "SELECT * FROM `accounts` WHERE `Name` = '%s'", PlayerInfo[playerid][pSpielername]);
    mysql_query(string);
    mysql_store_result();
    if(mysql_fetch_row_format(string)){
    sscanf(string, "p<|>e<{i}iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiis[30]s[30]s[30]iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii>", PlayerInfo[playerid]);
    print(string);
    }
    mysql_free_result();


    um den code nochmal richtig zu stellen zu dem wie groß ist dein string und wie sieht diese aus in der log gibt print
    was zurück wenn nicht liegt es an sscanf

  • Aktuell so:

    new string {1024]; // test
    format(string, sizeof(string), "SELECT * FROM `accounts` WHERE `Name` = '%s'", PlayerInfo[playerid][pSpielername]);
    mysql_query(string);
    mysql_free_result();
    while(mysql_fetch_row_format(string))
    {
    sscanf(string, "p<|>e<iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiis[30]s[30]s[30]iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii>", PlayerInfo[playerid]);
    mysql_free_result();
    print(string);
    }
    mysql_query(string);
    mysql_free_result();


    Server log ist nichts.
    Mysql_log


  • new string {1024]; // test format(string, sizeof(string), "SELECT * FROM `accounts` WHERE `Name` = '%s'", PlayerInfo[playerid][pSpielername]); mysql_query(string); mysql_free_result(); while(mysql_fetch_row_format(string)) { sscanf(string, "p<|>e", PlayerInfo[playerid]); mysql_free_result(); print(string); } mysql_query(string); mysql_free_result();


    Er zeigt ja kein Error an garnix in der log ?(


    The result is already empty.

    CMySQLHandler::FetchRow() - You cannot call this function now. (Reason: Empty Result)


    An error has occured. (Error ID: 2014, Commands out of sync; you can't run this command now)


    Das ist die folge der sinnlosen benutzung von mysql_free_result();
    zu dem benutz keine unterschiedliche Klammern diese haben unterschiedliche funktionen habe ich gehört


    dahernew string [1024];
    da es unterschiede zwischen {playerid} und [playerid] gibt zum beispiel und schau dir die obere verbesserung an .


    und warum zum teufel
    mysql_query(string);
    am ende nochmal ?

  • Habe mich ja nicht mit dem Zeug auseinander gesetzt und lerne diese Sache auch noch.
    Habe es jetzt so gemacht wie gesagt, aber wieder nichts in der Log.


    format(string, sizeof(string), "SELECT * FROM `accounts` WHERE `Name` = '%s'", PlayerInfo[playerid][pSpielername]);
    mysql_query(string);
    mysql_free_result();
    if(mysql_fetch_row_format(string)){
    sscanf(string, "p<|>e<iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiis[30]s[30]s[30]iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii>", PlayerInfo[playerid]);
    mysql_free_result();
    print(string);
    }
    mysql_free_result();

  • format(string, sizeof(string), "SELECT * FROM `accounts` WHERE `Name` = '%s'", PlayerInfo[playerid][pSpielername]);
    mysql_query(string);
    mysql_free_result();
    if(mysql_fetch_row_format(string)){
    sscanf(string, "p<|>e<iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiis[30]s[30]s[30]iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii>", PlayerInfo[playerid]);
    printf("SSCANF:%s",string);
    }
    mysql_free_result();

    Code
    [19:51:25] CMySQLHandler::Query(SELECT * FROM accounts WHERE Name = 'GamerXiOS') - Successfully executed.[19:51:25] >> mysql_store_result( Connection handle: 1 )[19:51:25] CMySQLHandler::StoreResult() - Result was stored.[19:51:25] >> mysql_retrieve_row( Connection handle: 1 )[19:51:27] >> mysql_real_escape_string( Connection handle: 1 )[19:51:27] CMySQLHandler::EscapeString(GamerXiOS); - Escaped 9 characters to GamerXiOS.[19:51:27] >> mysql_query( Connection handle: 1 )[19:51:27] CMySQLHandler::Query(SELECT Passwort FROM accounts WHERE Name = 'GamerXiOS') - Successfully executed.[19:51:27] >> mysql_store_result( Connection handle: 1 )[19:51:27] CMySQLHandler::StoreResult() - Result was stored.[19:51:27] >> mysql_fetch_row_format( Connection handle: 1 )[19:51:27] CMySQLHandler::FetchRow() - Return: test[19:51:27] >> mysql_free_result( Connection handle: 1 )[19:51:27] CMySQLHandler::FreeResult() - Result was successfully free'd.[19:51:27] >> mysql_query( Connection handle: 1 )[19:51:27] CMySQLHandler::Query(SELECT * FROM `accounts` WHERE `Name` = 'GamerXiOS') - Successfully executed.[19:51:27] >> mysql_free_result( Connection handle: 1 )[19:51:27] CMySQLHandler::FreeResult() - The result is already empty.[19:51:27] >> mysql_fetch_row_format( Connection handle: 1 )[19:51:27] CMySQLHandler::FetchRow() - You cannot call this function now. (Reason: Empty Result)[19:51:27] >> mysql_free_result( Connection handle: 1 )[19:51:27] CMySQLHandler::FreeResult() - The result is already empty.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen