Du bist nicht angemeldet.

1

Mittwoch, 9. Mai 2012, 08:14

MySQL Eintrag 'hza' replace statt CONCAT?

Hallo,

ich habe folgendes Problem.

Ich habe die Halbe Nacht mit einem Kumpel versucht eine HZA Funktion einzubauen, die über dem Chat ausführbar ist.
Soweit so gut, hat auch geklappt! :)

Jetzt ist aber das Problem, dass wenn wir einen Eintrag in der DB haben und einen neuen hinzufügen bzw den alten ersetzen wollen das er diesen nur vorne ransetz.

Wie kann man das PRoblem lösen das durch den HZA-Chat Befehl der alte Eintrag durch den neuen Befehl ersetzen tut, statt hinzuzufügen und vor dem alten Wert setzt?
Ich habe bei google versucht das Problem zu finden, und habe versucht in dem HZA Code, den ich umgeschrieben habe, das CONCAT durch replace zu ersetzen, NetBeans zeigt auch keine Fehler an, der Chat startet auch, beim ausführen der Funktion kommt jedoch ein MySQL Fehler undd ie Funktion geht nicht, Mein Anliegen ist also folgendes, wie ändere ich meinen Code den ich nun zeigen werde, so um dass der DB Eintrag überschrieben wird, und (b) was bedeutet eigentlich CONCAT?

Für Antworten danke ich schonmal im Voraus!


Hier der Code:


Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
} else if(cmd.startsWith("hza")) {
        	// Start der Funktion
        	System.out.println(" CMD");
        	if(client.getRank() > 9) {
            	// WQir splitten nun nach ":"
            	String[] parameter  = arg.split(":");
            	System.out.println("COUNT " + parameter.length);
            	if(parameter.length != 2) {
                	client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen: /hza [Nick]:[Channel]");
            	} else {
                	String nickname 	= parameter[0];
                	String comment  	= parameter[1];

                	// Schritt 1: Nickname überprüfen:
                	PoolConnection pcon 	= ConnectionPool.getConnection();
                	PreparedStatement ps	= null;
                	String temp_nick    	= null;

                	try {
                    	Connection con  = pcon.connect();
                    	Statement stmt  = con.createStatement();
                    	ResultSet rs	= stmt.executeQuery("SELECT `name` FROM `accounts` WHERE `name`='" + nickname +  "' LIMIT 1");

                    	while(rs.next()) {
                        	temp_nick = rs.getString("name");
                        	break;
                    	}
                	} catch(SQLException e) {
                    	if(ps != null) {
                        	try {
                            	ps.close();
                        	} catch (SQLException ex) {
                            	/* Do Nothing */
                        	}
                    	}

                    	pcon.close();
                	}
                	
               	
                	
                	if(temp_nick == null) {
                    	client.sendButlerMessage(channel.getName(), "Der angegebene Nickname existiert nicht.");
                	} else {
                    	// Schritt 2: Age eintragen wenn Age-text valide
                    	// Hier könnten noch weitere überprüfungen stattfinden(?)
                    	if(comment.length() <= 1) {
                        	client.sendButlerMessage(channel.getName(), "Bitte Channelnamen eingeben!");
                    	} else {

                        	try {
                            	Connection con = pcon.connect();
                            	ps          	= con.prepareStatement("UPDATE `accounts` SET `hza`=CONCAT(?, `hza`) WHERE `name`=? LIMIT 1");
                            	ps.setString(1, comment);
                            	ps.setString(2, temp_nick);
                            	ps.executeUpdate();
                            	//ps.executeQuery();
                            	client.sendButlerMessage(channel.getName(), "°>"+ temp_nick + "|/w "<° hat soeben die von dir gesetzten Channel als HZA/HZE erhalten.");
                        	} catch(SQLException e2) {
                            	e2.printStackTrace();
                        	} finally {
                            	if(ps != null) {
                                	try {
                                    	ps.close();
                                	} catch(SQLException e3) {
                                    	/* Do Nothing */
                                	}
                            	}

                            	pcon.close();
                        	}
                        	
                   	
                    	}
                	}
            	}
        	} else {
            	// Wenn keine Adminrechte, dann info an den Nutzer
            	client.sendButlerMessage(channel.getName(), "Du hast nicht genügend Rechte um diesen Befehl zu benutzen.");
            	System.out.println("Comment ERROR: Access denied");
        	}
        	// ende 


Desweiteren hab ich die Frage warum die Bearbeitung bzw das setzen durch die HZA Funktion nur direkt sichtbar ist, wenn der User Offline ist?.. Bei User die Online sind, wird der Eintrag erst angezeigt im Profile wenn ein Serverneustart erfolgt ist, bei offline Nicks jedoch sofort ohne Neustart oder sonstiges.

2

Mittwoch, 9. Mai 2012, 09:37

Durch das Concat erweiterst du, bzw hängst nur an.
also nur hza=?

Aber es ist sowieso ein Fehler im Design. Der HZA gehört zum Channel und nicht zum User. Also musst du ihn wenn schon in die CHannel-Tabelle setzen
Ausserdem ist HZA<->Channel eine m zu n Beziehung. Übersetzt: 1 User kann mehrere HZA-Channel haben, ein Channel kann mehrere Channel haben.
Also setzt du so oder so eine neue Tabelle.
Die braucht 1 Primärschlüssel die zeitgleich ach Foreignkeys sind aus dem Channel und dem User.



Zu den Online/Offline Usern, da musst du die Infos vom User neu laden, da er die meines wissens cached.


Gruß Gnome^^

3

Mittwoch, 9. Mai 2012, 21:40

CONCAT = Anhängen
REPLACE = Ersetzen

Beispiel:

MySQL-Abfrage(n)

1
2
-- Neu Anhängen
UPDATE `usertable` SET `hzafeld`=CONCAT(`hzafeld`, 'NeuerAnhang') WHERE `Neckname`='DeinNickname' LIMIT 1


MySQL-Abfrage(n)

1
2
-- Feld Replacen
UPDATE `usertable` SET `hzafeld`=REPLACE(`hzafeld`, 'AlterAnhang', 'NeuerAnhang') WHERE `Neckname`='DeinNickname' LIMIT 1


Nicht getestet, sollte aber so funktionieren.
Natürlich müsstest du die Statements noch nach deiner Tabelle anpassen.

Wegen dem Update:
Natürlich (Sofern du sowas setzt) MUSS der Datensatz auch intern in Java geupdated werden, da diese "Statistiken" nur beim Ein/Ausloggen bzw erstarrten neu geladen werden (siehe loadStats/saveStats)

4

Donnerstag, 10. Mai 2012, 02:51

Hi, irgendwie habe ich das mit 'AlterAnhang', 'NeuerAnhang' nicht verstanden...


Ich habe diese Zeile :

MySQL-Abfrage(n)

1
("UPDATE `accounts` SET `alter`=CONCAT(?, `alter`) WHERE `name`=? LIMIT 1")



jetzt durch diese Zeile ersetzt:

MySQL-Abfrage(n)

1
("UPDATE `accounts` SET `alter`=REPLACE(`alter`) WHERE `name`=? LIMIT 1")



Beim Ausführen des Befehls kommt in der COnsole folgender Fehler:



MySQL-Abfrage(n)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
D:\xampp\htdocs\Knuddels Chat\Knuddels Chat>java -cp dist\bananachat.jar;lib\* k
nuddels.Server 2710
Lade den Butler
Lade die Channel styles
Lade alle Channels
Lade die Smileys
online auf port 2710
 CMD
COUNT 2
java.sql.SQLException: Parameter index out of range (2 > number of parameters, w
hich is 1).
    	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
    	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
    	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
    	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
    	at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3
717)
    	at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3
701)
    	at com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:455
