Jump to content

Brauche Hilfe mit MySQL


Joey
 Share

Recommended Posts

Naja, leider habe ich die Überschrift unpassend gewählt. Habe nämlich eins im Netzs gefunden und habe aber ein Problem. Ich habe Verbindung aufgebaut und alles hat soweit geklappt.


	public static void Create(String name){

		mysql.Update("INSERT INTO test_db_test(name,test1,test2,test3,test4) VALUES ("+name+",0, 0,0,0)");

	}

Nun zu meiner Frage. Wie kann ich machen, dass z.B. bei einem OnPlayerJoinEvent die public static void Create ausgeführt wird, aber nur dann wenn der name noch nicht in der Tabelle test_db_test vorhanden ist ?

PS: wäre es evtl möglich den Beitrag umzubennen ?? Ich weiß nicht ob ich das kann bzw. wie das geht !

Mfg,

Joey

Edited by Joey
Link to comment
Share on other sites

Wie soll der Titel denn heißen? Und zu deiner Frage programmier ich dir eben was.

Liebe Grüße,

Baustein

EDIT: Also erst einmal empfehle ich dir, diese formschöne SQL-Klasse reinzukopieren, die du auch immer nutzen kannst. Wenn sie dir gefällt, dann bedank dich doch ne Runde bei Arcalio, dem hab ich sie nämlich zu verdanken. Da stehen so lustige Methoden wie connect() und close() drin.

Hier ist ihr Code:


public class SQL {


	public static Connection con;


	public static void connect(String host, String db, String user, String pass, String port) {

		try {

			con = DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + db,user,pass);

			System.out.println("[WAVEDEFENSE] Verbindung zu MySQL-DB hergestellt.");

		} catch (SQLException e) {

			e.printStackTrace();

		}

	}


	public static void close(){

		if (con!=null){

			try{

				con.close();

				System.out.println("[WAVEDEFENSE] Verbindung zu MySQL-DB geschlossen.");

			}catch (SQLException e){

				e.printStackTrace();

			}

		}

	}


	public static void update(String qry){

		try{

			Statement stmt = con.createStatement();

			stmt.executeUpdate(qry);

		}catch (SQLException e){

			e.printStackTrace();

		}

	}


	public static ResultSet query(String qry){

		ResultSet rs = null;

		try{

			Statement stmt = con.createStatement();

			rs = stmt.executeQuery(qry);

		}catch (SQLException e){

			e.printStackTrace();

		}

		return rs;

	}

}

Und dann kannst du etwas Solches machen:


	@EventHandler

	public void onJoin(PlayerJoinEvent e) throws SQLException {

		String name = null;


		ResultSet rs = SQL.query("SELECT * FROM test_db_test WHERE name='" + name + "';");

		if (!rs.next()) {

			Create(name);

		}

	}

Ein ResultSet ist das Ergebnis einer Abfrage, in diesem Beispiel ist das das Ergebnis der Abfrage, die dir die Einträge gibt, wo `name`='name' ist. Den String musst du natürlich noch ersetzen, keine Ahnung was du da drin haben willst aber null ist es bestimmt nicht ^^

rs.next() gibt jetzt einen Boolean zurück. Wenn ein Eintrag vorhanden ist, so ist der boolean true, und wenn keine da ist false. Das Ausrufezeichen invertiert diese Abfrage. Der Teil in den geschweiften Klammern wird also nur ausgeführt, wenn rs.next() false zurückgibt, und somit kein Wert vorhanden ist.

Zuletzt gibt es nur noch eines zu sagen, nämlich dass Methodennamen für gewöhnlich mit einem Kleinbuchstaben beginnen ;D

Ich hoffe, ich konnte dir helfen, wenn ja, dann lass mir doch bitte nen Like da.

Liebe Grüße,

Baustein

Link to comment
Share on other sites

Erstmal ein riesen großen dankeschön an dich und @Arcalio , jedoch wird mir nun das hier rot angestrichen :


mysql.connect(); //die class heiste mysql nicht sql habe das aber schon geändert !

Mfg,

Joey

Link to comment
Share on other sites

Habe ich alles gemacht und ich bekomme auch die meldung, dass die Mysql verbindung hergestellt wurde. doch sobal ich Connecte bekomme ich folgenden Error:


[19:12:16] [Server thread/WARN]: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column '_Jo3y_' in 'field list'

Mfg,

Joey

Edited by Joey
Link to comment
Share on other sites

Ja, weil du den String name noch nichts zuteilst.

In deinem Beispiel hattest du


mysql.Update("INSERT INTO test_db_test(name,test1,test2,test3,test4) VALUES ("+name+",0, 0,0,0)");

und ich habe name einfach als Variable des Typs String genutzt. Natürlich muss in name auch noch was drinstehen, null ist kein String.

Liebe Grüße,

Baustein

Link to comment
Share on other sites

