Register for your free account! | Forgot your password?

Go Back   elitepvpers > Popular Games > Metin2 > Metin2 Private Server
You last visited: Today at 20:25

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Syserr Problem bei mysql Query in Quest.

Discussion on Syserr Problem bei mysql Query in Quest. within the Metin2 Private Server forum part of the Metin2 category.

Reply
 
Old   #1
 
Endless.'s Avatar
 
elite*gold: 0
Join Date: Apr 2010
Posts: 2,047
Received Thanks: 744
Syserr Problem bei mysql Query in Quest.

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
Endless. is offline  
Old 11/22/2022, 05:14   #2
 
elite*gold: 130
Join Date: May 2013
Posts: 399
Received Thanks: 313
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;
		}
	}
xTryx is offline  
Thanks
1 User
Old 11/22/2022, 06:17   #3
 
Endless.'s Avatar
 
elite*gold: 0
Join Date: Apr 2010
Posts: 2,047
Received Thanks: 744
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
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.
Endless. is offline  
Thanks
1 User
Old 11/22/2022, 06:19   #4
 
elite*gold: 130
Join Date: May 2013
Posts: 399
Received Thanks: 313
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
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
xTryx is offline  
Old 11/23/2022, 04:04   #5
 
elite*gold: 0
Join Date: Jan 2020
Posts: 626
Received Thanks: 620
Kann dir auch einfach deine Homepage zum laufen bringen anstatt mit solch einem Müll rum zu spielen.

Discord: xAmnezia#6479
xAmnezia. is offline  
Thanks
2 Users
Old 11/23/2022, 18:49   #6
 
Endless.'s Avatar
 
elite*gold: 0
Join Date: Apr 2010
Posts: 2,047
Received Thanks: 744
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
Endless. is offline  
Thanks
1 User
Reply


Similar Threads Similar Threads
Kleine Frage an die MySQL-Profis ^^ || MySQL Query
05/27/2014 - Web Development - 7 Replies
Hallo, da ich gerade dabei bin ein Script für meine Webseite umzuschreiben und die Registration einfach nicht klappt, habe ich das Script mal auseinandergenommen und angeschaut. Bei der Registration macht das Script / die Query folgendes : Also Theoretisch:
[Quest] MySQL Query Ergebnisse in Quest ausgeben lassen
12/13/2013 - Metin2 Private Server - 5 Replies
Hey Leute, ich hab mich heut an einer Kopfgeld Quest versucht und stehe nun vor folgendem Problem: Ich habe per mysql_query Command alle Spieler suchen lassen, die in der Spalte kopfgeld_exist (ja, so heißt die Spalte, in der eingetragen wird, ob der Spieler ein Kopfgeld hat oder nicht) eine 1 stehen haben. Dafür habe ich folgenden Command benutzt: mysql_query("SELECT name, kopfgeld from player.player where kopfgeld_exist = '1';") Nun würde ich gerne ingame in einer Tabelle folgendes...
PHP/MySQL Help - Is this MySQL Query correct?
09/23/2011 - CO2 Programming - 1 Replies
$rank = mysql_query("SELECT Name,Level,Class,Online FROM entities ORDER BY Level DESC LIMIT $limit"); I'm pretty sure that is right... whenever I do while ($row = mysql_fetch_array($rank)) { ... } It always gives me a mysql_fetch_array error. I've checked and the database is populated, the columns exist, so what could be the issue?



All times are GMT +1. The time now is 20:25.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.