Syserr Problem bei mysql Query in Quest.

11/22/2022 02:01 Endless.#1
Guten Morgen liebe Com,

wieder einmal machen mir diese Syserr Meldungen ein Strich durch die Rechnung.

Vorübergehen muss ich meine Accounts via Quest erstellen lassen, da ich im Moment Schwierigkeiten habe, meine Seite zum Laufen zu kriegen.

Als kleines Workaround wollte ich ein simples Quest-Script anfertigen, welches dazu dient, kurz ein Test Account zu erstellen.

Ich habe eigentlich die Regel der Lua Programmierung beachtet und mein Script so geschrieben:


Nach jetzt gefühlten 100 Versuchen mir alle möglichen Varianten ausgeben zu lassen, bekomme ich ständig diese Fehlermeldung in der Konsole:

Code:
RunState: LUA_ERROR: [string "register_account"]:17: attempt to index field `?' (a nil value)
Ich habe es mit vielen anderen if Bedingungen versucht wie z.B tostring,if not result, if result == false usw.

Ich möchte erreichen, dass meine Testfunktion ausgeführt wird, sobald in der Datenbank kein Eintrag gefunden wird, ich verstehe nicht wieso er diese NIL value nicht ignoriert obwohl ich eine Bedingung gestellt habe, dass er gerade dann was in den chat schreiben soll.


Kann mir bitte jemand sagen warum ich diese Meldung kriege und wie ich des am besten beseitigen kann? Diese MySQL Query Funktion hat generell Probleme, mit dem Rückgabewert 0 und deswegen habe ich als Fixx auch das hier in meiner Questlib drin:

Code:
function split(str, delim, maxNb)
    if str == nil then return str end
    if string.find(str, delim) == nil then return { str } end
    if maxNb == nil or maxNb < 1 then maxNb = 0 end
    local result = {}
    local pat = "(.-)" .. delim .. "()"
    local nb = 0
    local lastPos
    for part, pos in string.gfind(str, pat) do
        nb = nb + 1
        result[nb] = part
        lastPos = pos
        if nb == maxNb then break end
    end
    if nb ~= maxNb then result[nb + 1] = string.sub(str, lastPos) end
    return result
end
Doch scheint leider immernoch das selbe Problem zu sein.


Ich würde mich über jede Hilfe riesig freuen :)

€: if result == "" then funktioniert leider auch nicht.

Gruß, Endless :)
11/22/2022 05:14 xTryx#2
Quote:
Originally Posted by Endless. View Post
Guten Morgen liebe Com,

wieder einmal machen mir diese Syserr Meldungen ein Strich durch die Rechnung.

Vorübergehen muss ich meine Accounts via Quest erstellen lassen, da ich im Moment Schwierigkeiten habe, meine Seite zum Laufen zu kriegen.

Als kleines Workaround wollte ich ein simples Quest-Script anfertigen, welches dazu dient, kurz ein Test Account zu erstellen.

Ich habe eigentlich die Regel der Lua Programmierung beachtet und mein Script so geschrieben:


Nach jetzt gefühlten 100 Versuchen mir alle möglichen Varianten ausgeben zu lassen, bekomme ich ständig diese Fehlermeldung in der Konsole:

Code:
RunState: LUA_ERROR: [string "register_account"]:17: attempt to index field `?' (a nil value)
Ich habe es mit vielen anderen if Bedingungen versucht wie z.B tostring,if not result, if result == false usw.

Ich möchte erreichen, dass meine Testfunktion ausgeführt wird, sobald in der Datenbank kein Eintrag gefunden wird, ich verstehe nicht wieso er diese NIL value nicht ignoriert obwohl ich eine Bedingung gestellt habe, dass er gerade dann was in den chat schreiben soll.


Kann mir bitte jemand sagen warum ich diese Meldung kriege und wie ich des am besten beseitigen kann? Diese MySQL Query Funktion hat generell Probleme, mit dem Rückgabewert 0 und deswegen habe ich als Fixx auch das hier in meiner Questlib drin:

Code:
function split(str, delim, maxNb)
    if str == nil then return str end
    if string.find(str, delim) == nil then return { str } end
    if maxNb == nil or maxNb < 1 then maxNb = 0 end
    local result = {}
    local pat = "(.-)" .. delim .. "()"
    local nb = 0
    local lastPos
    for part, pos in string.gfind(str, pat) do
        nb = nb + 1
        result[nb] = part
        lastPos = pos
        if nb == maxNb then break end
    end
    if nb ~= maxNb then result[nb + 1] = string.sub(str, lastPos) end
    return result
end
Doch scheint leider immernoch das selbe Problem zu sein.


Ich würde mich über jede Hilfe riesig freuen :)