Um nach der Exception zu urteilen, versuchst du, auf die Spalte _jo3y_ zuzugreifen. Ich gehe mal davon aus, dass das aber nur ein Eintrag ist. Überprüfe da nochmal deine SQL-Abfrage und schreibe sie sonst mal hier...

Link to comment
Share on other sites

Ok also dass ist halt die Mehtode create :


public void Create(String name){




		mysql.update("INSERT INTO ec_jump_users(name,jpoints,ljump,mjumps,sjumps) VALUES ("+name+",0,0,0,0)");

	}

und dass die abfrage :


@EventHandler

	public void onJoin(PlayerJoinEvent e) throws SQLException {

		String name = e.getPlayer().getName();


		ResultSet rs = mysql.query("SELECT * FROM ec_jump_users WHERE name='" + name + "';");

		if (!rs.next()) {

			Create(name);

		}

	}

Mfg,

Joey

Link to comment
Share on other sites

public void Create(String name){

mysql.update("INSERT INTO ec_jump_users(name,jpoints,ljump,mjumps,sjumps) VALUES (name,0,0,0,0)");

}

Du hast als Namen immer +name+ angegeben, klar dass der joey nicht findet ;)

Um sowas herauszufinden ist es auch oft gut, in PHPMyAdmin die Datenbank zu beobachten.

Liebe Grüße,

Baustein

Link to comment
Share on other sites

Danke, jetzt gibt es keine Error Meldung und es erstellt sich auch die Spalte in der Datenbank. jedoch ist der Wert bei name leer :/

Ps: Ich weiß das ich nerve, aber irgendwie möchte ich das es endlich klappt sry :/

Mfg,

Joey

Link to comment
Share on other sites

Ich habe mal die mehtoe Create komplett rausgenommen und habe es direkt eingetragen in das Event :


	@EventHandler

	public void onJoin(PlayerJoinEvent e) throws SQLException {

		String name = e.getPlayer().getName();


		ResultSet rs = mysql.query("SELECT * FROM ec_jump_users WHERE name='"+ name + "';");

		if (!rs.next()) {


			mysql.update("INSERT INTO ec_jump_users(name,jpoints,ljump,mjumps,sjumps) VALUES (name,0,0,0,0)");


		}



	}

jedoch hatte ich den beschrieben code davor und danach.

Mfg,

Joey

Link to comment
Share on other sites

Ich habe mir den String name mal ausgeben lassen und habe es mit mehreren Acc getestet, es ist immer der richtige Name, er wird nur nicht in der Datenbank gesetzt. Alle anderen Werte werden ja gesetzt nur nicht der Name :/

Mfg,

Joey

Link to comment
Share on other sites

Heyho,

ganz einfach. Ich beziehe mich mal auf den ersten Post:

public static void Create(String name){

mysql.Update("INSERT INTO test_db_test(name,test1,test2,test3,test4) VALUES ("+name+",0, 0,0,0)");

}

muss natürlich


public static void Create(String name){

mysql.Update("INSERT INTO test_db_test(name,test1,test2,test3,test4) VALUES ('"+name+"',0, 0,0,0)");

}

lauten.

:)

LG,

Manu

Link to comment
Share on other sites

Ok es funktioniert Vielen Dank :D

Aber das stellt mich vor mein nächstes Problem. Wie gesagt ich habe vorher nochnie mit Mysql gearbeitet. Wie kann ich in der Tabelle mit einem bestimmten Namen Daten auslesen und bearbeiten ??

Mfg,

Joey

Link to comment
Share on other sites

Wenn ein User z.B diese Event auslöst


if(plugin.test.contains(p.getName())){

      if(b.getType() == Material.ENDER_STONE) {

      }

soll z.B in der Tabelle mit seinem Namen. der Wert von Test1 + 1 gerechnet werden.

Mein Problem ist nun ich kann ja den Wert mit


ResultSet test1 = SQL.query("SELECT * FROM test_db_test WHERE Test1='" + Test1 + "';");

auslesen, aber wie kann ich es machen, dass der Wert von dem Spieler geändert wird der in dem String name ist und vorallem wie kann ich den Wert am besten plus 1 setzen und wieder abspeichern ??

Mfg,

Joey

Link to comment
Share on other sites

Heyho,

gibt 2 Möglichkeiten (Achtung, Pseudocode):

1)

Die Zeile erstmal auslesen, den Wert inkrementieren und zurückschreiben


SQL.query("SELECT * FROM test_db_test WHERE name='" + name + "';");

// <-- hier Test1 inkrementieren

SQL.query("UPDATE test_db_test SET Test1=" + Test1 + " WHERE name='" + name + "'");

2)

Oder einfach die Test1-Zelle mit einem Query inkrementieren


SQL.query("UPDATE test_db_test SET Test1=Test1+1 WHERE name='" + name + "'");
Edited by kiwi
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...
B
B