SA-MP Forums Archive
MySQL query issue - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: SA-MP Scripting and Plugins (https://sampforum.blast.hk/forumdisplay.php?fid=8)
+--- Forum: Scripting Help (https://sampforum.blast.hk/forumdisplay.php?fid=12)
+--- Thread: MySQL query issue (/showthread.php?tid=642020)



MySQL query issue - AlphaPac - 23.09.2017

So for some reason, when a player drops/buys an item, after the delete/insert query it shows an item or 2 out of your inventory in another players inventory.

I can't seem to see the issue.

Load Query:
PHP Code:
mysql_format(ourConnectionquerysizeof(query), "SELECT * FROM inventory_items WHERE char_id = %i"PlayerInfo[playerid][pDBID]);
    
mysql_tquery(ourConnectionquery"Query_LoadInvItems""i"PlayerInfo[playerid][pDBID]); 
function:Query_LoadInvItems:
PHP Code:
function:Query_LoadInvItems(playeridinvid)
{
    new 
rowsfields
    
cache_get_row_count(rows); 
    
cache_get_field_count(fields);
    
    for (new 
0rowsi++)
    {
        
cache_get_value_name_int(i"items_id"InvItems[i][iItemsID]);
        
cache_get_value_name_int(i"char_id"InvItems[i][iCharID]);
        
cache_get_value_name_int(i"modelid"InvItems[i][iModelID]);
        
cache_get_value_name(i"item_name"InvItems[i][iItemName], 50);
        
cache_get_value_name_int(i"item_amount"InvItems[i][iItemAmount]);
    }

AddToInv(the insert query after purchasing an item):
PHP Code:
function:AddToInv(playeridmodeliditemname[], itemamount)
{
    new 
newinv ReturnInvItems(playerid);
    new 
query[256];
    if(
newinv 16)
    {
        
mysql_format(ourConnectionquerysizeof(query), "INSERT INTO inventory_items (char_id, modelid, item_name, item_amount) VALUES(%i, %i,'%s', %i)"PlayerInfo[playerid][pDBID], modeliditemnameitemamount); 
        
mysql_query(ourConnectionquery); 
        
    }
    else return 
SendErrorMessage(playerid"SERVER: Your inventory is full."); 
    return 
1;




Re: MySQL query issue - whadez - 23.09.2017

Code:
function:Query_LoadInvItems(playerid, invid) 
{ 
    new rows, fields;  
    cache_get_row_count(rows);  
    cache_get_field_count(fields); 
     
    for (new i = 0; i < rows; i++) 
    { 
        cache_get_value_name_int(i, "items_id", InvItems[i][iItemsID]); 
        cache_get_value_name_int(i, "char_id", InvItems[i][iCharID]); 
        cache_get_value_name_int(i, "modelid", InvItems[i][iModelID]); 
        cache_get_value_name(i, "item_name", InvItems[i][iItemName], 50); 
        cache_get_value_name_int(i, "item_amount", InvItems[i][iItemAmount]); 
		
    } 
}  

It should be (If you have no clue how to assign the right index, make a 3d array [just use my version below]):

cache_get_value_name_int(i, "items_id", InvItems[playerid][i][iItemsID]); 
cache_get_value_name_int(i, "char_id", InvItems[playerid][i][iCharID]); 
cache_get_value_name_int(i, "modelid", InvItems[playerid][i][iModelID]); 
cache_get_value_name(i, "item_name", InvItems[playerid][i][iItemName], 50); 
cache_get_value_name_int(i, "item_amount", InvItems[playerid][i][iItemAmount]); 

But you should use (better version):

cache_get_value_name_int(i, "items_id", InvItems[playerid*MAX_ITEM+i][iItemsID]); 
cache_get_value_name_int(i, "char_id", InvItems[playerid*MAX_ITEM+i][iCharID]); 
cache_get_value_name_int(i, "modelid", InvItems[playerid*MAX_ITEM+i][iModelID]); 
cache_get_value_name(i, "item_name", InvItems[playerid*MAX_ITEM+i][iItemName], 50); 
cache_get_value_name_int(i, "item_amount", InvItems[playerid*MAX_ITEM+i][iItemAmount]); 

// Explaination:

// Loop [player id: 0]
InvItems[playerid * 20 + i (0)][variable]
InvItems[playerid * 20 + i (1)][variable]
InvItems[playerid * 20 + i (2)][variable]

// Loop [player id: 1]
InvItems[playerid * 20 + i (20)][variable]
InvItems[playerid * 20 + i (21)][variable]
InvItems[playerid * 20 + i (22)][variable]

// To test out the values

GetPlayerItems(playerid) {
	new i=-1, tempStr[256];
	for(;++i<MAX_ITEMS;) {
		format(tempStr, sizeof tempStr, "Assigned Index: %i | iItemsID: %i", (playerid * MAX_ITEMS + i), InvItems[playerid*MAX_ITEM+i][iItemsID]);
	}
	SendClientMessage(playerid, -1, tempStr);
	return 1;
}

Change the array size to:
InvItems[MAX_ITEMS * MAX_PLAYERS][ENUM]



Re: MySQL query issue - AlphaPac - 23.09.2017

Quote:
Originally Posted by whadez
View Post
Code:
function:Query_LoadInvItems(playerid, invid) 
{ 
    new rows, fields;  
    cache_get_row_count(rows);  
    cache_get_field_count(fields); 
     
    for (new i = 0; i < rows; i++) 
    { 
        cache_get_value_name_int(i, "items_id", InvItems[i][iItemsID]); 
        cache_get_value_name_int(i, "char_id", InvItems[i][iCharID]); 
        cache_get_value_name_int(i, "modelid", InvItems[i][iModelID]); 
        cache_get_value_name(i, "item_name", InvItems[i][iItemName], 50); 
        cache_get_value_name_int(i, "item_amount", InvItems[i][iItemAmount]); 
		
    } 
}  

It should be (If you have no clue how to assign the right index, make a 3d array [just use my version below]):

cache_get_value_name_int(i, "items_id", InvItems[playerid][i][iItemsID]); 
cache_get_value_name_int(i, "char_id", InvItems[playerid][i][iCharID]); 
cache_get_value_name_int(i, "modelid", InvItems[playerid][i][iModelID]); 
cache_get_value_name(i, "item_name", InvItems[playerid][i][iItemName], 50); 
cache_get_value_name_int(i, "item_amount", InvItems[playerid][i][iItemAmount]); 

But you should use (better version):

cache_get_value_name_int(i, "items_id", InvItems[playerid*MAX_ITEM+i][iItemsID]); 
cache_get_value_name_int(i, "char_id", InvItems[playerid*MAX_ITEM+i][iCharID]); 
cache_get_value_name_int(i, "modelid", InvItems[playerid*MAX_ITEM+i][iModelID]); 
cache_get_value_name(i, "item_name", InvItems[playerid*MAX_ITEM+i][iItemName], 50); 
cache_get_value_name_int(i, "item_amount", InvItems[playerid*MAX_ITEM+i][iItemAmount]); 

// Explaination:

// Loop [player id: 0]
InvItems[playerid * 20 + i (0)][variable]
InvItems[playerid * 20 + i (1)][variable]
InvItems[playerid * 20 + i (2)][variable]

// Loop [player id: 1]
InvItems[playerid * 20 + i (20)][variable]
InvItems[playerid * 20 + i (21)][variable]
InvItems[playerid * 20 + i (22)][variable]

// To test out the values

GetPlayerItems(playerid) {
	new i=-1, tempStr[256];
	for(;++i<MAX_ITEMS;) {
		format(tempStr, sizeof tempStr, "Assigned Index: %i | iItemsID: %i", (playerid * MAX_ITEMS + i), InvItems[playerid*MAX_ITEM+i][iItemsID]);
	}
	SendClientMessage(playerid, -1, tempStr);
	return 1;
}

Change the array size to:
InvItems[MAX_ITEMS * MAX_PLAYERS][ENUM]
It seems that it is no longer fetching the data from the database using this. It's setting everything to "0".

Well, it's fetching it, just not setting it to the enums.