MySQL (Installation, Zugriff, Einstellungen, Login & Register Beispiel)

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
  • so ich bins wieder ich habe eine frage und zwar


    wie kann ich eine tabelle auslesen wo häuser drinn erstellt werden sprich wo EnterX EnterY EnterZ ExitX ExitY ExitZ Owned Owner usw steht und dann die im script wiedergeben kann ? (will mir das gf haussystem auf mysql umschreiben)

  • Markus20
    Die funktionen werden in der Wiki beschrieben, eigentlich sollte das reichen^^


    Cal44
    stock LoadBuildings()
    {
    new h=0,result[50];
    mysql_query("SELECT * FROM `tabelle_mit_den_haeusern`");//wir holen uns alles aus der tabelle "tabelle_mit_den_haeusern"
    mysql_store_result();//speichern dann das ergebniss
    while(mysql_fetch_row(str))//wir gehen in einer while schleife eine reihe nach der anderen durch
    {
    mysql_get_field("Enter_x",result);//Wir holen uns den wert aus dem feld "Enter_x" und speichern es in result
    HouseInfo[h][hEntrancex] = floatstr(result);//nun übergeben wir result an die variable in der es gespeichert werden soll. Da mysql_get_field aber immer in strings speichert müssen wir aus dem string einen float wert machen mit floatstr.

    mysql_get_field("Owner",HouseInfo[h][hOwner]);//Wir holen uns den wert aus dem feld "Owner" und speichern es direkt in der variable, da es ja ein string ist.

    mysql_get_field("Value",result);//Wir holen uns den wert aus dem feld "Value" und speichern es in result
    HouseInfo[h][hValue] = strval(result);//nun übergeben wir result an die variable in der es gespeichert werden soll. Da wir dieses mal einen integer brauchen, benutzen wir strval um den string in einen integer zu convertieren.
    h++;//Jetzt noch die variable h einen dazu zählen damit wir im nächsten schleifen durchgang die variablen des nächsten hauses benutzen.
    }
    printf("Es wurden %d Häuser geladen."h);
    return 1;
    }
    Das sind 3 besiepiele jeweils für float, string und integer. Musst die restlichen felder allerdings selbst machen.

    The fact is, I am right. And if you think I'm wrong, you are wrong.

  • if(CheckPasswort(playerid, inputtext) == 1)
    {
    SendClientMessage(playerid, COLOR_WHITE, "* Das Passwort ist richtig :D");
    }


    stock CheckPasswort(playerid,passwort[])
    {
    new query[128],sendername[MAX_PLAYER_NAME];
    GetPlayerName(playerid,sendername,sizeof(sendername));
    format(query,sizeof(query),"SELECT `Passwort` FROM `accounts` WHERE `Name` = '%s' AND `Passwort` = '%s'",sendername,passwort);
    mysql_query(query);
    mysql_store_result();
    if(mysql_num_rows()) { mysql_free_result(); return true; }
    else { mysql_free_result(); return false; }
    }


    So hab ich es, ich benutze zwar StickenKid's aber ich denke mal das sollte trozdem funktionieren ;D


    /Edit Fehler ausgebessert!


    Einmal editiert, zuletzt von [GSF]Zunno ()

  • maddin natürlich kann man bei wiki nachschauen
    war auch nur ein vorschlag, damit dein tut perfekt ist ;)


    allso die funktion überprüft den string, und sichert ihn
    new Test1[5]; new Test2[5];
    mysql_real_escape_string(Test1,Test2);
    dan ist test1 was rein geht und test2 das was in mysql geht


    hab ich das so richtig verstanden ??

  • @ Zunno, das war eigentlich nicht meine Frage, klar kann ich mit der Abfrage so das Passwort abfragen, jedoch nicht im md5 gehasten Format abgleichen.


    Deshalb möchte ich halt, das Maddin mir vielleicht zur Seite steht, und mir hilft oder sonstiges, weil ich denke das Tutorial wäre mit md5 schon was besserer, weil es einfach
    sicherer & sonstiges ist. Sha1 besser blabla, weiß ich jedoch ist md5 ausreichend. So nun zurück zu meiner Frage, kannst du mir nun helfen wie ich die Passwörter über MD5 abgleichen kann?


  • Jap. Am besten schaust du dir das mal an dann weisst du genau weshalb das wichtig ist. Sicher ist sicher ;)


    xivo
    Also für sha1 und whirpool gibts ja ein plugin, für MD5 gibts eine include von y_less. http://pastebin.com/0yKdjV8E


    Dann benutzt du halt z.b
    if(!strcmp(MD5_Hash(inputtext), ReturnPasswort(SpielerName), true))
    um das eingegebene passwort als md5 mit dem aus der datenbank zu vergleichen. Das setzt aber vorraus das du das Passwort auch als md5 in der datenbank gespeichert hast.
    Das kannst du machen, indem du die CreateAccount funktion so umschreibst:
    stock CreateAccount(playerid, pass[])
    {
    new query[256],Name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, Name, MAX_PLAYER_NAME);
    mysql_real_escape_string(Name,Name);
    mysql_real_escape_string(pass,pass);
    format(query, sizeof(query), "INSERT INTO accounts (Name, Passwort) VALUES ('%s', MD5('%s'))", Name, pass);
    mysql_query(query);
    return true;
    }
    Da mysql eingebaute hash funktionen hat geht das recht einfach.
    Das ganze geht so übrigens auch mit SHA1,SHA2-224, SHA2-256, SHA2-384 und SHA2-512. Falls es jemanden interessiert, einfach die format zeile ersetzen:
    format(query, sizeof(query), "INSERT INTO accounts (Name, Passwort) VALUES ('%s', SHA1('%s'))", Name, pass);//SHA1
    format(query, sizeof(query), "INSERT INTO accounts (Name, Passwort) VALUES ('%s', SHA2('%s', 224))", Name, pass);//SHA2-224
    format(query, sizeof(query), "INSERT INTO accounts (Name, Passwort) VALUES ('%s', SHA2('%s', 256))", Name, pass);//SHA2-256
    format(query, sizeof(query), "INSERT INTO accounts (Name, Passwort) VALUES ('%s', SHA2('%s', 384))", Name, pass);//SHA2-384
    format(query, sizeof(query), "INSERT INTO accounts (Name, Passwort) VALUES ('%s', SHA2('%s', 512))", Name, pass);//SHA2-512
    Aber wie gesagt, ausser Whirpool, MD5 und SHA512 gibt es keine andere methode die in pawn unterstützt wird. Jedenfalls kenne ich keine, lasse mich aber gerne eines bessere belehren.

    The fact is, I am right. And if you think I'm wrong, you are wrong.

  • @ Zunno, das war eigentlich nicht meine Frage, klar kann ich mit der Abfrage so das Passwort abfragen, jedoch nicht im md5 gehasten Format abgleichen.


    Deshalb möchte ich halt, das Maddin mir vielleicht zur Seite steht, und mir hilft oder sonstiges, weil ich denke das Tutorial wäre mit md5 schon was besserer, weil es einfach
    sicherer & sonstiges ist. Sha1 besser blabla, weiß ich jedoch ist md5 ausreichend. So nun zurück zu meiner Frage, kannst du mir nun helfen wie ich die Passwörter über MD5 abgleichen kann?


    Aber sicher geht das ;)


    stock CheckPasswort(playerid,passwort[])
    {
    new query[128],sendername[MAX_PLAYER_NAME];
    GetPlayerName(playerid,sendername,sizeof(sendername));
    format(query,sizeof(query),"SELECT `Passwort` FROM `accounts` WHERE `Name` = '%s' AND `Passwort` = MD5('%s')",sendername,passwort);
    mysql_query(query);
    mysql_store_result();
    if(mysql_num_rows()) { mysql_free_result(); return true; }
    else { mysql_free_result(); return false; }
    }

  • Hey
    Ich habe das GF Haussystem umgeschrieben, jeodhc wird es nicht geladen ich weiß jetzt nicht ob es an der mysql Funktion liegt oder an der If-Abfrage
    Jedoch ist hier der Code

    public LoadProperty()
    {
    for(new i; i <sizeof(HouseInfo); i++)
    {
    HouseInfo[i][hIs] = 0;
    HouseInfo[i][hEntrancex] = 0.0;
    HouseInfo[i][hEntrancey] = 0.0;
    HouseInfo[i][hEntrancez] = 0.0;
    HouseInfo[i][hExitx] = 0.0;
    HouseInfo[i][hExity] = 0.0;
    HouseInfo[i][hExitz] = 0.0;
    HouseInfo[i][hHealthx] = 0;
    HouseInfo[i][hHealthy] = 0;
    HouseInfo[i][hHealthz] = 0;
    HouseInfo[i][hArmourx] = 0;
    HouseInfo[i][hArmoury] = 0;
    HouseInfo[i][hArmourz] = 0;
    new string[128];
    format(string,sizeof(string),"");
    HouseInfo[i][hOwner] = string;
    HouseInfo[i][hDiscription] = string;
    HouseInfo[i][hValue] = 0;
    HouseInfo[i][hHel] = 0;
    HouseInfo[i][hArm] = 0;
    HouseInfo[i][hInt] = 0;
    HouseInfo[i][hLock] = 0;
    HouseInfo[i][hOwner] = 0;
    HouseInfo[i][hRooms] = 0;
    HouseInfo[i][hRent] = 0;
    HouseInfo[i][hRentabil] = 0;
    HouseInfo[i][hTakings] = 0;
    HouseInfo[i][hVec] = 0;
    HouseInfo[i][hVcol1] = 0;
    HouseInfo[i][hVcol2] = 0;
    HouseInfo[i][hDate] = 0;
    HouseInfo[i][hLevel] = 0;
    new str[4];
    format(str,sizeof(str),"%d",i);
    HouseInfo[i][hIs] = mysql_GetInt("property","Is","ID",str);
    printf("test %s",str);
    if(HouseInfo[i][hIs] == 1)
    {
    printf("test123 %s",str);
    HouseInfo[i][hEntrancex] = mysql_GetFloat("property","Entrancex","ID",str);
    HouseInfo[i][hEntrancey] = mysql_GetFloat("property","Entrancey","ID",str);
    HouseInfo[i][hEntrancez] = mysql_GetFloat("property","Entrancez","ID",str);
    HouseInfo[i][hExitx] = mysql_GetFloat("property","Exitx","ID",str);
    HouseInfo[i][hExity] = mysql_GetFloat("property","Exity","ID",str);
    HouseInfo[i][hExitz] = mysql_GetFloat("property","Exitz","ID",str);
    HouseInfo[i][hHealthx] = mysql_GetInt("property","Healthx","ID",str);
    HouseInfo[i][hHealthy] = mysql_GetInt("property","Healthy","ID",str);
    HouseInfo[i][hHealthz] = mysql_GetInt("property","Healthz","ID",str);
    HouseInfo[i][hArmourx] = mysql_GetInt("property","Armourx","ID",str);
    HouseInfo[i][hArmoury] = mysql_GetInt("property","Armoury","ID",str);
    HouseInfo[i][hArmourz] = mysql_GetInt("property","Armourz","ID",str);
    HouseInfo[i][hOwner] = mysql_GetString("property","Owner","ID",str);
    HouseInfo[i][hDiscription] = mysql_GetString("property","Discription","ID",str);
    HouseInfo[i][hValue] = mysql_GetInt("property","Value","ID",str);
    HouseInfo[i][hHel] = mysql_GetInt("property","Hel","ID",str);
    HouseInfo[i][hArm] = mysql_GetInt("property","Arm","ID",str);
    HouseInfo[i][hInt] = mysql_GetInt("property","Int","ID",str);
    HouseInfo[i][hLock] = mysql_GetInt("property","Lock","ID",str);
    HouseInfo[i][hOwner] = mysql_GetInt("property","Owned","ID",str);
    HouseInfo[i][hRooms] = mysql_GetInt("property","Rooms","ID",str);
    HouseInfo[i][hRent] = mysql_GetInt("property","Rent","ID",str);
    HouseInfo[i][hRentabil] = mysql_GetInt("property","Rentabil","ID",str);
    HouseInfo[i][hTakings] = mysql_GetInt("property","Takings","ID",str);
    HouseInfo[i][hVec] = mysql_GetInt("property","Vec","ID",str);
    HouseInfo[i][hVcol1] = mysql_GetInt("property","Vcol1","ID",str);
    HouseInfo[i][hVcol2] = mysql_GetInt("property","Vcol2","ID",str);
    HouseInfo[i][hDate] = mysql_GetInt("property","Date","ID",str);
    HouseInfo[i][hLevel] = mysql_GetInt("property","Level","ID",str);
    if(HouseInfo[i][hVec] == 457)
    {
    HouseInfo[i][hVec] = 411;
    }
    printf("HouseInfo:%d Owner:%s hTakings %d hVec %d",i,HouseInfo[i][hOwner],HouseInfo[i][hTakings],HouseInfo[i][hVec]);
    }
    printf("%s",str);
    }
    return 1;
    }


    test %s wird noch gezeit
    test123 %s wird nicht gezeit
    und %s wird später wieder gezeigt ich vermute, das der wert nicht richtig aus der Tabelle ausgelesen wird, da
    In Feld Is in Zeile 0 1 steht.
    Jedoch würde dann die If-Abfrage funktionieren


    mfg

  • @ Dankeschön an dich maddin! Stimmt wohl :)


    Jedoch habe ich jetzt das Problem, das das MD5 Gehaste Passwort nochmal Gehast werden kann, weil ich es sonst nicht mit dem Wbb Forum verbinde, Wbb verlangt von mir das ich mein Passwort das ich Hashe nochmal Hashe, also wie soll ich das Passwort jetzt am besten 2x Hashen ? bei der Abfrage, sowie bei der erstellung des Accounts ?

  • Vllt so:
    format(query, sizeof(query), "INSERT INTO accounts (Name, Passwort) VALUES ('%s', MD5(MD5('%s')))", Name, pass);
    if(!strcmp(MD5_Hash(MD5_Hash(inputtext)), ReturnPasswort(SpielerName), true))
    Aber bin mir grad nicht sicher obs funktioniert ^^

    The fact is, I am right. And if you think I'm wrong, you are wrong.

  • Vielleicht ein eigenes stock schreiben ? ;b


    Und müsste das nicht beim saven sowie beim Speichern eigentlich so aussehen ?


    GivePlayerMoney(playerid, SpielerInfo[playerid][pName]) = mysql_GetInt("wcf1_user", "geld", "Name", SpielerInfo[playerid][pName]);

    Einmal editiert, zuletzt von xivo ()

  • Hi,


    Dass tut is echt nice....


    Ich habe nun Adminlevel und Skin hinzugefügt..


    Hier Screen. so Richtig?




    und hier ist mein /setadmin cmd..


    //----------------------------------[SETADMIN]------------------------------------------------
    if(strcmp(cmd, "/setadmin", true) == 0)
    {
    if(SpielerInfo[playerid][pAdminlevel] >= 5)
    {
    if(SpielerInfo[playerid][pAdminlevel] < 5)
    {
    SendClientMessage(playerid,COLOR_GRAD2,"Das Vergeben und Entziehen von Adminrechten ist nur für die Server Besitzer möglich!");
    return 1;
    }
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "Benutze: /setadmin [ID] [Level]");
    return 1;
    }
    new para1 = ReturnUser(tmp);
    tmp = strtok(cmdtext, idx);
    new level = strval(tmp);
    if(IsPlayerConnected(para1))
    {
    if(para1 != INVALID_PLAYER_ID)
    {
    GetPlayerName(para1, giveplayer, sizeof(giveplayer));
    GetPlayerName(playerid, sendername, sizeof(sendername));
    if(SpielerInfo[para1][pAdminlevel] < level)
    {
    printf("AdmCmd: %s hat %s zu einem Level %d Admin befördert.", sendername, giveplayer, level);
    format(string, sizeof(string), "Du wurdest durch %s zu einem Level %d Admin befördert", sendername, level);
    SendClientMessage(para1, COLOR_LIGHTBLUE, string);
    format(string, sizeof(string), "Du hast %s zu einem Level %d Admin befördert.", giveplayer,level);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    }
    else
    {
    printf("AdmCmd: %s hat %s zu einem Level %d Admin degradiert.", sendername, giveplayer, level);
    format(string, sizeof(string), "Du wurdest durch %s zu einem Level %d Admin degradiert", sendername, level);
    SendClientMessage(para1, COLOR_LIGHTBLUE, string);
    format(string, sizeof(string), "Du hast %s zu einem Level %d Admin degradiert.", giveplayer,level);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    }
    SpielerInfo[para1][pAdminlevel] = level;
    }
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_GRAD1, "Du bist nicht befugt diesen Befehl zu nutzen! ");
    }
    return 1;


    Hier die Errors


    C:\Users\Marcel\Desktop\gta_server\gamemodes\Test.pwn(114) : error 017: undefined symbol "cmd"
    C:\Users\Marcel\Desktop\gta_server\gamemodes\Test.pwn(120) : error 017: undefined symbol "COLOR_GRAD2"
    C:\Users\Marcel\Desktop\gta_server\gamemodes\Test.pwn(123) : error 017: undefined symbol "tmp"
    C:\Users\Marcel\Desktop\gta_server\gamemodes\Test.pwn(123) : error 017: undefined symbol "strtok"
    C:\Users\Marcel\Desktop\gta_server\gamemodes\Test.pwn(124) : error 017: undefined symbol "tmp"
    C:\Users\Marcel\Desktop\gta_server\gamemodes\Test.pwn(126) : error 017: undefined symbol "COLOR_GRAD2"
    C:\Users\Marcel\Desktop\gta_server\gamemodes\Test.pwn(129) : error 017: undefined symbol "ReturnUser"
    C:\Users\Marcel\Desktop\gta_server\gamemodes\Test.pwn(130) : error 017: undefined symbol "tmp"
    C:\Users\Marcel\Desktop\gta_server\gamemodes\Test.pwn(130) : error 017: undefined symbol "strtok"
    C:\Users\Marcel\Desktop\gta_server\gamemodes\Test.pwn(131) : error 017: undefined symbol "tmp"
    C:\Users\Marcel\Desktop\gta_server\gamemodes\Test.pwn(136) : error 017: undefined symbol "giveplayer"
    C:\Users\Marcel\Desktop\gta_server\gamemodes\Test.pwn(136) : error 017: undefined symbol "giveplayer"
    C:\Users\Marcel\Desktop\gta_server\gamemodes\Test.pwn(136) : error 029: invalid expression, assumed zero
    C:\Users\Marcel\Desktop\gta_server\gamemodes\Test.pwn(136) : fatal error 107: too many error messages on one line


    Compilation aborted.Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    14 Errors.


    Und wie müsste ich dann den /setskin cmd machen?



    lg Marci

  • Bekomme einen Error, bei OnPlayerDisconnect


    Zitat

    E:\Server\gamemodes\Mysql.pwn(91) : error 001: expected token: ";", but found "-identifier-"
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    1 Error.

    Hier die Zeile:


    DeletePVar(playerid,"Eingeloggt");


    Bitte um schnelle Hilfe..



    Mfg



    edit: Problem gelöst :D

  • Black setz mal den PVar ganz oben bei OnPlayerDisconnect hin


    @Marci dir fehlen paar news ;) nur den CMD nem GF rauskopieren reicht net :P

    Zitat

    naja aufm homeserver mit kumpel getestet und nix laggt von daher sollte nen richtiger server mit sowas keine probs haben

    *an Kopf schlag
    sowas kommt Raus wenn man erst absendet ohne nachzudenken. Bitte Leute Hirn einschalten beim Posten...

  • hatte das Problem schon gelöst, bei den "SaveAccounts" oder wie das genannt war, hatte ich ";" vergessen..

  • Also nochmal ;b Die Registrierung auf dem Server mit dem doppelten MD5 Hash klappt schonmal, jedoch nicht die Abfrage des Passwortes.


    Sieht bei mir momentan so aus : if(!strcmp(MD5_Hash(MD5_Hash(inputtext)), ReturnPasswort(SpielerName), true))

  • Hallo,


    erstmal wollte ich sagen dass das echt ein gutes Tut ist :thumbup:
    Aber ich habe noch eine Frage, ist das Speichern und laden mit Pvars auch bei MYSQL möglich?
    Und wenn ja wie muss ich das dann abspeichern?
    Habe momentan mit dini z.B. so einen Bfehel:


    dini_IntSet(Spielerdatei, "Adminlevel",GetPVarInt(playerid,"Adminlevel"));


    Wie bekomme ich den nun zu MYSQL? Oder muss ich alles zu enums umscripten??


    Danke für die Hilfe.


    MfG


    Gabsch

  • Ne du kannst genauso mit PVars wie mit Enums arbeiten. Bei PVars sieht das dann so aus:

    //Laden:
    SetPVarInt(playerid,"Adminlevel",mysql_GetInt("accounts", "Adminlevel", "Name", SpielerInfo[playerid][pName]));
    //Speichern:
    mysql_SetInt("accounts", "Adminlevel", GetPVarInt(playerid,"Adminlevel"), "Name", SpielerInfo[playerid][pName]);

    The fact is, I am right. And if you think I'm wrong, you are wrong.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen