MYSQL (edited reply) -
v1k1nG - 08.10.2018
Hey I was looking for an explanation about this
PHP код:
cache_get_value_int(0/*Why 0 here?*/, "Name", var);
Re: MYSQL -
Calisthenics - 08.10.2018
https://sampwiki.blast.hk/wiki/MySQL#ca...value_name_int
First row (it always starts from 0).
Re: MYSQL -
v1k1nG - 08.10.2018
So if I have more rows with same "Name" I have to use a for loop?
Re: MYSQL -
v1k1nG - 08.10.2018
Quote:
Originally Posted by ******
And you need to use any loop, `for` is just one type.
|
Could you do a short example? I'd be grateful!
Re: MYSQL -
v1k1nG - 08.10.2018
Quote:
Originally Posted by ******
|
That means "while x > 0" right?
Re: MYSQL -
v1k1nG - 08.10.2018
Thanks!!
Edit: Here is my problem:
PHP код:
stock SaveObjects(playerid, id)
{
new DB_Query[256];
mysql_format(Database2, DB_Query, sizeof DB_Query, "SELECT * FROM `usersobjectsinfo` WHERE `USERNAME` = '%e'", P[playerid][Name]);
mysql_tquery(Database2, DB_Query, "OnPlayerSaveObjects", "ii", playerid, id);
print("query sent. Calling OnPlayerSaveObjects");
return 1;
}
forward OnPlayerSaveObjects(playerid, id);
public OnPlayerSaveObjects(playerid, id){
print("OnPlayerSaveObjects called");
new Cache: rand = cache_save(), tempid0;
cache_set_active(rand);
new DB_Query[256];
while(cache_num_rows())
{
print("cache num rows are != 0");
cache_get_value_int(0, "OBJECTID", tempid0);
printf("id= %d tempid0= %d", id, tempid0);
// CODE BELOW DOESN'T GET EXECUTED
if(id == tempid0){
mysql_format(Database2, DB_Query, sizeof DB_Query, "UPDATE `usersobjectsinfo` SET `POSX`=%0.4f,`POSY`=%0.4f,`POSZ`=%0.4f,`ROTX`=%0.4f,`ROTY`=%0.4f,`ROTZ`=%0.4f,`OBJECTID`=%d WHERE `USERNAME`= '%e' LIMIT 1",
Obj[id][PosX], Obj[id][PosY], Obj[id][PosZ], Obj[id][RX], Obj[id][RY], Obj[id][RX], id, Obj[id][ObjOwner]);
printf("%s tempid0 = id", Obj[id][ObjOwner]);
mysql_tquery(Database2, DB_Query);
cache_delete(rand);
return 1;
}
mysql_format(Database2, DB_Query, sizeof DB_Query, "INSERT INTO `usersobjectsinfo` (`USERNAME`,`POSX`,`POSY`,`POSZ`,`ROTX`,`ROTY`,`ROTZ`,`OBJECTID`) VALUES ('%e','%0.3f','%0.3f','%0.3f','%0.3f','%0.3f','%0.3f','%d')",
P[playerid][Name],Obj[id][PosX], Obj[id][PosY], Obj[id][PosZ], Obj[id][RX], Obj[id][RY], Obj[id][RX], id);
printf("%s tempid0 != id", Obj[id][ObjOwner]);
mysql_tquery(Database2, DB_Query);
cache_delete(rand);
return 1;
}
return print("Couldnt execute any object-saving queries");
}
Re: MYSQL -
Calisthenics - 08.10.2018
It does not move to next row (as in SQLite) by itself so the `while` loop would be same as `for`.
pawn Код:
new i = 0, rows = cache_num_rows();
while (i < rows)
{
// cache functions
i++;
}
pawn Код:
for (new i = 0, rows = cache_num_rows(); i < rows; i++)
{
// cache functions
}
I noticed something that it is very weird. Why do you save cache, set active cache and delete cache? Threaded queries do this on their own. Remove it altogether.
About your method, an INSERT INTO .. ON DUPLICATE is better. If you can provide more details about your tables and what you are trying to do by checking if the object has been saved or not, we can fix it.
Re: MYSQL -
v1k1nG - 08.10.2018
Sorry for the delay, had to cook dinner
https://pastebin.com/2xJfgexv
Re: MYSQL -
Calisthenics - 08.10.2018
pawn Код:
#define MAX_POBJECTS 35
// When server starts
// for(new i = 0; i < MAX_POBJECTS; i++)LoadObjects(i);
LoadObjetcs(id){
Obj[id][Exists] = 0;
new DB_Query[64];
mysql_format(Database2, DB_Query, sizeof(DB_Query), "SELECT * FROM `usersobjectsinfo`");
mysql_tquery(Database2, DB_Query, "LoadObjectsCoordinates","i", id);
return 1;
}
You execute `LoadObjects` 35 times but your query selects all the data each time. Execute 1 query and a loop to load all the objects at once.
Does it also mean that a player can only create 1 object (35 players max) or 35 objects per player?
Remove the save cache, set active cache and delete cache parts.
pawn Код:
strcat(DB_Query, "CREATE TABLE IF NOT EXISTS `usersobjectsinfo`");
strcat(DB_Query,"(`ID` int(11) NOT NULL AUTO_INCREMENT,");
strcat(DB_Query,"`USERNAME` varchar(24),`POSX` float(12),"); // To get track of who created that obj
strcat(DB_Query,"`POSY` float(12),");
strcat(DB_Query,"`POSZ` float(12),");
strcat(DB_Query,"`ROTX` float(12),");
strcat(DB_Query,"`ROTY` float(12),");
strcat(DB_Query,"`ROTZ` float(12),");
strcat(DB_Query,"`OBJECTID` mediumint(7) NOT NULL,");
strcat(DB_Query,"PRIMARY KEY (`ID`))");
The main reason I had suggested to you to use 2 tables was to avoid storing the name of player in each row. At least, insert the registration ID instead.
What pair is unique? userid + objectid
Set those two columns as a UNIQUE KEY (yes, multi-column in 1 key). Now you do not even need the select query, nor checking if x is equal to y.
pawn Код:
INSERT INTO usersobjectsinfo (...) VALUES (...) ON DUPLICATE KEY UPDATE ...
Re: MYSQL -
v1k1nG - 10.10.2018
Will get into this soon! Tried to give you some reputation.. I don't get why it's not possible