MySQL Datenbank erstellen,schreiben,lesen

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
  • Aloha,
    Ich versuche,wenn auch nur mit geringem Erfolg mein Script auf MySQL umzuschreiben, ich habe nen Tutorial hier gefunden,allerdings wird es dort nicht wirklich umfassend erklärt sodass ich mir nun mal eure Hilfe hinzuhohle...
    Ich habe eine MySQL Datenbank angelegt,diese ist Leer,per Script Connecte ich auf diese Datenbank,das funktioniert auch.
    Nur weiß ich jetzt nicht weiter,ich möchte meine User darin Speichern aber ich hab absolut keine Ahnung wie ich das Anstellen soll.
    Soweit ich mir das zusammenreimen kann sollte ich iwie Tabellen erstellen(oder erstellen lassen kA) um darin dann z.B den Namen zu speichern.
    Da weiß ich schon nichtmehr weiter,ich nutze phpMyAdmin 2.11.2.1 mit der Server version 5.1 (kA ob das was nützt)
    Was soll ich jetzt tun? Also Ne Tabelle erstellen? Was hat das mit den Zeilen darin auf sich?
    Bin für jede Hilfe Dankbar :D

  • Wow, ich hab noch nie gesehen das du hilfe brauchst :D


    B2T:


    Als erstes musst du dort eine Tabelle erstellen (z.B. user). In dieser Tabelle machst du dann z.B. die Felder ID (auto increment und integer), Playername (als text) und Money (als integer). Ich hoffe du weisst wie man die erstellt ;) (den syntax für den msssql server wüsste ich auswendig, ich weiss aber net wie der von mysql genau geht und ob der gleich ist).


    Welches Plugin verwendest du?


    MFG

  • er weiß ja net, wie er eine erstellt
    also du gehst ins phpmyadmin und wählst deine db aus. dann sollte das aussehen wie auf dem bild hier

    dann gibst halt nen namen ein, wie die tabelle heißen soll, und die anzahl der felder (rot makiert)
    anzahl der felder sind halt die spalten, also z.b 1 für benutzernamen, einen für geld usw
    sieht am ende dann z.b so aus


    //edit: zu den zeilen: jeder user hat dann eine zeile

    Einmal editiert, zuletzt von noir ()

  • Ah so ok. Bin nur drüber gefolgen sry :D


    Kürzer geht es auch so:


    einfach auf das Feld SQL klicken und das eingeben:


    CREATE TABLE `user` (`ID` INT NOT NULL AUTO_INCREMENT ,`Playername` TEXT ,`Money` INT ,PRIMARY KEY ( `ID` ) )


    Bedeuted soviel wie "Erstelle Tabelle user (Feld ID als INTeger (zahl) darf nicht null sein und ist ein Auto inkrement (zählt selber rauf),Feld Playername als textfeld,Feld Money als INTeger (zahl),füge den Primärschlüssel (ID) hinzu"


    Danach hat sich eine Tabelle user erstellt. Weiter felder kann man da hinzufügen, in dem man links auf die Tabelle geht und in der rechten Bildschirmhälfte unten bei "1 Felder hinzufügen" auf OK klickt (da kann man auch mehrere Felder eingeben, also statt 1 auch 2 oder 3). Auswählen kann man auch noch wo genau man dieses Feld hinzufügen möchte, also an den anfang, ans ende oder sonst wohin. Nach einem Klick auf OK kann man einen Feldnamen geben (bei Feld). Zum Beispiel: Banned. Da dieses Feld logischerweise einen Zahlenwert braucht (1 und 0) kann man ihm den Typ "INT" geben. Hierfür eifach bei Typ klicken und INT auswählen. Bei den anderen Feldern muss man eigentlich nichts einstellen (bei Null "not null" vielleicht rausnehmen, falls der wert nicht unbedingt vorhanden sein muss) und auf Speichern klicken.


    So hast du deine erste Tabelle erstellt ;) Am besten lernst du ein bisschen SQL, denn das ist vorteilhaft beim scripten mit mysql. ;)


    MFG


    edit: noir: schöne zeichnungen :thumbup:

  • Hi ich will auch MySql für mein Script verwenden ich habe die Tabelle "user".
    Der code dafür:

    Code
    CREATE TABLE `user` (
      `User` text NOT NULL,
      `Passwort` text NOT NULL,
      `Admin` int(1) NOT NULL DEFAULT '0',
      PRIMARY KEY (`User`(24),`Passwort`(128),`Admin`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8


    Ich wollte mal fragen ob ich da etwas verändern muss und was ein Primary Key ist.


    Mfg Adnan

  • für was verändern? was willst du dort dann noch ändern?


    Ausser das mit dem Primärschlüssel ist eigentlich unnötig was du da machst. Mach einfach ein neues feld ID und definierst dann das als Primary Key.


    SQL
    CREATE TABLE `user` (
      `ID` INT AUTO_INCREMENT NOT NULL,
      `User` text NOT NULL,
      `Passwort` text NOT NULL,
      `Admin` int(1) NOT NULL DEFAULT '0',
      PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8


    Ein Primärschlüssel dient eigentlich dazu, einen Datensatz eindeutig zu identifizieren. In mysql für samp eigentlich nicht nötig, da meist ein fremdschlüssel von einem anderen Datensatz auf den Primärschlüssel dieses Datensatzes zugreifgt, für das braucht man eigentlich den Primärschlüssel. Aber im Hauptbereich steht eigentlich die Eindeutigkeit des Datensatzes bzw. eines Tupels einer Relation zu definieren.

  • Wow, ich hab noch nie gesehen das du hilfe brauchst


    Najoa MySQL ist halt neuland für mich, und irgendwoher muss ich das ja lernen oder?


    Erstmal dickes Danke hat mir schonmal gut weitergeholfen!
    Ich hab jez ne Tabelle erstellt mit "ID" ,"Name","Passwort" & "Level"
    Wozu ist jez das "ID" mit dem automatischem erhöhen? Also ich verstehe ja das ich irgendwas brauch um später sagen zu können "Diese Tabellenzeile gehört diesem User"
    Dafür kann ich dann diese ID benutzen?
    Außerdem, ich habe die Tabelle wie bereits gesagt erstellt,wie leg ich da jez z.B nen User rein?

  • Najoa MySQL ist halt neuland für mich, und irgendwoher muss ich das ja lernen oder?


    Erstmal dickes Danke hat mir schonmal gut weitergeholfen!
    Ich hab jez ne Tabelle erstellt mit "ID" ,"Name","Passwort" & "Level"
    Wozu ist jez das "ID" mit dem automatischem erhöhen? Also ich verstehe ja das ich irgendwas brauch um später sagen zu können "Diese Tabellenzeile gehört diesem User"
    Dafür kann ich dann diese ID benutzen?


    Ja, kannst du. Das mit dem automatisch erhöhen passiert dann, wenn sich ein neuer benutzer registriert (zumindest bei mir ^^), er überprüft, wieviele datensätze die datenbank hat und nimmt dann die letzte ID Plus 1. Dort ist dann der neue Benutzer drin.


    Außerdem, ich habe die Tabelle wie bereits gesagt erstellt,wie leg ich da jez z.B nen User rein?


    puhh du meinst scripttechnisch? Das geht ein bisschen länger ^^ ich bin im moment nicht zu hause, also kann ich dir das net so gut erklären. Was du aber brauchst ist 4 Variablen für den User im Script:
    z.B.
    Player[playerid][pSQLID] --> Die ID des Datensatzes (für die eindeutigkeit ;) )
    Player[playerid][pName] --> Der Name im Datensatz
    Player[playerid][pPasswort] --> Das Passwort im Datensatz
    Player[playerid][pLevel] --> Das Level im Datensatz


    In diese Variablen kommen dann die Daten aus der Tabelle.


    Zuerst müssen diese aber gefüllt werden. Dafür müsste ich wissen, welches Plugin du verwendest. Ich verwende dieses (http://strickenkid.info/mysql_plugin/1.2.X/ ;)


    MFG

  • achja,ich benutze das a_sampmysql plugin also dieses Standart Teil nehme ich mal an...
    Ich hab per phpMyAdmin nen User hinzugefügt und jop er erhöht die ID automatisch ;)
    Allerdings frage ich mich ob das mit der ID so viel sinn macht, man "sucht" bzw wählt ja in MySQL mit:

    SQL
    SELECT * FROM user WHERE ID='3'


    zum Beispiel...
    In Pawn wäre es dann so,wenn ich mich nicht irre:

    new sql[70]:
    format(sql, sizeof(sql), "SELECT * FROM user WHERE ID='%d'", Player[playerid][pSQLID]);
    samp_mysql_query(sql);

    So,aber wenn ich die Variable Player[playerid][pSQLID] ja noch garnicht habe(Beim Connecten des Spielers),wie soll ich denn danach suchen?
    Also verstehst so bissle meine verwirrung? xD
    DA macht es doch mehr sinn mit

    SQL
    SELECT * FROM user WHERE pName='InternetInk'

    oder nicht?
    Was ich mir sonst vorstellen könnte ist das man mit der SQLID vllt besser arbeiten kann als wie mit dem namen... kA


    //OT: Hab dich ma ICQ geaddet :P

  • Ich hab das Plugin, welches du mir gegeben hast jetzt installiert nur hab ich keine Ahnung was ich als Parameter angeben soll und das deutsche wiki kann man dafür in die Tonne haun. Alle Tutorials hier verweisen allerdings auf die englischen Seite, welche aber down sind.


    mysql_connect()

  • Bei OnPlayerConnect:


    Ob jmd. in der Datanbank ist überprüfen:



    Funkt. auch. Ist bei mir sodrinne...

  • Connecten:


    public OnPlayerConnect(playerid)
    {
    //Andere dinge
    new plname[32];
    GetPlayerName(playerid, plname, sizeof(plname));
    new sqlaccountstatus = MySQLCheckAccount(plname);
    if(sqlaccountstatus != 0)
    {
    PlayerInfo[playerid][pSQLID] = sqlaccountstatus;
    //Login
    }
    else
    {
    //Register
    }
    }



    Einloggen:


    stock MySQLLogin(playerid, password)
    {
    new string[128];new query[128];new data[256];new playername[MAX_PLAYER_NAME];
    GetPlayerName(playerid, playername, sizeof(playername));
    PlayerInfo[playerid][pSQLID] = MySQLCheckAccount(playername);
    format(query, sizeof(query), "SELECT * FROM user WHERE id = %d LIMIT 1", PlayerInfo[playerid][pSQLID]);
    mysql_query(query);
    mysql_store_result();
    if(mysql_fetch_field("Password", data))
    {
    if(!strcmp(data,password,false))
    {
    mysql_fetch_field("ID",data);PlayerInfo[playerid][pSQLID] = strval(data);
    mysql_fetch_field("Playername",data);strmid(PlayerInfo[playerid][pName], data, 0, strlen(data), 255);
    mysql_fetch_field("Password",data);strmid(PlayerInfo[playerid][pPassword], data, 0, strlen(data), 255);
    //etc.
    }
    else
    {
    //Passwort Falsch
    }
    }
    mysql_free_result();
    return 1;
    }


    Registrieren:


    stock MySQLRegister(playerid, password[])
    {
    if(IsPlayerConnected(playerid))
    {
    new playername[MAX_PLAYER_NAME];
    GetPlayerName(playerid, playername, sizeof(playername));
    new newaccountsqlid = MySQLCreateAccount(playername, password);
    if (newaccountsqlid != 0)
    {
    PlayerInfo[playerid][pSQLID] = newaccountsqlid;
    PlayerInfo[playerid][pCash] = GetPlayerMoney(playerid);
    GetPlayerName(playerid,PlayerInfo[playerid][pName],32);
    PlayerInfo[playerid][pSQLID] = MySQLCheckAccount(PlayerInfo[playerid][pName]);
    new query[MAX_STRING];
    format(query, MAX_STRING, "UPDATE user SET Playername='%s' WHERE ID=%d",PlayerInfo[playerid][pName],PlayerInfo[playerid][pSQLID]);mysql_query(query);
    //etc.
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "Beim Erstellen deines Accounts ist ein Fehler aufgetreten.");
    Kick(playerid);
    return 0;
    }
    }
    return 0;
    }


    MySQLCheckAccount:


    stock MySQLCheckAccount(playersname[])
    {
    new query[128];
    new escstr[MAX_PLAYER_NAME];
    mysql_real_escape_string(playersname, escstr);
    format(query, sizeof(query), "SELECT id FROM user WHERE LOWER(Name) = LOWER('%s') LIMIT 1", escstr);
    mysql_query(query);
    mysql_store_result();
    if(mysql_num_rows()==0)
    {
    return 0;
    }
    else
    {
    new strid[32];
    new intid;
    mysql_fetch_row(strid);
    intid = strval(strid);
    return intid;
    }
    }


    MySQLCreateAccount


    stock MySQLCreateAccount(newplayername[], newpassword[])
    {
    new query[128];
    new plname[64];
    new password[64];
    mysql_real_escape_string(newplayername, plname);
    mysql_real_escape_string(newpassword, password);
    format(query, sizeof(query), "INSERT INTO `user` (`Name`, `Password`) VALUES ('%s', '%s')", plname, password);
    mysql_query(query);
    new newplayerid = MySQLCheckAccount(newplayername);
    if (newplayerid != 0)
    {
    return newplayerid;
    }
    return 0;
    }


    Ich hoffe ich muss das net so erklären, doch wenn, dann einfach fragen ;) (HIER GEHTS NACH DER ID!! NICHT NACH DEM NAMEN!!)

  • besser ist es die verbindung danach immer zu schließen, weil der samp scheinbar nur selten bis garnicht die selbe verbindung wieder nutzt und sowieso eine neue spawnt.


    wait_timeout=30 im mysql-server (my.cnf) is dafür zB hilfreich, sonst hat man irgendwann das verbindungslimit erreicht.


    also öffnen, befehl senden, schließen.


    //edit


    hier nochmal die links zum sql-plugin mit dem zB gtawc und sa-reallife fährt.


    samp mysql plugin download - quelle
    samp mysql plugin download- mirror1


    das andere was da gepostet wurde kenn ich garnisch^^

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