You are not logged in.

  • Login
Bitte besucht unser neues Forum unter https://forum.nitrado.net | Please visit our new Forum at https://forum.nitrado.net

Dear visitor, welcome to Nitrado.net Prepaid Gameserver Community-Support - Archiv. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

DutyCrafterHD

User / Kunde

  • "DutyCrafterHD" is male
  • "DutyCrafterHD" started this thread

Posts: 20

  • Send private message

1

Wednesday, August 3rd 2016, 5:55pm

Location / Double aus MySQL auslesen.

Hallo leute

Ich bin gerade dabei eine Location in MySQl zu Speichern das klapppt auch.
Aber wie kann ich die Location getten ,da XYZ ja double sind .
könnten ihr mir vieleicht eine kleine Methode schicken :) :)

Hier meine Methode um die Location zu Speichern:



Spoiler Spoiler



public static void setLocation(String name, String world, double locx, double locy, double locz, float yaw, float pitch)
{
if (LocationExists(name))
{
Gmain.main.mysql.update("UPDATE Locations SET WORLD='" + world + "' WHERE NAME='" + name + "'");
Gmain.main.mysql.update("UPDATE Locations SET LOCX='" + locx + "' WHERE NAME='" + name + "'");
Gmain.main.mysql.update("UPDATE Locations SET LOCY='" + locy + "' WHERE NAME='" + name + "'");
Gmain.main.mysql.update("UPDATE Locations SET LOCZ='" + locz + "' WHERE NAME='" + name + "'");
Gmain.main.mysql.update("UPDATE Locations SET YAW='" + yaw + "' WHERE NAME='" + name + "'");
Gmain.main.mysql.update("UPDATE Locations SET PITCH='" + pitch + "' WHERE NAME='" + name + "'");
}
else
{
createLocation(name);
setLocation(name, world, locx, locy, locz, yaw, pitch);
}
}





vielen dank im voraus


mfg :)

LynxPlay

User / Kunde

Posts: 122

  • Send private message

2

Wednesday, August 3rd 2016, 7:32pm

Nun du kannst die Methode getBigDeciman(String collumName) vom ResultSet benutzen um die Doubles auszulesen. So eine Methode sähe so aus:

Java source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
                 try {
			PreparedStatement statement = connection.prepareStatement("SELECT * FROM ? WHERE NAME = ?");
			statement.setString(1,tableName);
			statement.setString(2, locationName);
			
			ResultSet set = statement.executeQuery();
			
			double x = set.getBigDecimal("x").doubleValue();
			double y = set.getBigDecimal("y").doubleValue();
			double z = set.getBigDecimal("z").doubleValue();
			String world = set.getString("world");
			
			return new Location(Bukkit.getWorld(world) , x , y , z);
		} catch (Exception e) {e.printStackTrace();}


//EDIT Der DatenType beim CreateTable ist bei Doubles DECIMAL
Never stop lerning or u will fall behind

PS: Electro Swing is just godlike (1931 - 1953)

DutyCrafterHD

User / Kunde

  • "DutyCrafterHD" is male
  • "DutyCrafterHD" started this thread

Posts: 20

  • Send private message

3

Wednesday, August 3rd 2016, 7:52pm

erstmal vielen dank für deine antwort habe es jetzt so gemacht jedoch funktioniert es nicht

Spoiler Spoiler



ublic static Location getLoc(String name)
{
try {
PreparedStatement statement = Gmain.main.mysql.con.prepareStatement("SELECT * FROM ? WHERE NAME = ?");
statement.setString(1,"Locations");
statement.setString(2, name);

ResultSet set = statement.executeQuery();

double x = set.getBigDecimal("LOCX").doubleValue();
double y = set.getBigDecimal("LOCY").doubleValue();
double z = set.getBigDecimal("LOCZ").doubleValue();
String world = set.getString("WORLD");

return new Location(Bukkit.getWorld(world) , x , y , z);
} catch (Exception e) {e.printStackTrace();}
{

}
return null;

}