€: if result == "" then funktioniert leider auch nicht.

Gruß, Endless :)
Wieso greifst du nicht über z.b. Navicat auf die DB zu und erstellst dir so einen Account? Ich würde Querys direkt im Source machen da funktioniert das dann auch.

Mit lua kenn ich mich nicht aus ich kann dir aber ein beispiel zeigen wie du es im source machen kannst

Code:
{
		char Query[512];
		snprintf(Query, sizeof(Query),
			"INSERT INTO player.horse (PID,level,exp,health,max_health,defense,skill_level_1,skill_level_2,skill_level_3,class,armor) VALUES('%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d')",
			GetPlayerID(), MyHorse.Level, MyHorse.EXP, MyHorse.Health, MyHorse.MaxHealth, MyHorse.Defense, MyHorse.SkillLevel1, MyHorse.SkillLevel2, MyHorse.SkillLevel3, HorseClassEnumToInt(MyHorse.Class), HorseArmorEnumToInt(MyHorse.Armor));
		std::unique_ptr<SQLMsg> msg(DBManager::instance().DirectQuery(szQuery));
	}

	{
		char Query[512];
		snprintf(Query, sizeof(Query),
			"UPDATE player.horse SET level = %d, exp = %d, health = %d,max_health = %d,defense = %d,skill_level_1 = %d,skill_level_2 = %d,skill_level_3 = %d, class = %d, armor = %d WHERE PID = %d",
			MyHorse.Level, MyHorse.EXP, MyHorse.Health, MyHorse.MaxHealth, MyHorse.Defense, MyHorse.SkillLevel1, MyHorse.SkillLevel2, MyHorse.SkillLevel3, HorseClassEnumToInt(MyHorse.Class), HorseArmorEnumToInt(MyHorse.Armor), GetPlayerID());
		std::unique_ptr<SQLMsg> msg(DBManager::instance().DirectQuery(Query));
	}

	{
		char Query[512];
		snprintf(Query, sizeof(Query), "DELETE FROM player.horse WHERE PID = %d", GetPlayerID());
		std::unique_ptr<SQLMsg> msg(DBManager::instance().DirectQuery(Query));
	}

	{
		char Query[512];
		snprintf(Query, sizeof(Query), "SELECT * FROM player.horse WHERE PID = %d", GetPlayerID());
		std::unique_ptr<SQLMsg> msg(DBManager::instance().DirectQuery(Query));

		if (msg->Get()->uiNumRows == 0)
		{
			return;
		}
		else
		{
			int horseclass = 0;
			int armorclass = 0;
			MYSQL_ROW row = mysql_fetch_row(msg->Get()->pSQLResult);
			str_to_number(MyHorse.Level, row[1]);
			str_to_number(MyHorse.EXP, row[2]);
			str_to_number(MyHorse.Health, row[3]);
			str_to_number(MyHorse.MaxHealth, row[4]);
			str_to_number(MyHorse.Defense, row[5]);
			str_to_number(MyHorse.SkillLevel1, row[6]);
			str_to_number(MyHorse.SkillLevel2, row[7]);
			str_to_number(MyHorse.SkillLevel3, row[8]);
			str_to_number(horseclass, row[9]);
			str_to_number(armorclass, row[10]);
			MyHorse.Class = HorseClassIntToEnum(horseclass);
			MyHorse.Armor = HorseArmorIntToEnum(armorclass);
			return;
		}
	}
11/22/2022 06:17 Endless.#3
Quote:
Originally Posted by xTryx View Post
Wieso greifst du nicht über z.b. Navicat auf die DB zu und erstellst dir so einen Account? Ich würde Querys direkt im Source machen da funktioniert das dann auch.

Mit lua kenn ich mich nicht aus ich kann dir aber ein beispiel zeigen wie du es im source machen kannst

