• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

MySQL will nicht

Kombustor

Redstoneengineer
Registriert
1 Februar 2013
Beiträge
39
Diamanten
0
Hallo,

ich nutze folgende Klassen für die SQL-Verbindung:
https://forums.bukkit.org/threads/tutorial-using-mysql-in-your-plugins.132309/

Nun möchte ich das beim joinen der Wert in MySQL auf 0 gesetzt wird:
Code:
[MENTION=109443]Event[/MENTION]Handler
	public void onJoin(PlayerJoinEvent event) {
		Player p = event.getPlayer();
		try {
			Statement statement = c.createStatement();
			ResultSet res;
			res = statement
					.executeQuery("SELECT Points FROM Points WHERE Player = '"
							+ p.getName() + "';");
			res.next();
			if (res.getString("Player") == null) {
				statement
						.executeUpdate("INSERT INTO Points (`Player`, `Points`) VALUES ('"
								+ p.getName() + "','0');");
			}
		} catch (SQLException e) {
			logger.severe(e.getMessage());
		}
	}

Die Connection c wird wie folgt aufgerufen:

In der Klasse
Code:
        String host;
	String database;
	String port;
	String user;
	String pass;
	public MySQL MySQL;
	Connection c = null;

im onEnable Teil:

Code:
                host = getConfig().getString("MySQL.host");
		database = getConfig().getString("MySQL.database");
		port = getConfig().getString("MySQL.port");
		user = getConfig().getString("MySQL.user");
		pass = getConfig().getString("MySQL.pass");

		MySQL = new MySQL(host, port, database, user, pass);

		c = MySQL.open();


Jedoch bekomme ich zwei fehler, der zweite resultiert wohl aus dem ersten:

Fehler 1:
Code:
Could not connect to MySQL server! because: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

Fehler 2:
Code:
2013-07-25 15:38:32 [SEVERE] Could not pass event PlayerJoinEvent to PunkteSystem v1.0
org.bukkit.event.EventException
	at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:427)
	at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
	at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:477)
	at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:462)
	at net.minecraft.server.v1_6_R2.PlayerList.c(PlayerList.java:206)
	at net.minecraft.server.v1_6_R2.PlayerList.a(PlayerList.java:102)
	at net.minecraft.server.v1_6_R2.PendingConnection.e(PendingConnection.java:130)
	at net.minecraft.server.v1_6_R2.PendingConnection.d(PendingConnection.java:43)
	at net.minecraft.server.v1_6_R2.DedicatedServerConnectionThread.a(DedicatedServerConnectionThread.java:41)
	at net.minecraft.server.v1_6_R2.DedicatedServerConnection.b(SourceFile:29)
	at net.minecraft.server.v1_6_R2.MinecraftServer.t(MinecraftServer.java:590)
	at net.minecraft.server.v1_6_R2.DedicatedServer.t(DedicatedServer.java:226)
	at net.minecraft.server.v1_6_R2.MinecraftServer.s(MinecraftServer.java:486)
	at net.minecraft.server.v1_6_R2.MinecraftServer.run(MinecraftServer.java:419)
	at net.minecraft.server.v1_6_R2.ThreadServerApplication.run(SourceFile:582)
Caused by: java.lang.NullPointerException
	at me.kombustorlp.punktesystem.PunkteSystem.onJoin(PunkteSystem.java:159)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:425)
	... 14 more

ich hoffe ihr könnt mir helfen

Grüße Fabian
 

Baba43

Ehem. Teammitglied
Ehem. Teammitglied
Registriert
5 November 2012
Beiträge
869
Diamanten
60
Minecraft
baba43
Lass dir diese Variablen mal in die Konsole ausgeben und schick uns das Ergebnis.

MySQL = new MySQL(host, port, database, user, pass);

In Zeile PunkteSystem.java:159 ist eine Variable nicht gesetzt.
 

Kombustor

Redstoneengineer
Registriert
1 Februar 2013
Beiträge
39
Diamanten
0
Lass dir diese Variablen mal in die Konsole ausgeben und schick uns das Ergebnis.

MySQL = new MySQL(host, port, database, user, pass);

In Zeile PunkteSystem.java:159 ist eine Variable nicht gesetzt.


Wie meinst du ausgeben?

Die "nicht gesetzte variable in Z. 159 ist":
Statement statement = c.createStatement();

-.-
 

Kombustor