ich kenne mich mysql noch nicht so ganz aus könntest du mir vieleicht die komplette methode schicken ?
und noch eine frage wie kann ich yaw und pitch mit auslesen

mfg
:) :)

LynxPlay

User / Kunde

Posts: 122

  • Send private message

4

Wednesday, August 3rd 2016, 8:04pm

Den Yaw und den Pitch kannst du genaus so auslesen :D Und falls du einen Fehler bekommst poste den bitte damit man dir auf helfen kann
Never stop lerning or u will fall behind

PS: Electro Swing is just godlike (1931 - 1953)

DutyCrafterHD

User / Kunde

  • "DutyCrafterHD" is male
  • "DutyCrafterHD" started this thread

Posts: 20

  • Send private message

5

Wednesday, August 3rd 2016, 8:19pm

habe ich es überhaupt richtig gemacht ?

Spoiler Spoiler


public static Location getLoc(String name)
{
try {
PreparedStatement statement = Gmain.main.mysql.con.prepareStatement("SELECT * FROM ? WHERE NAME = ?");
statement.setString(1,"Locations");
statement.setString(2, name);

ResultSet set = statement.executeQuery();

double x = set.getBigDecimal("LOCX").doubleValue();
double y = set.getBigDecimal("LOCY").doubleValue();
double z = set.getBigDecimal("LOCZ").doubleValue();
String world = set.getString("WORLD");

return new Location(Bukkit.getWorld(world) , x , y , z);
} catch (Exception e) {e.printStackTrace();}
{

}
return null;

}


und hier den error:

Spoiler Spoiler


[20:18:12 WARN]: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''Locations' WHERE NAME = 'Test'' at line 1
[20:18:12 WARN]: at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
[20:18:12 WARN]: at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
[20:18:12 WARN]: at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
[20:18:12 WARN]: at java.lang.reflect.Constructor.newInstance(Unknown Source)
[20:18:12 WARN]: at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
[20:18:12 WARN]: at com.mysql.jdbc.Util.getInstance(Util.java:387)
[20:18:12 WARN]: at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:941)
[20:18:12 WARN]: at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3870)
[20:18:12 WARN]: at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3806)
[20:18:12 WARN]: at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2470)
[20:18:12 WARN]: at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2617)
[20:18:12 WARN]: at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2550)
[20:18:12 WARN]: at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861)
[20:18:12 WARN]: at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1962)
[20:18:12 WARN]: at de.timur.mysql.SQLLoc.getLoc(SQLLoc.java:62)
[20:18:12 WARN]: at de.timur.cmds.Cmd_setspawn.onCommand(Cmd_setspawn.java:31)
[20:18:12 WARN]: at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
[20:18:12 WARN]: at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141)
[20:18:12 WARN]: at org.bukkit.craftbukkit.v1_9_R1.CraftServer.dispatchCommand(CraftServer.java:645)
[20:18:12 WARN]: at net.minecraft.server.v1_9_R1.PlayerConnection.handleCommand(PlayerConnection.java:1350)
[20:18:12 WARN]: at net.minecraft.server.v1_9_R1.PlayerConnection.a(PlayerConnection.java:1185)
[20:18:12 WARN]: at net.minecraft.server.v1_9_R1.PacketPlayInChat.a(PacketPlayInChat.java:45)
[20:18:12 WARN]: at net.minecraft.server.v1_9_R1.PacketPlayInChat.a(PacketPlayInChat.java:1)
[20:18:12 WARN]: at net.minecraft.server.v1_9_R1.PlayerConnectionUtils$1.run(SourceFile:13)
[20:18:12 WARN]: at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
[20:18:12 WARN]: at java.util.concurrent.FutureTask.run(Unknown Source)
[20:18:12 WARN]: at net.minecraft.server.v1_9_R1.SystemUtils.a(SourceFile:45)
[20:18:12 WARN]: at net.minecraft.server.v1_9_R1.MinecraftServer.D(MinecraftServer.java:721)
[20:18:12 WARN]: at net.minecraft.server.v1_9_R1.DedicatedServer.D(DedicatedServer.java:400)
[20:18:12 WARN]: at net.minecraft.server.v1_9_R1.MinecraftServer.C(MinecraftServer.java:660)
[20:18:12 WARN]: at net.minecraft.server.v1_9_R1.MinecraftServer.run(MinecraftServer.java:559)
[20:18:12 WARN]: at java.lang.Thread.run(Unknown Source)