Code:
{
		char Query[512];
		snprintf(Query, sizeof(Query),
			"INSERT INTO player.horse (PID,level,exp,health,max_health,defense,skill_level_1,skill_level_2,skill_level_3,class,armor) VALUES('%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d')",
			GetPlayerID(), MyHorse.Level, MyHorse.EXP, MyHorse.Health, MyHorse.MaxHealth, MyHorse.Defense, MyHorse.SkillLevel1, MyHorse.SkillLevel2, MyHorse.SkillLevel3, HorseClassEnumToInt(MyHorse.Class), HorseArmorEnumToInt(MyHorse.Armor));
		std::unique_ptr<SQLMsg> msg(DBManager::instance().DirectQuery(szQuery));
	}

	{
		char Query[512];
		snprintf(Query, sizeof(Query),
			"UPDATE player.horse SET level = %d, exp = %d, health = %d,max_health = %d,defense = %d,skill_level_1 = %d,skill_level_2 = %d,skill_level_3 = %d, class = %d, armor = %d WHERE PID = %d",
			MyHorse.Level, MyHorse.EXP, MyHorse.Health, MyHorse.MaxHealth, MyHorse.Defense, MyHorse.SkillLevel1, MyHorse.SkillLevel2, MyHorse.SkillLevel3, HorseClassEnumToInt(MyHorse.Class), HorseArmorEnumToInt(MyHorse.Armor), GetPlayerID());
		std::unique_ptr<SQLMsg> msg(DBManager::instance().DirectQuery(Query));
	}

	{
		char Query[512];
		snprintf(Query, sizeof(Query), "DELETE FROM player.horse WHERE PID = %d", GetPlayerID());
		std::unique_ptr<SQLMsg> msg(DBManager::instance().DirectQuery(Query));
	}

	{
		char Query[512];
		snprintf(Query, sizeof(Query), "SELECT * FROM player.horse WHERE PID = %d", GetPlayerID());
		std::unique_ptr<SQLMsg> msg(DBManager::instance().DirectQuery(Query));

		if (msg->Get()->uiNumRows == 0)
		{
			return;
		}
		else
		{
			int horseclass = 0;
			int armorclass = 0;
			MYSQL_ROW row = mysql_fetch_row(msg->Get()->pSQLResult);
			str_to_number(MyHorse.Level, row[1]);
			str_to_number(MyHorse.EXP, row[2]);
			str_to_number(MyHorse.Health, row[3]);
			str_to_number(MyHorse.MaxHealth, row[4]);
			str_to_number(MyHorse.Defense, row[5]);
			str_to_number(MyHorse.SkillLevel1, row[6]);
			str_to_number(MyHorse.SkillLevel2, row[7]);
			str_to_number(MyHorse.SkillLevel3, row[8]);
			str_to_number(horseclass, row[9]);
			str_to_number(armorclass, row[10]);
			MyHorse.Class = HorseClassIntToEnum(horseclass);
			MyHorse.Armor = HorseArmorIntToEnum(armorclass);
			return;
		}
	}
In C++ bin ich leider nicht sehr gut, ich wüsste z.B nicht wo ich das genau rein tun soll und wie ich ein Client Button damit verknüpfe. Wäre der compiler nicht so lahm, würde ich des problemlos ausprobieren können aber diese Methode wäre evtl. sehr zeitaufwändig bis die mal funktioniert :D
Daher will ich lieber ne Query in die Db einspielen welche bloß davor ein paar Werte prüfen soll und zwar nur obs diese ID schon gibt. Wenn er eine findet, gibt er mir auch meine eigene ID aus, was auch richtig ist, nur jedesmal bei der nil value hat es Probleme.

Ich danke dir trotzdem für die Information.
11/22/2022 06:19 xTryx#4
Quote:
Originally Posted by Endless. View Post
In C++ bin ich leider nicht sehr gut, ich wüsste z.B nicht wo ich das genau rein tun soll und wie ich ein Client Button damit verknüpfe. Wäre der compiler nicht so lahm, würde ich des problemlos ausprobieren können aber diese Methode wäre evtl. sehr zeitaufwändig bis die mal funktioniert :D
Daher will ich lieber ne Query in die Db einspielen welche bloß davor ein paar Werte prüfen soll und zwar nur obs diese ID schon gibt. Wenn er eine findet, gibt er mir auch meine eigene ID aus, was auch richtig ist, nur jedesmal bei der nil value hat es Probleme.

Ich danke dir trotzdem für die Information.
wenn du dir nur einen account erstellen willst dann brauchst du garnix ingame machen sondern nur beim server nachdem die connection zur db aufgebaut wurde direkt die query nachschicken die einfachste methode wäre aber immer noch über z.b. navicat
11/23/2022 04:04 xAmnezia.#5
Kann dir auch einfach deine Homepage zum laufen bringen anstatt mit solch einem Müll rum zu spielen.

Discord: xAmnezia#6479
11/23/2022 18:49 Endless.#6
Quote:
Originally Posted by xAmnezia. View Post
Kann dir auch einfach deine Homepage zum laufen bringen anstatt mit solch einem Müll rum zu spielen.

Discord: xAmnezia#6479
Guten Abend, Amnezia

vielen Dank für deine Hilfsbereitschaft :) Ich hab dies mittlerweile in Griff bekommen und diese Quest nur als vorübergehende Methode verwendet.

Ursache des Problems waren fehlende PHP module auf apache2 die ich nachinstallieren musste. Falls ich aber Fragen haben sollte, werde ich mich bei dir melden.

Ansonsten kann dieser Thread als gelöst markiert werden :)


Gruß, Endless :)