2)
    	at knuddels.CommandParser.parse(CommandParser.java:196)
    	at handler.ChatHandler.handle(ChatHandler.java:50)
    	at knuddels.SessionHandler.run(SessionHandler.java:74)

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »CokaColaBoy« (10. Mai 2012, 03:44)


5

Donnerstag, 10. Mai 2012, 07:35

Was gibts da dran nicht zu verstehen, auch mal google zu nutzen?

Der Fehler besagt, dass du NUR 1 parameter nutzt, es aber erforderlich ist, X Parameter zu nutzen.

Was verstehst du unter REPLACE nicht?!

MySQL-Abfrage(n)

1
`alter`=REPLACE(`alter`, '19', '20')


In diesem Beispiel wird "alter" durch 20 ersetzt, wenn das Alter "19" ist.

6

Donnerstag, 10. Mai 2012, 09:02

Also müsste die abfrage dann so aussehen:

MySQL-Abfrage(n)

1
`alter`=REPLACE(`alter`, '%s', '%s')
??

Weil ich kann ja keinen festen Alten und festen neuen Wert eintragen weil es ja von user zu user unterschiedlich ist wenn der Befehl im Chat /age Nickname: Alter definiert wird..

Es kann ja einer 20 sein und der soll auf 22 geändert werden mit /age Nick XYZ: 22
und wer anderes könnte ja 15 sein und soll auf 19 gesetzt werden zum beispiel?

7

Donnerstag, 10. Mai 2012, 09:14

Man sollt auch schon mal ein wenig mitdenken?

Ich habe dir Beispiele genannt, wie es funktioniert, DU musst dies nun fuer DEINE ANSPRUECHE anpassen.

Wie sind denn die ganzen anderen Datenbank-Abfragen im Chatserver gestaltet? Schau es dir an, kopiere eines UND PASSE es an das neue Statement an.

Solche wie dich hab ich ja nicht oft, aber man sollte schon mal ein wenig mitdenken. Natuerlich ist der BC zu lernzwecken gedacht, man sollte aber schauen dass man schon ein wenig ahnung hat. Wenn nicht, mach ne Ausbildung als FaAe, nen Fernstudium als Java-Programmierer oder lass es einfach sein.

Das was du vor hast, hat auch eig. nix mit "programmieren" zu tun - Das ist jediglich copy&paste mit eine kleine abaenderung.

8

Donnerstag, 10. Mai 2012, 11:35

Ich bin ziemlich enttäuscht dass hier niemand scheinbar richtig helfen will.
Nach langen kopfzerbrechen habe ich mich an die savestats Methode orientiert und das CONCAT durch ? ersetzt.

MySQL-Abfrage(n)

1
"UPDATE `accounts` SET `hza`= ?  WHERE `name`=? LIMIT 1"


also einfach CONCAT weg und ? dranne.



So einfach kann es gehen, hätte man einem auch ruhig sagen können.
Finde ich schon fast ne Sauerei!

Localhost

Ehemaliger Supporter

Beiträge: 345

Wohnort: 127.0.0.1

  • Private Nachricht senden

9

Donnerstag, 10. Mai 2012, 12:49

Ich find's schon "fast ne Sauerei" wie du dich hier mit dem Wort replace rumschlägst obwohl das null mit deinem eigentlichen Problem zu tun hat.

Geschlossen.
No support via message.

"Der gute Programmierer ist nicht der, der keine Fehler macht, sondern der, der seine Fehler rasch findet und behebt."