LynxPlay

User / Kunde

Posts: 122

  • Send private message

6

Wednesday, August 3rd 2016, 8:28pm

Mein Fehler sorry xD Der Table name muss natürlich nicht als Value String eingesetzt werden. Das ganze sieht dann so aus:

Java source code

1
2
PreparedStatement statement = Gmain.main.mysql.con.prepareStatement("SELECT * FROM Locations WHERE NAME = ?");
statement.setString(1, name);
Never stop lerning or u will fall behind

PS: Electro Swing is just godlike (1931 - 1953)

DutyCrafterHD

User / Kunde

  • "DutyCrafterHD" is male
  • "DutyCrafterHD" started this thread

Posts: 20

  • Send private message

7

Wednesday, August 3rd 2016, 8:34pm

habe die location mal in eine nachricht ausgegeben ich bekomme die nachricht null und einen error:

Spoiler Spoiler


[20:32:37 WARN]: java.sql.SQLException: Before start of result set
[20:32:37 WARN]: at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:959)
[20:32:37 WARN]: at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898)
[20:32:37 WARN]: at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887)
[20:32:37 WARN]: at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:862)
[20:32:37 WARN]: at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:790)
[20:32:37 WARN]: at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5244)
[20:32:37 WARN]: at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5167)
[20:32:37 WARN]: at com.mysql.jdbc.ResultSetImpl.getBigDecimal(ResultSetImpl.java:1212)
[20:32:37 WARN]: at com.mysql.jdbc.ResultSetImpl.getBigDecimal(ResultSetImpl.java:1325)
[20:32:37 WARN]: at de.timur.mysql.SQLLoc.getLoc(SQLLoc.java:63)
[20:32:37 WARN]: at de.timur.cmds.Cmd_setspawn.onCommand(Cmd_setspawn.java:31)
[20:32:37 WARN]: at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
[20:32:37 WARN]: at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141)
[20:32:37 WARN]: at org.bukkit.craftbukkit.v1_9_R1.CraftServer.dispatchCommand(CraftServer.java:645)
[20:32:37 WARN]: at net.minecraft.server.v1_9_R1.PlayerConnection.handleCommand(PlayerConnection.java:1350)
[20:32:37 WARN]: at net.minecraft.server.v1_9_R1.PlayerConnection.a(PlayerConnection.java:1185)
[20:32:37 WARN]: at net.minecraft.server.v1_9_R1.PacketPlayInChat.a(PacketPlayInChat.java:45)
[20:32:37 WARN]: at net.minecraft.server.v1_9_R1.PacketPlayInChat.a(PacketPlayInChat.java:1)
[20:32:37 WARN]: at net.minecraft.server.v1_9_R1.PlayerConnectionUtils$1.run(SourceFile:13)
[20:32:37 WARN]: at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
[20:32:37 WARN]: at java.util.concurrent.FutureTask.run(Unknown Source)
[20:32:37 WARN]: at net.minecraft.server.v1_9_R1.SystemUtils.a(SourceFile:45)
[20:32:37 WARN]: at net.minecraft.server.v1_9_R1.MinecraftServer.D(MinecraftServer.java:721)
[20:32:37 WARN]: at net.minecraft.server.v1_9_R1.DedicatedServer.D(DedicatedServer.java:400)
[20:32:37 WARN]: at net.minecraft.server.v1_9_R1.MinecraftServer.C(MinecraftServer.java:660)
[20:32:37 WARN]: at net.minecraft.server.v1_9_R1.MinecraftServer.run(MinecraftServer.java:559)
[20:32:37 WARN]: at java.lang.Thread.run(Unknown Source)

