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.
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.
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
Nicht so ganz, deshalb frage ich.
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
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
Auf Linux buggt die enum Funktion deshalb mach ich´s mit Möglichkeit 2
MFG Arendium
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);
DAs Mysql_free_result muss in die schleife und du splittest doppelt
Auf Linux buggt die enum Funktion
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.
Befasse mich grade 2 Minuten damit
Wie Split ich nur einmal ?
Befasse mich grade 2 Minuten damit
Wie Split ich nur einmal ?
Wenn du in der lage wärst zu lesen würde dir auffallen ein delimiter zu entfernen was ich oben ja auch geschrieben hatte
du kannst dich entscheiden
p<|>
oder
"|"
Du kannst alternativ auch eine for Schleife nehmen und wenn mysql_num_rows nicht mehr passt breaken
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
Er liest leider nichts aus. Und zeigt auch nichts in der Log an ;/
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
ZitatAlles anzeigen[19:31:33] CMySQLHandler::Query(SELECT * FROM `accounts` WHERE `Name` = 'GamerXiOS') - Successfully executed.
[19:31:33] >> mysql_free_result( Connection handle: 1 )
[19:31:33] CMySQLHandler::FreeResult() - The result is already empty.
[19:31:33] >> mysql_fetch_row_format( Connection handle: 1 )
[19:31:33] CMySQLHandler::FetchRow() - You cannot call this function now. (Reason: Empty Result)
[19:31:33] >> mysql_query( Connection handle: 1 )
[19:31:33] CMySQLHandler::Query(SELECT * FROM `accounts` WHERE `Name` = 'GamerXiOS') - An error has occured. (Error ID: 2014, Commands out of sync; you can't run this command now)
[19:31:33] >> mysql_free_result( Connection handle: 1 )
[19:31:33] CMySQLHandler::FreeResult() - The result is already empty.
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();
mysql_free_result();
Also ich weiß ja nicht aber du hast es ja ihrgend wie mit mysql_free_result(); es reicht wenn es einmal vorhandne ist
solang kein return da ist wird auch nix abgebrochen daher kannst es aus der if abfrage raus nehmen zu dem kannst du nochmal den inhalt der
mysqllog posten was nun so drinne steht
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();
[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.