|
You last visited: Today at 20:25
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.
11/22/2022, 02:01
|
#1
|
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:
Code:
quest register_account begin
state start begin
when login or letter begin
cmdchat("Register "..q.getcurrentquestindex())
end
when button or info begin
say_title("Account-Manager")
say("")
say_reward("- Mindestens 4 Zeichen lang")
say_reward("- Maximal 16 Zeichen lang. ")
say_reward("- Keine Leer und Sonderzeichen")
say_reward("")
say(" Benutzer-ID: ")
local id = tostring(input())
if string.len(id) < 4 then
chat("<Account-Manager> Registrieren fehlgeschlagen, Benutzer-ID muss mindestens 4 Zeichen lang sein. ")
return
elseif string.len(id) > 16 then
chat("<Account-Manager> Registrieren fehlgeschlagen, Benutzer-ID ist zu lang. (max. 16 Zeichen) ")
return
else
local AcEx = mysql_query("SELECT login FROM account.account WHERE login='"..id.."';")
local result = AcEx[1][1]
if result == nil or not result then
chat("test -> Kein Eintrag NIL ")
return
end
if result == id then
chat("<Account-Manager> Registrierung fehlgeschlagen, Benutzer-ID ist bereits vergeben. ")
else
say_title("Account-Manager")
say("Account wurde erfolgreich erstellt. ")
say("")
say_reward("Benutzer-ID: "..id.."")
say_reward("Passwort: 12345")
say_reward("Löschcode: 1234567")
end
end
end
end
end
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
|
#2
|
elite*gold: 130
Join Date: May 2013
Posts: 399
Received Thanks: 313
|
Quote:
Originally Posted by Endless.
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:
Code:
quest register_account begin
state start begin
when login or letter begin
cmdchat("Register "..q.getcurrentquestindex())
end
when button or info begin
say_title("Account-Manager")
say("")
say_reward("- Mindestens 4 Zeichen lang")
say_reward("- Maximal 16 Zeichen lang. ")
say_reward("- Keine Leer und Sonderzeichen")
say_reward("")
say(" Benutzer-ID: ")
local id = tostring(input())
if string.len(id) < 4 then
chat("<Account-Manager> Registrieren fehlgeschlagen, Benutzer-ID muss mindestens 4 Zeichen lang sein. ")
return
elseif string.len(id) > 16 then
chat("<Account-Manager> Registrieren fehlgeschlagen, Benutzer-ID ist zu lang. (max. 16 Zeichen) ")
return
else
local AcEx = mysql_query("SELECT login FROM account.account WHERE login='"..id.."';")
local result = AcEx[1][1]
if result == nil or not result then
chat("test -> Kein Eintrag NIL ")
return
end
if result == id then
chat("<Account-Manager> Registrierung fehlgeschlagen, Benutzer-ID ist bereits vergeben. ")
else
say_title("Account-Manager")
say("Account wurde erfolgreich erstellt. ")
say("")
say_reward("Benutzer-ID: "..id.."")
say_reward("Passwort: 12345")
say_reward("Löschcode: 1234567")
end
end
end
end
end
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
|
#3
|
elite*gold: 0
Join Date: Apr 2010
Posts: 2,047
Received Thanks: 744
|
Quote:
Originally Posted by xTryx
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.
|
|
|
11/22/2022, 06:19
|
#4
|
elite*gold: 130
Join Date: May 2013
Posts: 399
Received Thanks: 313
|
Quote:
Originally Posted by Endless.
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
|
|
|
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
|
|
|
11/23/2022, 18:49
|
#6
|
elite*gold: 0
Join Date: Apr 2010
Posts: 2,047
Received Thanks: 744
|
Quote:
Originally Posted by xAmnezia.
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
|
|
|
 |
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.
|
|