LynxPlay

User / Kunde

Posts: 122

  • Send private message

8

Wednesday, August 3rd 2016, 8:37pm

FUCK :( Ich bin echt komplett durch den Wind :((

Java source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static Location getLoc(String name)
{
try {
PreparedStatement statement = Gmain.main.mysql.con.prepareStatement("SELECT * FROM Locations WHERE NAME = ?");
statement.setString(1, name);

ResultSet set = statement.executeQuery();

if(!set.next()) return null;

double x = set.getBigDecimal("LOCX").doubleValue();
double y = set.getBigDecimal("LOCY").doubleValue();
double z = set.getBigDecimal("LOCZ").doubleValue();
String world = set.getString("WORLD");

return new Location(Bukkit.getWorld(world) , x , y , z);
} catch (Exception e) {e.printStackTrace();}
{

}
return null;

}


Das set.next() ist wichtig damit du zu ersten Eintrag im ResultSet kommst :(
Never stop lerning or u will fall behind

PS: Electro Swing is just godlike (1931 - 1953)

DutyCrafterHD

User / Kunde

  • "DutyCrafterHD" is male
  • "DutyCrafterHD" started this thread

Posts: 20

  • Send private message

9

Wednesday, August 3rd 2016, 8:45pm

ok vielen dank es funktioniert aber wenn ich yaw und pitch hinzufügen möchte soll ich dan double oder flaot nehmen da yaw und pitch floas sind ?

LynxPlay

User / Kunde

Posts: 122

  • Send private message

10

Wednesday, August 3rd 2016, 8:47pm

Jup nehm float
Never stop lerning or u will fall behind

PS: Electro Swing is just godlike (1931 - 1953)

DutyCrafterHD

User / Kunde

  • "DutyCrafterHD" is male
  • "DutyCrafterHD" started this thread

Posts: 20

  • Send private message

11

Wednesday, August 3rd 2016, 8:49pm

ok vielen dank :) :)
closed

Stuppsman

User / Kunde

Posts: 2,766

Thanks: 25

  • Send private message

12

Thursday, August 4th 2016, 6:14pm

Noch n paar Kleinigkeiten:

- NIEMALS nen leeren catch-Block stehen lassen. Du wirst dich nur wundern, dass es nicht funktioniert, weisst aber nicht, was denn nicht funktioniert..
- queries haben den Vorteil, dass man viele Dinge in einen Query packen kann, so dass man nicht für jedes Update nochmal nen Query abschicken muss.

also nicht:

Quoted


Gmain.main.mysql.update("UPDATE Locations SET WORLD='" + world + "' WHERE NAME='" + name + "'");
Gmain.main.mysql.update("UPDATE Locations SET LOCX='" + locx + "' WHERE NAME='" + name + "'");
usw...


Sondern

Source code

1
"UPDATE Locations SET WORLD=' " + world + " ', LOCX=" + locx + ", ... WHERE NAME=' "+name+ " ' ";

Da sind zur Übersichtlichkeit ein paar Leerzeichen zu viel drin, aber ich hoff, es ist rübergekommen, was ich mein.. Schick für so ein Update nur ein Query ab, nicht 5-6, das macht keinen Sinn und die Datenbank unnötig langsamer. Zudem gehören die Hochkommata nur um Strings, nicht um Zahlen - aber da kommts halt drauf an, wie du die Tabelle aufgebaut hast, also welche Datentypen du verwendet hast. Als DECIMAL, DOUBLE oder ähnliches (MySQL unterstützt mittlerweile ganz schön viel..) führen die Hochkommata schnell zu Fehlern, mit denen man überhaupt nix anfangen kann.
Nein, ich hab kein Skype.. bei Interesse an einer privaten Unterrichtsstunde, wende dich bitte direkt an mein Team! 8)

DutyCrafterHD

User / Kunde

  • "DutyCrafterHD" is male
  • "DutyCrafterHD" started this thread

Posts: 20

  • Send private message

13

Saturday, August 6th 2016, 8:28pm

ok danke für die Info

iSEVEN

User / Kunde

  • "iSEVEN" is male

Posts: 1,431

  • Send private message

14

Monday, August 8th 2016, 12:18am

Noch n paar Kleinigkeiten:

- NIEMALS nen leeren catch-Block stehen lassen. Du wirst dich nur wundern, dass es nicht funktioniert, weisst aber nicht, was denn nicht funktioniert..
- queries haben den Vorteil, dass man viele Dinge in einen Query packen kann, so dass man nicht für jedes Update nochmal nen Query abschicken muss.

also nicht:

Quoted


Gmain.main.mysql.update("UPDATE Locations SET WORLD='" + world + "' WHERE NAME='" + name + "'");
Gmain.main.mysql.update("UPDATE Locations SET LOCX='" + locx + "' WHERE NAME='" + name + "'");
usw...


Sondern

Source code

1
"UPDATE Locations SET WORLD=' " + world + " ', LOCX=" + locx + ", ... WHERE NAME=' "+name+ " ' ";

Da sind zur Übersichtlichkeit ein paar Leerzeichen zu viel drin, aber ich hoff, es ist rübergekommen, was ich mein.. Schick für so ein Update nur ein Query ab, nicht 5-6, das macht keinen Sinn und die Datenbank unnötig langsamer. Zudem gehören die Hochkommata nur um Strings, nicht um Zahlen - aber da kommts halt drauf an, wie du die Tabelle aufgebaut hast, also welche Datentypen du verwendet hast. Als DECIMAL, DOUBLE oder ähnliches (MySQL unterstützt mittlerweile ganz schön viel..) führen die Hochkommata schnell zu Fehlern, mit denen man überhaupt nix anfangen kann.

Entschuldige deine Antwort ist genauso Quark. Mit Prepared Statements die
  1. sicherer sind (da keine SQL-Injection möglich ist)
  2. mehr Übersichtlichkeit verschaffen
bist du besser dran.

Stuppsman

User / Kunde

Posts: 2,766

Thanks: 25

  • Send private message

15

Monday, August 8th 2016, 2:30am

Da geb ich dir sogar vollkommen recht - aber bei locations ist das nur langsamer.. wird wohl niemand ne SQL-Injection in nem world-namen verstecken..
Nein, ich hab kein Skype.. bei Interesse an einer privaten Unterrichtsstunde, wende dich bitte direkt an mein Team! 8)

