MySQL Problem (Textdraws)

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
  • Dann hast du bei OnPlayerConnect einen Code stehen, der "OnPlayerDataLoaded" aufruft. Das musst du dann weg machen.


    Hab es jetzt so stehen:

    new query[128], pname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, pname, MAX_PLAYER_NAME);
    mysql_format(dbhandle, query, sizeof(query), "SELECT * FROM `user` WHERE `username` = '%e' LIMIT 1", pname);
    mysql_tquery(dbhandle, query, "", "d", playerid);


    ist das richtig? Sry , kenne mich nicht so gut mit MySQL aus.. :/

    Mit freundlichen Grüßen
    [KoSoVa] :klugs:

    Einmal editiert, zuletzt von [GeD]Max ()

  • In dem Wirr-Warr habe ich deine Callbacks durcheinander gebracht, sorry.
    So muss es sein:
    else if(clickedid == Textdraw3)
    {
    if(GetPVarInt(playerid,"eingeloggt") == 0)
    {
    new name[MAX_PLAYER_NAME],query[128];
    GetPlayerName(playerid,name,sizeof(name));
    format(query,sizeof(query),"SELECT * FROM user WHERE username='%s'",name);
    mysql_function_query(dbhandle,query,true,"OnPlayerDataLoaded","i",playerid); //Habe nur hier das Callback zu "OnPlayerDataLoaded" geändert!
    }
    }


    //___________________________________
    public OnPlayerDataLoaded(playerid)
    {
    if(cache_num_rows() == 0)
    {
    SendClientMessage(playerid, Rot,"[FEHLER] {FFFFFF}Dieser Account ist nicht Regestriert! Um hier spielen zu können, musst du dich Regestrieren!");
    return 1;
    }
    else //Falls doch
    {
    ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD,"Login Vorgang","Herzlichen Willkommen zurück auf Incredible German Reallife!\nBitte gib nun dein Password ein!","Login","Abbrechen");
    return 1;
    }
    }


    Wegen dem Passwort:
    Poste bitte den Code, den du bei "if(dialogid == DIALOG_LOGIN)" hast.

    3HZXdYd.png

    2 Mal editiert, zuletzt von Jeffry ()


  • Kein Problem :)
    So. also ,


    1) Ich bekomme in der Zeile


    public OnPlayerDataLoaded(playerid)
    {
    if(cache_num_rows() == 0)
    {
    SendClientMessage(playerid, Rot,"[FEHLER] {FFFFFF}Dieser Account ist nicht Regestriert! Um hier spielen zu können, musst du dich Regestrieren!");
    return 1;
    }
    else //Falls doch
    {
    ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD,"Login Vorgang","Herzlichen Willkommen zurück auf Incredible German Reallife!\nBitte gib nun dein Password ein!","Login","Abbrechen");
    return 1;
    }
    //printf("There are %d players with the same name.", NumRows);
    return 1;//warning 225: unreachable code
    }


    Und hier der Dialog_Login:

    if(dialogid==DIALOG_LOGIN)
    {
    if(response)
    {
    new name[MAX_PLAYER_NAME],query[128],passwort[35];
    GetPlayerName(playerid,name,sizeof(name));
    if(strlen(inputtext)>0)
    {
    mysql_escape_string(inputtext,passwort,dbhandle);//Fragt ab ob das Passwort richtig ist
    format(query,sizeof(query),"SELECT * FROM user WHERE username='%s' AND passwort=MD5('%s')",name,passwort);
    mysql_function_query(dbhandle,query,true,"OnPasswordResponse","i",playerid);
    SpawnPlayer(playerid);

    }
    else
    {
    //keine Eingabe
    ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_INPUT,"Login","Das Angegebene Passwort war Falsch.\nBitte log dich jetzt mit dem richtigen Passwort ein:","Login","Abbrechen");
    }
    }
    else
    {
    return 1;
    }
    return 1;
    }

    Mit freundlichen Grüßen
    [KoSoVa] :klugs:

  • 1.)
    //printf("There are %d players with the same name.", NumRows);
    return 1;

    Schreib ein "//" vor das return, der print ist unnötig.
    EDIT: Oder lösche einfach beides, dann hast es auch los.


    2.)
    Mach das
    SpawnPlayer(playerid);
    da weg.
    Das gehört in "OnPasswordResponse", wenn das Passwort richtig ist.

  • okay. es wird immer besser! Aber jedoch einiege Bugs noch :X


    Bugs:
    1) Obwohl ein Account in der Datenbank herrscht , kann ich mich nochmal mit den Regestrieten Account Regestrieren(Eigentlich soll da die Fehlermeldung kommen dass der Spieler schon ein Account hat! )


    2) Das Passwort wird nicht richtig von der Datenbank abgelesen, obwohl ich ich dass richtige eingegeben habe(ist mit MD5 vlt. hilft es ja)


    3) In der Datenbank werden immer wieder neue IDS erstellt , also z.b. ich lösche Datenbank ID 15 , und es geht dann trozdem weiter .. also mit ID 16,17... aber es sollte ein freien Platz suchen.. :/

    Mit freundlichen Grüßen
    [KoSoVa] :klugs:

  • 1.) Poste den Teil mit "if(dialogid == DIALOG_REGISTER)" und das callback das das mysql_tquery aufruft.


    2.) Beim Login? Was heißt nicht richtig? Kannst du dich anmelden, wenn ja/nein, wann ja wann nein?


    3.) Das liegt daran, dass deine ID auf AUTO_INCREMENT gestellt ist. Das zählt einfach immer weiter hoch. Das ist auch gut so, da so eine individuelle ID garantiert ist. Accounts muss man eigentlich nicht löschen. Es gibt zwar Möglichkeiten, den leeren Raum zu finden, bzw es erst gar nicht zu löschen, sondern zum Überschreiben vorzumerken, aber das würde ich dir nicht raten. Eine neue ID für ein neues Account ist gut so, ich wüsste nicht warum es die Lücken füllen sollte, das gibt es in keinem mir bekannten Account-System (sowieso muss man eigentlich keine Accounts löschen).

  • 3) okay...


    2)Also anmelden kann ich mich garnicht... also es kommt dieser Dialog das dass Passwort falsch ist.


    1)

    if(dialogid==DIALOG_REGISTER)
    {
    if(response)
    {
    new name[MAX_PLAYER_NAME],query[128],passwort[35];
    GetPlayerName(playerid,name,sizeof(name));
    if(strlen(inputtext)>=3)
    {
    //Registerfunktion
    mysql_escape_string(inputtext,passwort,dbhandle);
    format(query,sizeof(query),"INSERT INTO user (username,passwort) VALUES ('%s',MD5('%s')) ",name,passwort);
    mysql_function_query(dbhandle,query,false,"OnPlayerRegister","i",playerid);
    SpawnPlayer(playerid);
    }
    else
    {
    //Kleiner als 4 Zeichen
    ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD,"Registrierung","Das angegebende Passwort war zu kurz! Bitte versuchs nochmal:","Register","Abbrechen");
    }


    }
    else
    {
    return 1;
    }
    return 1;
    }
    //ich finde kein Callback mit " mysql_tquery "


    Mit freundlichen Grüßen
    [KoSoVa] :klugs:

  • 1.) Ach ja, anderes Plugin. Hast aber das richtige gepostet.


    Du musst es nach diesem Prinzip machen:
    else if(clickedid == Textdraw2) //Textdraw2 = Register Textdraw?? Wenn nicht, ändern.
    {
    if(GetPVarInt(playerid,"eingeloggt") == 0)
    {
    new name[MAX_PLAYER_NAME],query[128];
    GetPlayerName(playerid,name,sizeof(name));
    format(query,sizeof(query),"SELECT * FROM user WHERE username='%s'",name);
    mysql_function_query(dbhandle,query,true,"OnPlayerDataLoaded2","i",playerid);
    }
    }


    //___________________________________
    public OnPlayerDataLoaded2(playerid)
    {
    if(cache_num_rows() != 0)
    {
    SendClientMessage(playerid, Rot,"[FEHLER] {FFFFFF}Dieser Account ist Regestriert! Um hier spielen zu können, musst du dich Einloggen!");
    return 1;
    }
    else
    {
    //Hier der Register Dialog.
    return 1;
    }
    }


    2.) Lass dir da mal mit
    print(query);
    das query mit dem MD5 ausgeben, und vergleiche das was da drin steht, mit dem was in der Datenbank steht. Wie sieht das aus?


  • So das Register/Login system geht jetzt endlich! Nur irgendwie ließt er nicht mehr das Adminlevel.. oder Fraktion?

    Mit freundlichen Grüßen
    [KoSoVa] :klugs:

  • Super! :thumbup:


    Wo soll er das denn auslesen? Kannst du bitte den Code posten?


    Ups, habe es vergessen unter OnPasswordResponse hinzuzufügen :X ...


    aber ich habe jetzt wieder ein Problem mit der Skinanzeige ... :P , und zwar da es nicht mehr den richtigen Anzeigt, wieder die ID 0


    Hier der Code:

    //Hier ist der Textdraw
    Textdraw7[playerid] = CreatePlayerTextDraw(playerid, 526.000000, 292.444458, "LD_SPAC:white");
    PlayerTextDrawLetterSize(playerid, Textdraw7[playerid], 0.000000, 0.000000);
    PlayerTextDrawTextSize(playerid, Textdraw7[playerid], 104.500000, 131.911102);
    PlayerTextDrawAlignment(playerid, Textdraw7[playerid], 1);
    PlayerTextDrawColor(playerid, Textdraw7[playerid], -1);
    PlayerTextDrawSetShadow(playerid, Textdraw7[playerid], 0);
    PlayerTextDrawSetOutline(playerid, Textdraw7[playerid], 0);
    PlayerTextDrawBackgroundColor(playerid, Textdraw7[playerid], 255);
    PlayerTextDrawFont(playerid, Textdraw7[playerid], TEXT_DRAW_FONT_MODEL_PREVIEW);
    PlayerTextDrawSetPreviewModel(playerid,Textdraw7[playerid], SpielerInfo[playerid][Skin]);


    //hier ist dass was unter OnPlayerConnect steht:
    SpielerInfo[playerid][Skin] = cache_get_field_content_int(0,"Skin",dbhandle);


    //selbst wenn ich es ausprinte , dann kommt immer die ID 0 Obwohl eigentlich Skin ID 20 ... kommen sollte...

    Mit freundlichen Grüßen
    [KoSoVa] :klugs:

  • Weil du hier keinen aktiven cache hast, entsprechend bleibt das 0.
    SpielerInfo[playerid][Skin] = cache_get_field_content_int(0,"Skin",dbhandle);


    Du musst auch das wie beim Login und den anderen machen.


    query[128];
    format(query,sizeof(query),"SELECT skin FROM user WHERE username='%s'",name); //Anpassen
    mysql_function_query(dbhandle,query,true,"OnPlayerSkinTextdraw","i",playerid);
    Und dann eben bei einem neu erstellten public OnPlayerSkinTextdraw das Skin-Textdraw setzen. Gleich wie beim Registrieren oder beim Login.


  • wie meinste dass genau jetzt mit "setzten"? Etwar die ganzen Textdraw-Daten einfach in den public OnPlayerSkinTextdraw(playerid); reinsetzten? Und dann hinterher und OnPlayerConnect einfach OnPlayerSkinTextdraw(playerid)

    Mit freundlichen Grüßen
    [KoSoVa] :klugs:

  • OnPlayerConnect:
    query[128];
    format(query,sizeof(query),"SELECT Skin FROM user WHERE username='%s'",name); //Anpassen
    mysql_function_query(dbhandle,query,true,"OnPlayerSkinTextdraw","i",playerid);



    forward OnPlayerSkinTextdraw(playerid);
    public OnPlayerSkinTextdraw(playerid)
    {
    if(cache_num_rows() != 0) SpielerInfo[playerid][Skin] = cache_get_field_content_int(0,"Skin",dbhandle);
    else SpielerInfo[playerid][Skin] = 0;
    return 1;
    }

  • bleibt immer noch bei den CJ Skin:


    Also habe es jetzt so gemacht:



    //OnPlayerConnect
    new query[128],name[MAX_PLAYER_NAME];
    format(query,sizeof(query),"SELECT Skin FROM user WHERE username='%s'",name); //Anpassen
    mysql_function_query(dbhandle,query,true,"OnPlayerSkinTextdraw","i",playerid);


    //etwas weiter unten:
    forward OnPlayerSkinTextdraw(playerid);
    public OnPlayerSkinTextdraw(playerid)
    {
    if(cache_num_rows() != 0) SpielerInfo[playerid][Skin] = cache_get_field_content_int(0,"Skin",dbhandle);
    else SpielerInfo[playerid][Skin] = 0;
    return 1;
    }


    Eigentlich sollte da die SKIN ID 20 angezeigt werden..

    Mit freundlichen Grüßen
    [KoSoVa] :klugs:

  • Erstellst du das Textdraw auch bei OnPlayerConnect? Wenn ja, dann musst du in das public noch das TextDrawSetPreviewModel rein machen, und dem Spieler das Textdraw dann anzeigen.


    Ja es wird in OnPlayConnect angezeigt, jedoch geht es leider immer noch nicht..



    public OnPlayerSkinTextdraw(playerid)
    {
    if(cache_num_rows() != 0) SpielerInfo[playerid][Skin] = cache_get_field_content_int(0,"Skin",dbhandle);
    else SpielerInfo[playerid][Skin] = 0;
    PlayerTextDrawSetPreviewModel(playerid,Textdraw7[playerid], SpielerInfo[playerid][Skin]);
    return 1;
    }

    Mit freundlichen Grüßen
    [KoSoVa] :klugs: