2015-08-02 3 views
-1

Я пытаюсь создать денежную систему через mysql. Всякий раз, когда игрок присоединяется к серверу, профиль создается через mysql, и в этом нет никаких недостатков. У меня возникли проблемы с тем, что фактическая система денежных средств поддерживает только mysql. Всякий раз, когда я пытаюсь добавить деньги игроку, он выдает ошибку sql и разбивает этот профиль пользователей mysql.Bukkit MySQL Money System

У меня есть следующие поля в MySQL UUID, имя, биты (деньги), Баны

Вот ошибка

 [14:03:51 INFO]: Crypted lost connection: Disconnected 
[14:03:51 ERROR]: Could not pass event PlayerQuitEvent to KnoxHub v1.0 
org.bukkit.event.EventException 
     at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:310) ~[spigot-1.8.7-R0.1-SNAPSHOT-latest.jar:git-Spigot-f928e7a-e91aed8] 
     at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.8.7-R0.1-SNAPSHOT-latest.jar:git-Spigot-f928e7a-e91aed8] 
     at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [spigot-1.8.7-R0.1-SNAPSHOT-latest.jar:git-Spigot-f928e7a-e91aed8] 
     at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487) [spigot-1.8.7-R0.1-SNAPSHOT-latest.jar:git-Spigot-f928e7a-e91aed8] 
     at net.minecraft.server.v1_8_R3.PlayerList.disconnect(PlayerList.java:346) [spigot-1.8.7-R0.1-SNAPSHOT-latest.jar:git-Spigot-f928e7a-e91aed8] 
     at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:844) [spigot-1.8.7-R0.1-SNAPSHOT-latest.jar:git-Spigot-f928e7a-e91aed8] 
     at net.minecraft.server.v1_8_R3.NetworkManager.l(NetworkManager.java:314) [spigot-1.8.7-R0.1-SNAPSHOT-latest.jar:git-Spigot-f928e7a-e91aed8] 
     at net.minecraft.server.v1_8_R3.ServerConnection.c(ServerConnection.java:145) [spigot-1.8.7-R0.1-SNAPSHOT-latest.jar:git-Spigot-f928e7a-e91aed8] 
     at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:817) [spigot-1.8.7-R0.1-SNAPSHOT-latest.jar:git-Spigot-f928e7a-e91aed8] 
     at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:367) [spigot-1.8.7-R0.1-SNAPSHOT-latest.jar:git-Spigot-f928e7a-e91aed8] 
     at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:657) [spigot-1.8.7-R0.1-SNAPSHOT-latest.jar:git-Spigot-f928e7a-e91aed8] 
     at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:560) [spigot-1.8.7-R0.1-SNAPSHOT-latest.jar:git-Spigot-f928e7a-e91aed8] 
     at java.lang.Thread.run(Unknown Source) [?:1.8.0_51] 
Caused by: java.sql.SQLException: Can not issue SELECT via executeUpdate(). 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) ~[spigot-1.8.7-R0.1-SNAPSHOT-latest.jar:git-Spigot-f928e7a-e91aed8] 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987) ~[spigot-1.8.7-R0.1-SNAPSHOT-latest.jar:git-Spigot-f928e7a-e91aed8] 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982) ~[spigot-1.8.7-R0.1-SNAPSHOT-latest.jar:git-Spigot-f928e7a-e91aed8] 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927) ~[spigot-1.8.7-R0.1-SNAPSHOT-latest.jar:git-Spigot-f928e7a-e91aed8] 
     at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1621) ~[spigot-1.8.7-R0.1-SNAPSHOT-latest.jar:git-Spigot-f928e7a-e91aed8] 
     at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1581) ~[spigot-1.8.7-R0.1-SNAPSHOT-latest.jar:git-Spigot-f928e7a-e91aed8] 
     at crypted.knoxhub.Libraries.MySQL.Database.updateSQL(Database.java:132) ~[?:?] 
     at crypted.knoxhub.Libraries.Economy.Bits.getBits(Bits.java:37) ~[?:?] 
     at crypted.knoxhub.Libraries.Economy.Bits.AddBits(Bits.java:50) ~[?:?] 
     at crypted.knoxhub.Hub.Utilities.CreateUser.onJoin(CreateUser.java:41) ~[?:?] 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_51] 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51] 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51] 
     at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_51] 
     at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.8.7-R0.1-SNAPSHOT-latest.jar:git-Spigot-f928e7a-e91aed8] 
     ... 12 more 

Bits (деньги) Класс

public Bits(Core p, UUID u) 
{ 
    this.u = u; 
    this.plugin = p; 
    this.MySQL = new PlayerSQL(plugin); 
} 