Redstoneengineer
Registriert
1 Februar 2013
Beiträge
39
Diamanten
0
Dann ist c null.

Mit ausgeben meine ich, dass du dir die Variablen in er Konsole anzeigen lässt. Davon hätte nämlich auch eine null sein können.

Genau, c ist aber nicht null :/, siehe onEnable:
Code:
	public void onEnable() {
		getServer().getPluginManager().registerEvents(this, this);

		addDefaults();

		host = getConfig().getString("MySQL.host");
		database = getConfig().getString("MySQL.database");
		port = getConfig().getString("MySQL.port");
		user = getConfig().getString("MySQL.user");
		pass = getConfig().getString("MySQL.pass");

		MySQL = new MySQL(host, port, database, user, pass);


		[B]c = MySQL.open();[/B]
	}

der Entwickler dieses MySQL-Systems sagt dazu:

P.S : If you're having problems getting a NullPointer when calling
Code:java

Statement statement = c.createStatement();


Try putting
Code:java

Statement s = MySQL.open().createStatement();

before trying to make the statement.


Kommt trotzdem eine NPE.
 
C

Chrisliebaer

Guest
Wieso sollte c nicht null sein können? Les dir bitte mal die Dokumentationen durch, ich Wette zu 100%, dass open() im Fehlerfall null zurück gibt.

Außerdem könntest du ja auch mal nen Debugger verwenden oder dir die Variablen ausgeben lassen.


Des weiteren sieht das ganze "Tutorial" sehr billig aus. Wenn du MySQL brauchst, dann nimm doch einfach die JDBC Treiber dafür.
 

Baba43

Ehem. Teammitglied
Ehem. Teammitglied
Registriert
5 November 2012
Beiträge
869
Diamanten
60
Minecraft
baba43
Wahrscheinlich sind Werte der config falsch, weshalb die Funktion null zurückgibt.

Alles kann null sein, denn auch eine Funktion kann null zurückgeben. Da du eine dir unbekannte Funktion aufrufst, kannst du dir überhaupt nicht sicher sein, dass dort nicht null zurückkommt.

Eine einfache Ausgabe der Variable würde genügen um festzustellen, ob eine Variable null ist und dem Fehler somit einzugrenzen. Wobei die Fehlermeldung in einer Zeile auftritt, wo nur eine Anweisung drin steht, also ist klar, was null sein muss.
 

Kombustor

Redstoneengineer
Registriert
1 Februar 2013
Beiträge
39
Diamanten
0
Wahrscheinlich sind Werte der config falsch, weshalb die Funktion null zurückgibt.

Alles kann null sein, denn auch eine Funktion kann null zurückgeben. Da du eine dir unbekannte Funktion aufrufst, kannst du dir überhaupt nicht sicher sein, dass dort nicht null zurückkommt.

Eine einfache Ausgabe der Variable würde genügen um festzustellen, ob eine Variable null ist und dem Fehler somit einzugrenzen. Wobei die Fehlermeldung in einer Zeile auftritt, wo nur eine Anweisung drin steht, also ist klar, was null sein muss.

Eigentlich sollte dieses Tutorial doch meinen Anforderungen genügen oder?
http://forums.bukkit.org/threads/tu...ur-plugins-mysql-databases.43445/#post-845211
 

Baba43

Ehem. Teammitglied
Ehem. Teammitglied
Registriert
5 November 2012
Beiträge
869
Diamanten
60
Minecraft
baba43
Kannst du nicht einfach mal das machen, worum man dich bittet?

Im echten Leben suchst du doch auch selbst nach den Ursachen für deine Probleme oder schiebst du es auf die IKEA-Anleitung, wenn irgendwas nicht so funktioniert wie erwartet?

Und wenn dann herauskommt, dass es eine so offensichtliche Blödheit ist, wie ungültige Verbindungsdaten für die Datenbank zu übergeben, wird das nicht in der Dokumentation stehen. Deshalb musst du versuchen nachzuvollziehen, was DU in DEINEM Code falsch gemacht haben könntest.

NACHDEM du Fehler auf deiner Seite ausschließen kannst, solltest du den Code der API anschauen oder einfach mal versuchen, eine Exception abzufangen.
 
Zuletzt bearbeitet:

Kombustor

Redstoneengineer
Registriert
1 Februar 2013
Beiträge
39
Diamanten
0
Kannst du nicht einfach mal das machen, worum man dich bittet?

