@Ivory_Diamond Wichtig ist: PlayerTextDraws benutzen, keine Globalen!
[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 ?
-
Richtig, du kannst zwar manchen Spielern ein globales Textdraw anzeigen & manchen nicht, aber der Inhalt ist immer der selbe.
-
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/OnPlayerClickPlayerTextDrawEinen Dialog für die Passwort Eingabe benötigst du aber trotzdem.
-
Nope, immernoch das gleiche Problem... liegts eventuell an meiner Datenbank?
-
Nope, immernoch das gleiche Problem... liegts eventuell an meiner Datenbank?
Falls dieses Problem noch immer besteht schreib mich per PN an oder komm auf meinen Teamspeak³ ich helfe dir bei der Lösung des problems und erkläre dir dann woran es gelegen hat.
ts.invincible-life.de
-
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:
Codefor(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:Codenew query[200]; mysql_format(handle, query, sizeof(query), "SELECT * FROM property"); mysql_pquery(handle, query, "LoadPropertys");
Code
Alles anzeigenFunction LoadPropertys() { for(new i = 0; i < sizeof(HouseInfo); i++) { cache_get_value_name_float(i, "hEnterx", HouseInfo[i][hEnterx]); cache_get_value_name_float(i, "hEntery", HouseInfo[i][hEntery]); cache_get_value_name_float(i, "hEnterz", HouseInfo[i][hEnterz]); cache_get_value_name_float(i, "hEnterr", HouseInfo[i][hEnterr]); cache_get_value_name_float(i, "hExitx", HouseInfo[i][hExitx]); cache_get_value_name_float(i, "hExity", HouseInfo[i][hExity]); cache_get_value_name_float(i, "hExitz", HouseInfo[i][hExitz]); cache_get_value_name_float(i, "hExitr", HouseInfo[i][hExitr]); cache_get_value_name_int(i, "hHeal", HouseInfo[i][hHeal]); cache_get_value_name(i, "hOwner", HouseInfo[i][hOwner]); cache_get_value_name(i, "hDiscription", HouseInfo[i][hDiscription]); cache_get_value_name_int(i, "hPrice", HouseInfo[i][hPrice]); cache_get_value_name_int(i, "hWorld", HouseInfo[i][hWorld]); cache_get_value_name_int(i, "hInt", HouseInfo[i][hInt]); cache_get_value_name_int(i, "hLock", HouseInfo[i][hLock]); cache_get_value_name_int(i, "hOwned", HouseInfo[i][hOwned]); cache_get_value_name_int(i, "hRent", HouseInfo[i][hRent]); cache_get_value_name_int(i, "hRentabil", HouseInfo[i][hRentabil]); cache_get_value_name_int(i, "hTakings", HouseInfo[i][hTakings]); cache_get_value_name_int(i, "hDate", HouseInfo[i][hDate]); cache_get_value_name_int(i, "hLevel", HouseInfo[i][hLevel]); cache_get_value_name_int(i, "hStrom", HouseInfo[i][hStrom]); cache_get_value_name_int(i, "id", HouseInfo[i][hID]); printf("i: %d | id: %d | hEnterx: %f | %d | %d ", i, HouseInfo[i][hID], HouseInfo[i][hEnterx], (i+1), sizeof(HouseInfo)); if((i+1) == sizeof(HouseInfo)) { LoadPropertys2(); } } }
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.
-
@Jeffry Hat funktioniert danke
Hab gleich wieder ein neues kleines Problem... Sry ich versuch sie wirklich auch selber zu lösen, aber MySQL ist neu für mich^^
Der String hDiscription wird nicht gefüllt.. Wenn ich ihn printe ist er leer: https://pastebin.com/7EALWKvk
Das Enum von HouseInfo: https://pastebin.com/PuyHFCku -
-
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.
-
Ah gut danke, funktioniert
Ich hab die String Var´s so abgespeichert wie du beim Beispiel den Spielernamen auch speicherst. Wofür ist Null da?
-
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 -
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?
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_floatBeispiel:
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;
} -