[jTuT] MySQL R41-4 (Installation, XAMPP, Verwendung, Bedienung & Registrations-System)

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
  • @Ivory_Diamond Wichtig ist: PlayerTextDraws benutzen, keine Globalen!

    Schönmal thx, für den Hinweis.
    Globale Textdraws werden ganz selten verwendet oder ?
    Bspw für Events, wo alle User das selbe sehen sollten. ?


    Ansonsten für bspw einen Waffendealer Job,
    verwendet man wieder PlayerTextdraws ?


    Global = Für alle Zeitgleich aufrufbar & der selbe Inhalt &
    Local ? = Individuelle Textdraw´s bspw mit Spieler Informationen ?


    Verstehe ich das soweit richtig ?

  • Hab aber eigentlich die Datenbank schon mit sizeof(HouseInfo) gefüllt & die IDs haben sich ja sowieso automatisch inkrementiert.

    Dann versuche eventuell mal, in diesem UPDATE Query ganz am Ende bei der WHERE Bedingung anstatt der hID des Arrays nur "i" zu nehmen. Der Vermutung nach ist die hID zu dem Zeitpunkt leer, also 0.



    Möchte keinen fertig geschrieben Code von dir, oder sonst wem, sondern nur ein paar Hinweise, wie ich am besten Vorgehen sollte.

    Du erstellst das Textdraw mit CreatePlayerTextDraw, zeigst es mit PlayerTextDrawShow an und die Interaktion mit dem Textdraw machst du mit OnPlayerClickPlayerTextDraw sowie SelectTextDraw.
    Ein Beispiel findest du hier: http://wiki.sa-mp.com/wiki/OnPlayerClickPlayerTextDraw


    Einen Dialog für die Passwort Eingabe benötigst du aber trotzdem.

  • Nope, immernoch das gleiche Problem... liegts eventuell an meiner Datenbank?

    Kannst du bitte den aktuellen Code nochmal posten und das Problem nochmal etwas detaillierter erklären?
    Bitte mit Screenshot aus der Datenbank wo das Problem erkennbar ist (vorher / nachher) und dem Server Log dazu, an dem du das Problem erkennst.

  • Also, zuerst fülle ich die Datenbank einmal unter OnGameModeInit so:

    Code
    for(new i = 0; i < sizeof(HouseInfo); i++)
    	{
    		new query[256];
    		mysql_format(handle, query, sizeof(query), "INSERT INTO property (hLevel) VALUES ('3')");
    		mysql_pquery(handle, query);
    	}


    Das mach ich nur 1x & dann klammer ich den Code aus. Auch unter OnGameModeInit werden immer die Daten aus der Datenbank geladen:

    Code
    new query[200];
    	mysql_format(handle, query, sizeof(query), "SELECT * FROM property");
    	mysql_pquery(handle, query, "LoadPropertys");

    Danach sieht die Datenbank so aus: https://imgur.com/a/DRbbdoW



    Als nächstes versuche ich auf dem Server per /addhouse ein Haus zu erstellen, was passiert ist das: https://imgur.com/a/GdqpaqQ



    In der Konsole wird nur das geprintet: " Speichern: i: 0 | id: 1 | hEnterx: 1776.326293 | Price: 500 "

  • Danke für die ausführliche Erklärung, jetzt ist mir das Vorgehen und das Problem klar.
    Ändere mal beim /addhouse
    new query[200];
    zu:
    new query[500];


    Vermutlich schneidet es die WHERE Bedingung auf Grund der Größe genau passend ab, ohne dass ein Sytax Error entsteht.

  • Super!
    Kein Problem, dafür der Thread ja da. :)


    Bei Strings, die in Variablen geladen werden, hinter denen ein enum steht, muss die Länge explizit angegeben werden (http://wiki.sa-mp.com/wiki/MySQL/R40#cache_get_value_name).
    cache_get_value_name(i, "hDiscription", HouseInfo[i][hDiscription]);
    zu:
    cache_get_value_name(i, "hDiscription", HouseInfo[i][hDiscription], MAX_PLAYER_NAME);


    Gleiches also auch bei hOwner.

  • Ich hab die String Var´s so abgespeichert wie du beim Beispiel den Spielernamen auch speicherst.

    Das passt dann auch so, den Name lade ich im Beispiel aber nicht aus der Datenbank, sondern fülle ihn mit GetPlayerName, daher ist im Beispiel kein Auslesen eines Strings drin.



    Wofür ist Null da?

    Das sagt aus, dass der Wert der Spalte leer (NULL) sein darf.

  • mysql_format(handle, query, sizeof(query), "INSERT INTO user (Username, Key) VALUES ('%e', MD5('%e'))", PlayerInfo[playerid][PlayerName], inputtext);mysql_pquery(handle, query, "OnUserRegister", "d", playerid);



    OnUserRegister wird nicht aufgerufen, alles schon tausendmal kontrolliert,


    namen in der db stimmen auch




    // Habs selbst gefixt da hat das gefehlt:


    `user` usw

  • Moin,


    Ich hab da mal ein paar fragen^^


    Erste Frage:


    Warum schreibt man für die Verbindungsversuche "_:handle" ... reicht nicht einfach nur "handle" ?



    Zweite Frage:


    Ich versteh nicht ganz wie der Syntax von


    cache_get_value_name_int(0, "id", PlayerInfo[playerid][pID]);


    Also klar, das was in der Datenbank steht als ID soll als pID gespeichert werden, aber warum die 0? wofür braucht man das und was ist wenn ich eine 1 eintragen würde?


    Dritte Frage:


    Wenn ich als Beispiel nur folgenden Query ausführe:


    mysql_format(handle, query, sizeof(query), "SELECT * FROM user WHERE name = '%e'", NAME);
    usw...


    Wie kann ich dann nur den Content von einer Spalte Prüfen ? Ich meine klar in diesem Beispiel ist es sinnvoller einfach beides zu prüfen und wenn es inkorrekt ist, kann es nur das Passwort sein^^ aber für die Zukunft? Welche Funktion vom cache ist da besser?


    Mit freundlichen Grüßen
    XonarZ

  • 0 steht für die Zeile (row/index) in der Datenbank.
    In einem Loop müsstest du dann 0 mit i ersetzen, damit er alle Zeilen durchrattert.
    Die erste Zeile ist immer Zeile 0 und die zweite Zeile 1 und so weiter.


    Wenn ich als Beispiel nur folgenden Query ausführe:


    mysql_format(handle, query, sizeof(query), "SELECT * FROM user WHERE name = '%e'", NAME);
    usw...


    Wie kann ich dann nur den Content von einer Spalte Prüfen ? Ich meine klar in diesem Beispiel ist es sinnvoller einfach beides zu prüfen und wenn es inkorrekt ist, kann es nur das Passwort sein^^ aber für die Zukunft? Welche Funktion vom cache ist da besser?

    Ich verstehe nicht ganz was du meinst.
    Wenn du meinst dass auch das Passwort geprüft wird; "SELECT * FROM user WHERE Name = '%e' AND Passwort = '%e'"


    Und wenn du nur eine Spalte aus der Zeile des Spielers nehmen willst, ersetzt du bei "SELECT *" einfach das * mit dem Spaltennamen. Z.b. "SELECT name FROM..."

  • Warum schreibt man für die Verbindungsversuche "_:handle" ... reicht nicht einfach nur "handle" ?

    Weil handle den Tag "MySQL" hat, welcher nicht korrekt interpretiert wird, wenn er im Print ausgegeben wird (Warnung Tag Mismatch), daher wird mit "_:" der Tag sozusagen entfernt und der Wert als reiner Integer interpretiert, somit gibt es keine Warnung.

  • 0 steht für die Zeile (row/index) in der Datenbank.
    In einem Loop müsstest du dann 0 mit i ersetzen, damit er alle Zeilen durchrattert.
    Die erste Zeile ist immer Zeile 0 und die zweite Zeile 1 und so weiter.

    Achsoo okay. Danke dir :)

    Ich verstehe nicht ganz was du meinst.
    Wenn du meinst dass auch das Passwort geprüft wird; "SELECT * FROM user WHERE Name = '%e' AND Passwort = '%e'"


    Und wenn du nur eine Spalte aus der Zeile des Spielers nehmen willst, ersetzt du bei "SELECT *" einfach das * mit dem Spaltennamen. Z.b. "SELECT name FROM..."

    Na was ich meine ist folgendes:


    bei PHP kann man ja auch folgendes machen:



    PHP
    $res = mysqli_query(conn, "SELECT * FROM table WHERE name = 'name'");
    
    
    $row = mysqli_fetch_array($res);
    
    
    echo $row['password'];

    Also man kann dann anhand des arrays eine bestimmte Spalte abfragen und dann ggf. vergleichen mit einem Wert.

  • Verstehe ich immer noch nicht ganz.
    Du kannst doch einfach wenn du die Query abschickst bei pquery oder tquery, einfach ne Funktion mitgeben wie "OnUserLoad" und dort dann die Variablen mit "cache_get_value_name(0, "Name",pName)" speichern? Dann kannst du sie doch einfach mit strcmp vergleichen. pName ist dann ja das was in der Datenbank steht. ?(

  • Also man kann dann anhand des arrays eine bestimmte Spalte abfragen und dann ggf. vergleichen mit einem Wert.

    Nutze dazu die Funktionen
    http://wiki.sa-mp.com/wiki/MySQL/R40#cache_get_value_name
    http://wiki.sa-mp.com/wiki/MyS…cache_get_value_name_int_
    http://wiki.sa-mp.com/wiki/MyS…ache_get_value_name_float


    Beispiel:
    mysql_format(handle, query, sizeof(query), "SELECT * FROM users WHERE name = '%e'", SpielerName(playerid));
    mysql_pquery(handle, query, "OnUserCheckResult", "d", playerid);


    Und dann:
    forward OnUserCheckResult(playerid);
    public OnUserCheckResult(playerid)
    {
    new wert[32], rows;
    cache_get_row_count(rows);
    if(rows)
    {
    //wert = Name der Spalte aus der Datenbank, die du auslesen willst.
    cache_get_value_name(0, "wert", wert);
    }
    return 1;
    }

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()