Im echten Leben suchst du doch auch selbst nach den Ursachen für deine Probleme oder schiebst du es auf die IKEA-Anleitung, wenn irgendwas nicht so funktioniert wie erwartet?

Und wenn dann herauskommt, dass es eine so offensichtliche Blödheit ist, wie ungültige Verbindungsdaten für die Datenbank zu übergeben, wird das nicht in der Dokumentation stehen. Deshalb musst du versuchen nachzuvollziehen, was DU in DEINEM Code falsch gemacht haben könntest.

NACHDEM du Fehler auf deiner Seite ausschließen kannst, solltest du den Code der API anschauen oder einfach mal versuchen, eine Exception abzufangen.
Hi geckocraft,

Ich finde es nicht fair mich als blöd darzustellen, aber nun gut...

So, ich habe die ganze API nun rausgehauen, und nutze JDBC wie folgt:

Code:
	public String user;
	public String pass;
	public String url;

	public void onEnable() {
		getServer().getPluginManager().registerEvents(this, this);

		addDefaults();
		
		
		String database = getConfig().getString("MySQL.database");
		Integer port = getConfig().getInt("MySQL.port");
		String host = getConfig().getString("MySQL.host");
		

		
		user = getConfig().getString("MySQL.user");
		pass = getConfig().getString("MySQL.pass");
		
		url = "jdbc:mysql://"+host+":"+port+"/"+database;
	}

Und dann:

Code:
                      Connection conn = DriverManager.getConnection(url, user, pass);
						Statement statement = conn.createStatement();
						ResultSet res = statement
								.executeQuery("SELECT Points FROM Points WHERE Player = '"
										+ pl.getName() + "';");
						res.next();
usw...

Nun keine NullPointer-Exception mehr, jedoch immer noch:
2013-07-25 17:26:21 [SEVERE] Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.


Aber der MySQL - Server ist online, die Zugangsdaten stimmen auch :/
Kann es sein das eine externe Verbindung durch die Firewall geblockt wird? Ich probiere das System gerade lokal aus!

Grüße Fabian
 

Baba43

Ehem. Teammitglied
Ehem. Teammitglied
Registriert
5 November 2012
Beiträge
869
Diamanten
60
Minecraft
baba43
Hi,

also ich möchte dich nicht als blöd darstellen.. nur als ignorant. Ich möchte nur, dass du weißt, dass es häufiger die Dummheit desjenigen ist, der nicht mit einem Produkt klar kommt, als die des Produktherstellers.

Nach wie vor würde ich empfehlen, zur Sicherheit einfach mal den ConnectionString auszugeben: url
Für mich ist nicht garantiert, dass dort irgendwelche vernünftigen Werte drin stehen.

Natürlich kann es auch daran liegen, dass die Datenbank nicht erreichbar ist.

Auch mal 127.0.0.1 statt localhost versuchen.

/edit
Der letzte Satz ist natürlich Unsinn, wenn du auf eine externe DB zugreifen willst. Du könntest aber zum Spaß mal eine lokale einrichten und schauen, ob dein Plugin dort funktioniert. Dann weißt du, dass es an der Verbindung oder Fehlkonfiguration der externen Datenbank liegt. Es kann ja auch sein, dass die Datenbank keine Zugriffe externer Adressen erlaubt.
 
Zuletzt bearbeitet:

Kombustor

Redstoneengineer
Registriert
1 Februar 2013
Beiträge
39
Diamanten
0
Hi,

also ich möchte dich nicht als blöd darstellen.. nur als ignorant. Ich möchte nur, dass du weißt, dass es häufiger die Dummheit desjenigen ist, der nicht mit einem Produkt klar kommt, als die des Produktherstellers.

Nach wie vor würde ich empfehlen, zur Sicherheit einfach mal den ConnectionString auszugeben: url
Für mich ist nicht garantiert, dass dort irgendwelche vernünftigen Werte drin stehen.

Natürlich kann es auch daran liegen, dass die Firewall nicht erreichbar ist.

Auch mal 127.0.0.1 statt localhost versuchen.

Ich nutze eine externe Datenbank, bei 000webhost.com gehosted, ist also in dem Fall der MySQL-Server mysql6.000webhost.com

Sonst passt auch alles, trotzdem wird keine Verbindung hergestellt, warum? :eek:
Grüße Fabian
 
Oben