iSEVEN

User / Kunde

  • "iSEVEN" is male

Posts: 1,431

  • Send private message

16

Monday, August 8th 2016, 6:07pm

@Stuppsman

Lass die Geschwindigkeit außen vor. Was bringt dir der performanteste Code, wenn er dir dein System zerschießt, weil du dich nicht ordentlich genug mit dem Thema Sicherheit befasst hast? Eben: rein gar nichts und dein Server wird mit voller Performance zerschossen.

Stuppsman

User / Kunde

Posts: 2,766

Thanks: 25

  • Send private message

17

Monday, August 8th 2016, 9:20pm

Stimmt.. nur wie gesagt, bei ner Location kannst du es mit der Sicherheit auch übertreiben. Wenn der Serverbetreiber seine Farmwelt nicht unbedingt "Farmwelt; DROP TABLE spieler;" nennt, gibts da keine Möglichkeit, ne Injection einzubauen. Prepared Statements brauchst du nur zwingend, wenn du Eingaben vom User verwalten möchtest - alles was du selbst eingibst ist über ein PreparedStatement nur unnötig langsamer.
Nein, ich hab kein Skype.. bei Interesse an einer privaten Unterrichtsstunde, wende dich bitte direkt an mein Team! 8)

Bitte besucht unser neues Forum unter https://forum.nitrado.net| Please visit our new Forum at https://forum.nitrado.net