[00:04:06] [DEBUG] mysql_close - connection: 1
[00:04:06] [DEBUG] CMySQLConnection::Disconnect - connection was closed
Du rufst hier mysql_close(); auf. Das beendet die Verbindung.
Prüfe wo das im Code steht und entferne es.
[00:04:06] [DEBUG] mysql_close - connection: 1
[00:04:06] [DEBUG] CMySQLConnection::Disconnect - connection was closed
Du rufst hier mysql_close(); auf. Das beendet die Verbindung.
Prüfe wo das im Code steht und entferne es.
Du rufst hier mysql_close(); auf. Das beendet die Verbindung.Prüfe wo das im Code steht und entferne es.
Das einzige mysql_close(dbhandle); habe ich in OnGameModeExit();
Ich kann es entfernen, aber wird die mysql Verbindung dann gar nicht mehr geschlossen?
Ich kann es entfernen, aber wird die mysql Verbindung dann gar nicht mehr geschlossen?
Hast du danach noch MySQL Code der ausgeführt wird?
Die Warnung kommt nämlich nur nachdem die Funktion aufgerufen wurde.
Bei OnGameModeExit habe ich nur das mysql_close, nichts weiter.
Und die einzige weitere SafeFunktion bzw Mysql Funktion, die nicht von dir ist, ist hier vorzufinden.
if(dialogid == DIALOG_CHANGEPW){
new query[256], text[128];
if(!response) return Kick(playerid);
format(text, sizeof(text), "Erstelle dir ein neues Passwort deiner Wahl.\nUnd keine Angst, selbst wir Admins kennen dein Passwort nicht.");
if(strlen(inputtext) <4) return ShowPlayerDialog(playerid, DIALOG_CHANGEPW, DIALOG_STYLE_PASSWORD, "PASSWORT WECHSELN", text, "Okay", "Abbrechen");
mysql_format(dbhandle, query, sizeof(query), "UPDATE accounts SET password = MD5('%e') WHERE id = '%d'",inputtext, pData[playerid][p_ID]);
mysql_pquery(dbhandle, query);SendClientMessage(playerid, COLOR_LGREY, "Dein Passwort wurde erfolgreich geändert!");
return 1;
}
Jedoch hat diese Funktion nichts damit zu tun dass es nicht funktioniert, meine Überlegung war, dass die Sae Funktion nicht richtig funktioniert, je mehr Dinge du nachher übergibst.
Weil wenn der Server alles speichern soll, macht er das ja nicht, aber laden, check usw funktioniert ja. Daher wundert mich das.
lg
Setze bitte mal nach dem Query in der Speicher-Funktion einen "print" hin und lass dir das Query ausgeben.
print(query);
Poste diesen Print dann bitte mal.
Zwecks der Warnung:
Das sieht so aus als wird der Server vorher beendet (mysql_close) und erst danach will das Plugin das Query ausführen. Du gibst ja in dem Befehl die Millisekunden an. Gebe da mal 5000 an.
SA-MP Dedicated Server
----------------------
v0.3.7-R2, (C)2005-2015 SA-MP Team
[13:26:37] filterscripts = "" (string)
[13:26:37]
[13:26:37] Server Plugins
[13:26:37] --------------
[13:26:37] Loading plugin: mysql
[13:26:37] >> plugin.mysql: R39-5 successfully loaded.
[13:26:37] Loaded.
[13:26:37] Loaded 1 plugins.
[13:26:37]
[13:26:37] Filterscripts
[13:26:37] ---------------
[13:26:37] Loaded 0 filterscripts.
[13:26:37] <-| [MySQL] Verbindungsaufbau...
[13:26:37] <-| [MYSQL] Verbindung zur Datenbank wurde erfolgreich hergestellt!
[13:26:37]
----------------------------------
[13:26:37] Test Gamemode by KazutoSensei
[13:26:37] ----------------------------------
[13:26:37] Number of vehicle models: 0
[13:27:01] [connection] 127.0.0.1:63949 requests connection cookie.
[13:27:02] [connection] incoming connection: 127.0.0.1:63949 id: 0
[13:27:02] [join] KazutoSensei has joined the server (0:127.0.0.1)
[13:27:25] UPDATE accounts SET level = '1', money = '10000', adminlevel = '4', banned = '0' WHERE id = '1'
[13:27:31] UPDATE accounts SET level = '1', money = '10000', adminlevel = '4', banned = '0' WHERE id = '1'
[13:27:43] <-| [MySQL] Verbindungsaufbau...
[13:27:43] <-| [MYSQL] Verbindung zur Datenbank wurde erfolgreich hergestellt!
[13:27:43]
----------------------------------
[13:27:43] Test Gamemode by KazutoSensei
[13:27:43] ----------------------------------
[13:27:43] Number of vehicle models: 0
[13:27:50] UPDATE accounts SET level = '1', money = '10000', adminlevel = '4', banned = '0' WHERE id = '1'
[13:27:50] [part] KazutoSensei has left the server (0:1)
Alles anzeigen
[13:27:31] [WARNING] CMySQLConnection::Disconnect - no connection available
[13:27:31] [WARNING] CMySQLConnection::Disconnect - no connection available
Ok, bitte füge hier auch noch einen Print ein:
public Server_Restart(playerid){
print("Server wird beendet.");
return SendRconCommand("gmx");
}
Dann poste es nochmal.
[13:39:22] Number of vehicle models: 0
[13:39:41] [connection] 127.0.0.1:64618 requests connection cookie.
[13:39:42] [connection] incoming connection: 127.0.0.1:64618 id: 0
[13:39:43] [join] KazutoSensei has joined the server (0:127.0.0.1)
[13:40:24] UPDATE accounts SET level = '1', money = '10000', adminlevel = '4', banned = '0' WHERE id = '1'
[13:40:24] Server wird beendet.
[13:40:24] UPDATE accounts SET level = '1', money = '10000', adminlevel = '4', banned = '0' WHERE id = '1'
[13:40:36] <-| [MySQL] Verbindungsaufbau...
[13:40:36] <-| [MYSQL] Verbindung zur Datenbank wurde erfolgreich hergestellt!
[13:40:36]
Er speichert 2 mal, aber warum?
ocmd:restart(playerid, params[]){
new str[128], ms, second, minute;
if(pData[playerid][pAdminLevel] < 4) return SendClientMessage(playerid, COLOR_RED, "Du darfst diesen Befehl nicht nutzen!");
if(sscanf(params, "i", ms)) return SendClientMessage(playerid, COLOR_LGREY, "Nutze: /changepw [Zeit in Minuten(60000 = 1 Minute)]");
minute = (ms / 1000)/60; second = ms / 1000;
format(str, sizeof(str), "Der Server wird in %i Minuten und %i Sekunden neugestartet. Außerdem werden alle eure Daten gespeichert.", minute, second);
SendClientMessageToAll(COLOR_ORANGE, str);
for(new i = 0; i < MAX_PLAYERS; i++){
Save_Player_Data(i);
}
SetTimerEx("Server_Restart", ms, false, "i", playerid);
return 1;
}
Alles anzeigen
Versuche es so:
ocmd:restart(playerid, params[]){
new str[128], ms, second, minute;
if(pData[playerid][pAdminLevel] < 4) return SendClientMessage(playerid, COLOR_RED, "Du darfst diesen Befehl nicht nutzen!");
if(sscanf(params, "i", ms)) return SendClientMessage(playerid, COLOR_LGREY, "Nutze: /changepw [Zeit in Minuten(60000 = 1 Minute)]");
minute = (ms / 1000)/60; second = ms / 1000;
format(str, sizeof(str), "Der Server wird in %i Minuten und %i Sekunden neugestartet. Außerdem werden alle eure Daten gespeichert.", minute, second);
SendClientMessageToAll(COLOR_ORANGE, str);
for(new i = 0; i < MAX_PLAYERS; i++){
if(!IsPlayerConnected(i) || IsPlayerNPC(i)) continue;
Save_Player_Data(i);
}
printf("Starte Server in %d ms neu.", ms);
SetTimerEx("Server_Restart", ms, false, "i", playerid);
return 1;
}
Bitte gebe bei dem Befehl "5000" ein. Laut dem Log wurde "Server_Restart" sofort ausgeführt.
Also den Fehler fürs speichern habe ich gefunden.
Warum er jedoch 2 mal speichert, dafür könnte es nur eine Erklärung geben.
Bei restart werden alles disconnected, dementsprechen speichert er vorher wegen der for-Schleife
und danach wegen dem Disconnect.
Das Warning kann ich mir nicht erklären, dass bleibt auch weiterhin vorhanden.
Aber das speichern funktioniert jetzt, der Fehler lag am Befehl /setmoney ^^.
Sollten nochmal Probleme auftreten melde ich mich Konversation bei dir.
Um das Warning wegzubekommen, habe ich aber noch keine Lösung.
MfG
Warum er jedoch 2 mal speichert, dafür könnte es nur eine Erklärung geben.
Bei restart werden alles disconnected, dementsprechen speichert er vorher wegen der for-Schleife
Ja, der GMX ruft OnPlayerDisconnect für alle Spieler auf.
Prinzipiell würde ich mich daran aber nicht stören lassen, besser es speichert doppelt, als gar nicht.
Um das Warning wegzubekommen, habe ich aber noch keine Lösung.
Poste bitte den Server Log mit dem Print den ich dir noch in den Befehl eingebaut habe.
Da der GMX sofort ausgefürt wurde als der Befehl eingegeben wurde kommt die Warnung, da keine Verbindung mehr vorhanden war.
Ja, der GMX ruft OnPlayerDisconnect für alle Spieler auf.Prinzipiell würde ich mich daran aber nicht stören lassen, besser es speichert doppelt, als gar nicht.
Poste bitte den Server Log mit dem Print den ich dir noch in den Befehl eingebaut habe.Da der GMX sofort ausgefürt wurde als der Befehl eingegeben wurde kommt die Warnung, da keine Verbindung mehr vorhanden war.
GMX wird nicht sofort ausgeführt, ich gebe nur recht wenig ms ein, wenn ich 60000 mache dauert das wirklich 1 Minute ^^.
Nur ums schnell zu testen habe ich immer 10000 genommen oder 5000.
Laut dem Log wurde es sofort ausgeführt:
Zitat[13:40:24] UPDATE accounts SET level = '1', money = '10000', adminlevel = '4', banned = '0' WHERE id = '1'
[13:40:24] Server wird beendet.
[13:40:24] UPDATE accounts SET level = '1', money = '10000', adminlevel = '4', banned = '0' WHERE id = '1'
Die erste Zeile ist die Speicherung vom Befehl.
Die zweite Zeile ist der Print aus dem public, das der Timer aufruft (keine Sekunde vergangen).
Die dritte Zeile ist die Speicherung durch den GMX (OnPlayerDisconnect).
Zwischen 1 und 2 muss etwas mehr Zeit liegen, damit das erste Query ausgeführt werden kann => Keine Warnung mehr (1. Warnung).
Dann musst du bei dem public Server_Restart eine globale Variable auf "true" setzen, und diese fragst du dann bei OnPlayerDisconnect ab:
if(serverInRestart == true) return 1;
Das verhindert dann, dass doppelt gespeichert wird und somit, dass die zweite Warnung auftritt.
hInfo[h][hi_x] = 13.3828;
mysql_format(handle,query,sizeof(query),"INSERT INTO häuser (BesitzerID, Besitzer, X, Y, Z, A, Interior, Preis, Level, iX) VALUES ('%d', '%s', '%f', '%f', '%f', '%f', '%d', '%d', '%d', '%f')",hInfo[h][h_ownid],hInfo[h][hOwner],hInfo[h][h_x],hInfo[h][h_y],hInfo[h][h_z],hInfo[h][h_a],hInfo[h][h_int],price,level,hInfo[h][hLock],hInfo[h][hi_x]);mysql_pquery(handle,query);
Wird so in der Tabelle gespeichert: 1,4013E-45
MySQL Log:
[02:34:27] [DEBUG] mysql_format - connection: 1, len: 1200, format: "INSERT INTO häuser (BesitzerID, Besitzer, X, Y, Z, A, Interior, Preis, Level, iX) VALUES ('%d', '%s', '%f', '%f', '%f', '%f', '%..."[02:34:27] [DEBUG] mysql_pquery - connection: 1, query: "INSERT INTO häuser (BesitzerID, Besitzer, X, Y, Z, A, Interior, ", callback: "(null)", format: "(null)"[02:34:27] [DEBUG] CMySQLQuery::Execute[] - starting query execution[02:34:27] [DEBUG] CMySQLQuery::Execute[] - query was successfully executed within 50.642 milliseconds[02:34:27] [DEBUG] CMySQLQuery::Execute[] - no callback specified, skipping result saving
es geht nur um die letzte Koordiante
Tabellen Typ ist float
es geht nur um die letzte Koordiante
Bei X, Y, Z, A geht es, aber bei iX nicht? Oder wie meinst du das?
Ich bin schon ein gutes Stück weiter, und habe nur noch ein Problem.
Die Floated werden beim speichern gerundet, so dass sich die Koordinaten leicht verfälschen...
Wie behebe ich das?
Die Floated werden beim speichern gerundet, so dass sich die Koordinaten leicht verfälschen...
In dem Bereich, in dem es für die Koordinaten ausschlaggebend wäre, ist mir das auch nicht bekannt, dass es sich von selbst rundet.
Hast du es alternativ mal mit DECIMAL als Datentyp versucht?
Also da viele das gleiche Problem haben, unter anderem auch ich, habe ich jetzt herausgefunden, dass bei UPDATE problematische fehler drin sind!
format(Query, sizeof(Query), "UPDATE interior SET Erstellt=%b, Aktiv=%b, Name='%s' WHERE ID=%i",
Interior[interiorid][iErstellt], Interior[interiorid][iAktiv], Interior[interiorid][iName],
interiorid);
mysql_function_query(MySQL_DB, Query, false, "", "");
Wichtig dabei ist, dass NUR strings mit den ' ' abgespeichert werden. Bei allen anderen arten von variablen hat es bei mir Fehler verursacht...
Bitte Hilfe..., wenn ich bei MYsQL Drücke auf ADMIN, kommt keine Seite, es ladet nichts...??