public int getBits() throws Exception 
{ 

    int bits2 = MySQL.sql.updateSQL("SELECT FROM `profiles` WHERE `UUID`= '" + u + "';"); 

    return bits2; 
} 

public void setBits(int amount) throws Exception{ 

    MySQL.sql.updateSQL("UPDATE FROM `profiles` SET `Bits`= '" + amount + "' WHERE `UUID`='" + u + "'"); 

} 

public void AddBits(int amount) throws Exception{ 

    MySQL.sql.updateSQL("UPDATE FROM `profiles` SET `Bits`= '" + getBits() + amount + "' WHERE `UUID`='" + u + "'"); 

} 

public void TakeBits(int amount) throws Exception { 

    MySQL.sql.updateSQL("UPDATE FROM `profiles` SET `Bits`= '" + getBits() + -amount + "' WHERE `UUID`='" + u + "'"); 

} 

Добавление денег на PlayerQuitEvent

@EventHandler 
public void onJoin(PlayerQuitEvent e) throws Exception { 
    Player player = e.getPlayer(); 
    Bits bits = new Bits(plugin, player.getUniqueId()); 
    bits.AddBits(5000); 
    Bukkit.getConsoleSender().sendMessage(ChatColor.GREEN + "Debug"); 

} 
+0

Вы никогда не установить 'и' UUID поле в конструкторе Битов. Вам нужно добавить: this.u = u; – kmecpp

+0

Проблемы с SQL-инъекциями в стороне, sql передает объект как параметр, который является нулевым (UUID), но он должен передавать фактическое значение в любом случае. FROM 'profiles' SET' Bits' = '"+ amount +"' WHERE 'UUID' = '" + u.getId() + "'"). Конструктор бит также никогда не устанавливает объект UUID. – Asura

ответ

0

Похоже, вы забыли установить UUID ˙U поля в ваш класс Биты в результате в NullPointer

public Bits(Core p, UUID u) 
{ 
    this.plugin = p; 
    this.u = u; 
    this.MySQL = new PlayerSQL(plugin); 
} 

Если вы хотите, чтобы предотвратить SQLInjection вы можете использовать PreparedStatement класс: http://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html

EDIT:

Вы обновили вопрос с новой ошибкой, и я думаю, проблема в этом методе:

public int getBits() throws Exception 
{ 

    int bits2 = MySQL.sql.updateSQL("SELECT FROM `profiles` WHERE `UUID`= '" + u + "';"); 

    return bits2; 
} 

Метод updateSQL используется для запуска запроса на обновление и возвращается к указанному количеству строк.

Я думаю, что вы стремитесь:

public int getBits() throws Exception 
{ 

    ResultSet set = MySQL.sql.executeQuery("SELECT bits FROM `profiles` WHERE `UUID`= '" + u + "';"); 

    if(set.next()) 
     return set.getInt("bits"); 

    return 0; 
} 

Я предлагаю вам прочитать документацию Bukkit.

+0

Я уже исправил это, я получил новую ошибку – 2Hash

+0

@ 2Hash Пробовали ли вы прочитать сообщение об ошибке ошибка, которую вы получили? В ней очень четко сказано, что вы делаете неправильно. – yole

+0

@yole, я прочитал сообщение об ошибке Я знал, что происходит, но я действительно не знал, как его решить. – 2Hash

2

сообщение об ошибке говорит

вызвано следующими причинами: java.sql.SQLException: не может выдавать ВЫБРАТЬ через executeUpdate().

Таким образом, проблема заключается в том, что вы не можете использовать ключевое слово SELECT с .executeUpdate. Вам необходимо использовать .executeQuery, или в вашем случае, .execute. Таким образом, ваш метод getBits() должен выглядеть следующим образом

public int getBits() throws Exception{ 

    int bits = MySQL.sql.execute("SELECT FROM `profiles` WHERE `UUID`= '" + u + "';"); 

    return bits; 
} 

Вы также должны смотреть в PreparedStatements. Хотя это не имеет ничего общего с ошибкой, использование пользовательского ввода без использования PreparedStatement может привести к SQL Injection, что позволяет злоумышленнику выполнить любой запрос, который они хотят.

Например, если вы приняли ввод данных пользователем, когда они дали обратную связь на миниигры, например, с помощью запроса

"INSERT INTO `feedback` (id, userid, feedback) VALUES (NULL, " + userid + ", " + feedback + ");" 

Пользователь может просто ввести

«обратной связи» ") ; DROP TABLE `результата воздействия; -

что бы привести два заявления

INSERT INTO `feedback` (id, userid, feedback) VALUES (NULL, 'userid', 'feedback');

DROP TABLE `

результата воздействия