2015-01-02 35 views
-1

基本上我只是檢查一個球員是否存在於mySQL數據庫中,但它一直拋出錯誤等。我不知道如何去做。 (這是在bukkit API的所有做,問題是雖然只是SQL)Java mySQL查詢

當它的玩家登錄會調用databaseFindPlayer方法,看看他們是否在數據庫中存在

所有我需要看到是,如果玩家在數據庫中存在或不

@EventHandler 
    public void onPlayerLogin(PlayerJoinEvent e) throws SQLException { 
     getLogger().info("Player joining.... + TEST"); 
     if (databaseFindPlayer(e.getPlayer().getName()) == false) { 
      getLogger().info("Player does not have data file.. Generating one now"); 
      databaseCreatePlayer(e.getPlayer().getName()); 
      databaseFindPlayer(e.getPlayer().getName()); //For debugging 
     } 
    } 





    public boolean databaseFindPlayer(String name) throws SQLException { 
      getLogger().info("finding players"); 
      PreparedStatement preparedStatement = c.prepareStatement("show columns from players where field = '" + name + "';"); 
      preparedStatement.setString(1, name); 

      ResultSet resultSet = preparedStatement.executeQuery(); 

      if (resultSet.next()) { 
       System.out.println("Player exists!"); 
       return true; 
      } else { 
       System.out.println("Player doesn't exist!"); 
       return false; 
      } 


    } 

(所有getLogger()調用其中用於調試)

編輯:

Error message 
[18:14:17 ERROR]: Could not pass event PlayerJoinEvent to CustomLeaderboard v0.1 

org.bukkit.event.EventException 
     at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja 
va:294) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
     at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.jav 
a:62) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
     at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.j 
ava:501) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
     at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.j 
ava:486) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
     at net.minecraft.server.v1_7_R4.PlayerList.c(PlayerList.java:251) [craft 
bukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
     at net.minecraft.server.v1_7_R4.PlayerList.a(PlayerList.java:138) [craft 
bukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
     at net.minecraft.server.v1_7_R4.LoginListener.c(LoginListener.java:76) [ 
craftbukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
     at net.minecraft.server.v1_7_R4.LoginListener.a(LoginListener.java:42) [ 
craftbukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
     at net.minecraft.server.v1_7_R4.NetworkManager.a(NetworkManager.java:160 
) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
     at net.minecraft.server.v1_7_R4.ServerConnection.c(SourceFile:134) [craf 
tbukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
     at net.minecraft.server.v1_7_R4.MinecraftServer.v(MinecraftServer.java:6 
67) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
     at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:2 
58) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
     at net.minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:5 
58) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
     at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java 
:469) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
     at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:6 
28) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
Caused by: java.sql.SQLException: Parameter index out of range (1 > number of pa 
rameters, which is 0). 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) ~[craf 
tbukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987) ~[craft 
bukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982) ~[craft 
bukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927) ~[craft 
bukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
     at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3 
709) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
     at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3 
693) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
     at com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:454 
4) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
     at com.mcaletheia.customLeaderboard.CustomLeaderboard.databaseFindPlayer 
(CustomLeaderboard.java:88) ~[?:?] 
     at com.mcaletheia.customLeaderboard.CustomLeaderboard.onPlayerLogin(Cust 
omLeaderboard.java:69) ~[?:?] 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0 
_25] 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0 
_25] 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1 
.8.0_25] 
     at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_25] 
     at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja 
va:292) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.2-24-g07d4558-b3116jnks] 
     ... 14 more 

回答

0

例外是告訴具體的錯誤

所致:java.sql.SQLException中:參數索引超出範圍(1>參數的數量,這是0)。

以回頭一看您聲明使用

PreparedStatement preparedStatement = c.prepareStatement("show columns from players where field = '" + name + "';"); 
preparedStatement.setString(1, name); 

但是你沒有提供參數,可以綁定自己的價值

取而代之的是語句的代碼,它應該是

PreparedStatement preparedStatement = c.prepareStatement("show columns from players where field = ?"); 
preparedStatement.setString(1, name); 

請參閱Using Prepared Statements瞭解更多詳情

+0

所以,只需要清楚,表示SQL中傳遞給名稱的變量? – Achilles

+0

是的,但更像是一個參數,就像一個方法方法一樣,'?'定義了一個使用'set'方法提供的參數的異常,所以需要按照正確的順序來設置它們;) – MadProgrammer

+0

一個新問題,當一個玩家登錄到服務器但已經在數據庫中佔有一席之地時,它仍然返回false並生成另一個。 – Achilles

0

您在這裏混合了PreparedStatement課程的意圖。

PreparedStatement preparedStatement = c.prepareStatement("show columns from players where field = '" + name + "';"); 
preparedStatement.setString(1, name); 

按說setString(1, name),你說的「設置查詢第一置換來無論是在叫name領域」。由於您的查詢沒有任何替換,它正在抱怨。 (參數索引超出範圍)。它知道你有零參數,你告訴它你有一個參數。

試試這個(注意,我也去掉了分號在您的查詢的末尾):

PreparedStatement preparedStatement = c.prepareStatement("show columns from players where field = ?"); 
preparedStatement.setString(1, name); 

你能解決這個問題是不設置名稱參數在所有的另一種方式,而是通過插入一個可能受污染的值手動你打開自己的SQL注入攻擊。堅持以上概述的?替換。