mysql_fetch_row lässt Server Chrashen

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Nabend


    Ich habe ein problem, mit der Funktion mysql_fetch_row
    Wenn ein 2. Spieler connectet, dann geht er wegen der while schleife in die Knie
    Ich frage mich zwar wiso aber mir fällt keine lösung ein.


    Ich arbeite mit den Strickenkid plugin und nein ich nehme nicht das Blue G.


    stock LoadPlayer(playerid,Key[])
    {
    new Data[1024],query[256];
    format(query, 256, "SELECT `Passwort` FROM `player` WHERE `Name` = '%s'", PlayerInfo[playerid][Name]);
    mysql_query(query, (-1), (0), SQL);
    mysql_store_result(SQL);
    while(mysql_fetch_row(Data, "|", SQL))sscanf(Data, "p<|>s[128]",PlayerInfo[playerid][Passwort]);// an der while schleife chrasht er
    if(!strcmp(MD5_Hash(Key), PlayerInfo[playerid][Passwort], true))
    {
    mysql_free_result(SQL);
    format(query, sizeof(query),"SELECT * FROM `player` WHERE `Name` = '%s'",PlayerInfo[playerid][Name]);
    mysql_query(query, (-1), (0), SQL);
    mysql_store_result(SQL);
    while(mysql_fetch_row(Data, "|", SQL))
    {
    sscanf(Data, "p<|>ds[64]s[128]dddddddddddds[128]s[128]s[16]dd",
    PlayerInfo[playerid][Userid],PlayerInfo[playerid][Name],PlayerInfo[playerid][Passwort],PlayerInfo[playerid][Admin],PlayerInfo[playerid][Job],PlayerInfo[playerid][Team],PlayerInfo[playerid][Geld],PlayerInfo[playerid][Skin],
    PlayerInfo[playerid][Level],PlayerInfo[playerid][Respekt],PlayerInfo[playerid][PayDay],PlayerInfo[playerid][PayDayTog],PlayerInfo[playerid][Rank],PlayerInfo[playerid][Leader],PlayerInfo[playerid][Banned],PlayerInfo[playerid][BanGrund],
    PlayerInfo[playerid][BanAdmin],PlayerInfo[playerid][IP],PlayerInfo[playerid][Nummer],PlayerInfo[playerid][Safeban]);
    }
    GivePlayerMoney(playerid,PlayerInfo[playerid][Geld]);
    SetPlayerScore(playerid,PlayerInfo[playerid][Userid]);
    format(query, 128, "{006100}[Join] %s hat den Server betreten.", PlayerInfo[playerid][Name]);
    SendClientMessageToAll(cGreen, query);
    SetPVarInt(playerid,"loggedin",1);
    SetPVarInt(playerid,"played",1);
    SpawnPlayer(playerid);
    mysql_free_result(SQL);
    return 1;
    }
    else
    {
    format(query, 128, "{FFFFFF}Fehler{FF6E00} %s {FFFFFF}Das Passwort war Falsch", PlayerInfo[playerid][Name]);
    ShowPlayerDialog(playerid,diaLogin,DIALOG_STYLE_PASSWORD,"GTA "Servername"",query,"Login","");
    mysql_free_result(SQL);
    return 1;
    }
    }


    Ich hoffe mal, das einer von euch eine idee dazu hat

    All in all it's just another brick in the wall

    Einmal editiert, zuletzt von Beavis () aus folgendem Grund: ü-schrift


  • Man Chris hauptsache den String gesplittet oder wie ich hoffe dir ist bewusst das du dies zwei mal tust
    und zur info mysql_fetch_field tut es auch.Ich geh davon aus das er damit probleme hat einen string zu splitten der nicht "existiert"(ein string existiert schon nur hat er nix zum splitten).
    Da du ja so auf deine geschwindigkeit achten willst auch benutzt du wenigstens Threaded Queries und vergesse doch nicht den string zu escapen
    :D.

  • benutzt du wenigstens Threaded Queries


    genau das will ich nicht, da ich bei der sache den überblick verliere


    Und den 2. Fetch der soll ja splitten wegen den sscanf
    stock LoadPlayer(playerid,Key[])
    {
    new Data[1024],query[256];
    format(query, 256, "SELECT `Passwort` FROM `player` WHERE `Name` = '%s'", PlayerInfo[playerid][Name]);
    mysql_query(query, (-1), (0), SQL);
    mysql_store_result(SQL);
    mysql_fetch_row(PlayerInfo[playerid][Passwort], "", SQL);
    //sscanf(Data, "p<|>s[128]",PlayerInfo[playerid][Passwort]);
    mysql_free_result(SQL);
    if(!strcmp(MD5_Hash(Key), PlayerInfo[playerid][Passwort], true))
    {
    format(query, sizeof(query),"SELECT * FROM `player` WHERE `Name` = '%s'",PlayerInfo[playerid][Name]);
    mysql_query(query, (-1), (0), SQL);
    mysql_store_result(SQL);
    mysql_fetch_row(Data, "|", SQL);
    sscanf(Data, "p<|>ds[64]s[128]dddddddddddds[128]s[128]s[16]dd",
    PlayerInfo[playerid][Userid],PlayerInfo[playerid][Name],PlayerInfo[playerid][Passwort],PlayerInfo[playerid][Admin],PlayerInfo[playerid][Job],PlayerInfo[playerid][Team],PlayerInfo[playerid][Geld],PlayerInfo[playerid][Skin],
    PlayerInfo[playerid][Level],PlayerInfo[playerid][Respekt],PlayerInfo[playerid][PayDay],PlayerInfo[playerid][PayDayTog],PlayerInfo[playerid][Rank],PlayerInfo[playerid][Leader],PlayerInfo[playerid][Banned],PlayerInfo[playerid][BanGrund],
    PlayerInfo[playerid][BanAdmin],PlayerInfo[playerid][IP],PlayerInfo[playerid][Nummer],PlayerInfo[playerid][Safeban]);
    GivePlayerMoney(playerid,PlayerInfo[playerid][Geld]);
    SetPlayerScore(playerid,PlayerInfo[playerid][Userid]);
    format(query, 128, "{006100}[Join] %s hat den Server betreten.", PlayerInfo[playerid][Name]);
    SendClientMessageToAll(cGreen, query);
    SetPVarInt(playerid,"loggedin",1);
    SetPVarInt(playerid,"played",1);
    SpawnPlayer(playerid);
    mysql_free_result(SQL);
    return 1;
    }
    else
    {
    format(query, 128, "{FFFFFF}Fehler{FF6E00} %s {FFFFFF}Das Passwort war Falsch", PlayerInfo[playerid][Name]);
    ShowPlayerDialog(playerid,diaLogin,DIALOG_STYLE_PASSWORD,"GTA "Servername"",query,"Login","");
    return 1;
    }
    }
    aber auch so geht er einfach down

    All in all it's just another brick in the wall


  • Hm ich hab es jetzt mal getestet bei mir und es geht. Jedoch probier es mal wie oben schon genannt
    mysql_fetch_field ("Passwort",PlayerInfo[playerid][Passwort],SQL);


    im gesammten durchgang also 1000 mal war sogar die variante schneller. Dennoch kann ich das problem leider nicht nach vollziehen

  • Das Problem ist wieder aufgetauscht auf einen schlag
    habe das so gelöst gehabt, aber der Hängt wieder an den fetch row das ich nicht verstehe da es die letzten tage ohne ein Problem lief
    habe das mal so
    stock LoadPlayer(playerid,Key[])
    {
    new Data[1024],query[256];
    format(query, 256, "SELECT * FROM `player` WHERE `Name` = '%s' AND `Passwort` = '%s'", PlayerInfo[playerid][Name],MD5_Hash(Key));
    mysql_query(query, (-1), (0), SQL);
    mysql_store_result(SQL);
    if(mysql_num_rows(SQL)!=0)
    {
    mysql_free_result(SQL);
    format(query, sizeof(query),"SELECT * FROM `player` WHERE `Name` = '%s'",PlayerInfo[playerid][Name]);
    mysql_query(query, (-1), (0), SQL);
    mysql_store_result(SQL);
    while(mysql_fetch_row(Data, "|", SQL))
    {
    sscanf(Data, "p<|>ds[64]s[128]dddddddddddds[128]s[128]s[16]dd",
    PlayerInfo[playerid][Userid],PlayerInfo[playerid][Name],PlayerInfo[playerid][Passwort],PlayerInfo[playerid][Admin],PlayerInfo[playerid][Job],PlayerInfo[playerid][Team],PlayerInfo[playerid][Geld],PlayerInfo[playerid][Skin],
    PlayerInfo[playerid][Level],PlayerInfo[playerid][Respekt],PlayerInfo[playerid][PayDay],PlayerInfo[playerid][PayDayTog],PlayerInfo[playerid][Rank],PlayerInfo[playerid][Leader],PlayerInfo[playerid][Banned],PlayerInfo[playerid][BanGrund],
    PlayerInfo[playerid][BanAdmin],PlayerInfo[playerid][IP],PlayerInfo[playerid][Nummer],PlayerInfo[playerid][Safeban]);
    }
    GivePlayerMoney(playerid,PlayerInfo[playerid][Geld]);
    SetPlayerScore(playerid,PlayerInfo[playerid][Userid]);
    format(query, 128, "{006100}[Join] %s hat den Server betreten.", PlayerInfo[playerid][Name]);
    SendClientMessageToAll(cGreen, query);
    SetPVarInt(playerid,"loggedin",1);
    SetPVarInt(playerid,"played",1);
    SpawnPlayer(playerid);
    mysql_free_result(SQL);
    return 1;
    }
    else
    {
    mysql_free_result(SQL);
    format(query, 128, "{FFFFFF}Fehler{FF6E00} %s {FFFFFF}Das Passwort war Falsch", PlayerInfo[playerid][Name]);
    ShowPlayerDialog(playerid,diaLogin,DIALOG_STYLE_PASSWORD,"GTA "Servername"",query,"Login","");
    return 1;
    }
    }
    der Debug sagt mir das
    [06:03:54] [join] Beavis has joined the server (1:127.0.0.1)
    [06:04:01] [debug] Server crashed while executing NoName.amx// nach der PW eingabe
    [06:04:01] [debug] AMX backtrace:
    [06:04:01] [debug] #0 native mysql_fetch_row () [10007250] from mysql.dll
    [06:04:01] [debug] #1 0001a51c in ?? () from NoName.amx
    [06:04:01] [debug] #2 0001930c in public OnDialogResponse () from NoName.amx// ist der stock mit den player laden
    [06:04:01] [debug] System backtrace:
    [06:04:02] [debug] #0 78583db8 in malloc () from C:\WINXP\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.4974_x-ww_d889290f\MSVCR90.dll
    [06:04:02] [debug] #1 78583eb8 in operator new () from C:\WINXP\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.4974_x-ww_d889290f\MSVCR90.dll
    [06:04:02] [debug] #2 1000420d in Supports () from C:\Dokumente und Einstellungen\Chris\Eigene Dateien\gtacs\plugins\mysql.dll
    [06:04:02] [debug] #3 10007305 in ?? () from C:\Dokumente und Einstellungen\Chris\Eigene Dateien\gtacs\plugins\mysql.dll
    [06:04:02] [debug] #4 004010b6 in ?? () from C:\Dokumente und Einstellungen\Chris\Eigene Dateien\gtacs\samp-server.exe
    [06:04:02] [debug] #5 02b33c32 in ?? () from C:\Dokumente und Einstellungen\Chris\Eigene Dateien\gtacs\plugins\crashdetect.dll
    [06:04:02] [debug] #6 02b36076 in ?? () from C:\Dokumente und Einstellungen\Chris\Eigene Dateien\gtacs\plugins\crashdetect.dll
    [06:04:02] [debug] #7 02b2c05a in ?? () from C:\Dokumente und Einstellungen\Chris\Eigene Dateien\gtacs\plugins\crashdetect.dll
    [06:04:02] [debug] #8 02b33c5e in ?? () from C:\Dokumente und Einstellungen\Chris\Eigene Dateien\gtacs\plugins\crashdetect.dll
    [06:04:02] [debug] #9 0046e811 in ?? () from C:\Dokumente und Einstellungen\Chris\Eigene Dateien\gtacs\samp-server.exe
    [06:04:02] [debug] #10 004547f0 in ?? () from C:\Dokumente und Einstellungen\Chris\Eigene Dateien\gtacs\samp-server.exe
    [06:04:02] [debug] #11 0012fca4 in ?? ()

    All in all it's just another brick in the wall