07.01.2017, 11:01
Hello, so I have this script from a tutorial on this forum, the problem is that does not save any time in the mysql database .Conectare database is done successfully
Код:
// This is a comment // uncomment the line below if you want to write a filterscript //#define FILTERSCRIPT #include <a_samp> #include <a_samp> // Our main include; rather obvious why we need this. #include <a_mysql> // Our MySQL include; R39-2 #include <sscanf2> // Sscanf2 our /create command. #include <zcmd> // And ZCMD as our command processor. // Defining the size of the enum we'll be storing info in. #define MAX_SOMETHING (50) // As for the enumerator... enum SomethingInfo { s_ID, // Our ID, you should probably always add this into your enumerator. s_Text[64], // The variables we want to load/save... s_Number, Float: s_Float }; // And create a variable for it using our previously defined expression as array size. new Something[MAX_SOMETHING][SomethingInfo]; // Alongside that, create another variable called "xCount", or whatever you want to call it. // This will be used in the "CreateSomething" function to determine how many "Somethings" have been created already. new SomethingCount; // Defining our MySQL handle. new mysql; main() { // Setting up our MySQL settings... mysql_log(LOG_ALL); // Setting up our logging: LOG_ALL logs everything (errors, warnings, and debug messages) into a text file called mysql_log.txt. mysql = mysql_connect("localhost", "root", "server", ""); // Storing our MySQL data into our handle. // Please note: this was used on a local host (as the hostname suggests). If you are using a host, you should use a different name than of "root". // Using mysql_tquery, we'll format a query which will load data from the database, and which is retrieved from an alternate callback using cache. // Params: (mysql handle, query, callback, specifier) // Please note: you're not actually obliged to use every param unless you use them. As such: mysql_tquery(mysql, "SELECT * FROM Somethings", "SQL_LoadSomething"); // Only using three params instead of all. // To finish up our MySQL callback, we'll add two debug messages which will tell us if we connected to the database. if(mysql_errno(mysql) != 0) return print("Could not connect to database!"); // If mysql_errno (error message) isn't 0/false, print a debug message. return print("Connected to database!"); // Else, print another debug message but this time confirming our connection. } // Start with a public function and forward it... forward SQL_LoadSomething(); public SQL_LoadSomething() { // If cache_num_rows returns false or '0', return an error message which let's us know there are no rows to load. if(!cache_get_row_count()) return printf("cache_get_row_count returned false. There are no rows to load."); // Create a loop which does not stop unless "i" is equal to "j", which holds the same value as "cache_get_row_count()". You should use a variable because it is faster than calling a native function. for(new i, j = cache_get_row_count(); i < j ; i++) { // For our "ID" variable, we will use our previous variable. (SomethingCount); Something[i][s_ID] = SomethingCount; // For the rest of our variables, simply store the cache data into the variable. // The params are as following: (row, field name). Alternatively, you can store your mysql handle. // Your mysql handle has to be stored as the last param, as so: Something[i][s_Number] = cache_get_field_content_int(i, "sNumber", mysql); // This is not necessary unless you have more than one mysql handle, so let's use the two params for now. Something[i][s_Float] = cache_get_field_content_float(i, "sFloat"); // When retrieving strings, our function is a little bit different. The params are as following: // (row, field name, variable to store it in, mysql handle, string length) cache_get_field_content(i, "sText", Something[i][s_Text], mysql, 64); // Send a debug message... printf("Loaded something ID %d with text %s, number %d and float %f.", i, Something[i][s_Text], Something[i][s_Number], Something[i][s_Float]); // Make our variable count up. SomethingCount ++; } // After everything has loaded, send the last debug message telling us how many rows have been loaded: printf("%d somethings have been loaded!", SomethingCount); // Start the saving timer which will tick every 15 minutes. SetTimer("SaveSomethings", 30000, true); return true; } // For our saving function, simply create another public function and forward it. // Functions like this aren't the best method to save stuff though, and you don't need them in MySQL. // You should save something when you update it instead. forward SaveSomethings(); public SaveSomethings() { new query[200]; // Create a variable to store our query in. // Loop through the value of MAX_SOMETHING the same way we looped in our load function. for(new i; i != MAX_SOMETHING; i ++) { // Using mysql_format to format our query... Params: (connectionhandle, query, query length) mysql_format(mysql, query, sizeof(query), "UPDATE Somethings SET sText = '%s', sNumber = %d, sFloat = %f WHERE ID = %d", Something[i][s_Text], Something[i][s_Number], Something[i][s_Float], Something[i][s_ID]); // Sending the threaded query. mysql_tquery(mysql, query); // Only using our handle and the query, as we are not calling a callback. } // Send a confirmation message... print("Saved all somethings!"); return true; } CMD:savetest(playerid, params[]) { new query[200]; // Create a variable to store our query in. // Loop through the value of MAX_SOMETHING the same way we looped in our load function. for(new i; i != MAX_SOMETHING; i ++) { // Using mysql_format to format our query... Params: (connectionhandle, query, query length) mysql_format(mysql, query, sizeof(query), "UPDATE Somethings SET sText = '%s', sNumber = %d, sFloat = %f WHERE ID = %d", Something[i][s_Text], Something[i][s_Number], Something[i][s_Float], Something[i][s_ID]); // Sending the threaded query. mysql_tquery(mysql, query); // Only using our handle and the query, as we are not calling a callback. } // Send a confirmation message... print("Saved all somethings!"); return true; } // For "something" creation, simply start a command... CMD:createsomething(playerid, params[]) { // Define a string for our confirmation message and variables to store data in. Keep in mind; you don't need to add a sscanf parameter // for every single variable you use in whatever you're trying to save. If you can pull data using an alternative way, do it. new string[80], text[64], number, floatval; // Setting up our sscanf specifiers and variables and an error message incase a param is left open. if(sscanf(params, "s[64]if", text, number, floatval)) return SendClientMessage(playerid, -1, "/createsomething [text] [number] [float]"); // Format our confirmation message into "string" and send it to the player. format(string, sizeof(string), "Created something ID %d with text %s number %d and float %f!", SomethingCount, text, number, floatval); SendClientMessage(playerid, -1, string); // Call our custom function for "something" creation using the data we just stored. SQL_AddSomething(text, number, floatval); return true; } // Creating a simple function: SQL_AddSomething(stext[64], number, floatval) { new query[200]; // Create another query.. // Format it like you usually would, this time using the "INSERT" and "VALUES" commands. // You don't have to put any accents around your rows, except for when you are trying to store strings. // Also, please keep in mind, my first format specifier is "query", but only because I used two seperate strings to keep my query organized. mysql_format(mysql, query, sizeof(query), "INSERT INTO Somethings (sText, sNumber, sFloat)"); mysql_format(mysql, query, sizeof(query), "%s VALUES ('%s', %d, %f)", query, stext, number, floatval); // This isn't mandatory and alternatively you can format queries like this as well: mysql_format(mysql, query, sizeof(query), "INSERT INTO Somethings (sText, sNumber, sFloat) VALUES ('%s', %d, %f)", query, stext, number, floatval); // After formatting, send a threaded query... mysql_tquery(mysql, query); // Also, do not forget to store the data you just stored into your database into your variables. This allows for // immediate usage of the enum without needing a server restart or "something" reload. Something[SomethingCount][s_ID] = SomethingCount; Something[SomethingCount][s_Text] = stext; Something[SomethingCount][s_Number] = number; Something[SomethingCount][s_Float] = floatval; // Send a confirmation message... printf("Created something ID %d with with text %s, number %d and float %f.", SomethingCount, Something[SomethingCount][s_Text], Something[SomethingCount][s_Number], Something[SomethingCount][s_Float]); // And count up our variable again. SomethingCount ++; return true; } public OnGameModeInit() { mysql_tquery(mysql, "CREATE TABLE IF NOT EXISTS `DynamicLabels` (\ `ID` int(5) NOT NULL AUTO_INCREMENT UNIQUE KEY,\ `Text` varchar(74) NOT NULL,\ `Color` int(8) NOT NULL,\ `Interior` int(5) NOT NULL,\ `VirtualWorld` int(5) NOT NULL,\ `PosX` float NOT NULL,\ `PosY` float NOT NULL,\ `PosZ` float NOT NULL)"); // Don't use these lines if it's a filterscript SetGameModeText("Blank Script"); AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0); return 1; }