2015-01-02 3 views
-1

기본적으로 플레이어가 mySQL 데이터베이스에 있는지를 확인하고 있지만 오류가 계속 발생하고 있습니다. 나는 그것을하는 방법에 대해 가야할지 모르겠다. Java mySQL 쿼리

(이 모든 bukkit API의 수행, 문제는 그러나 단지 SQL입니다)가 데이터베이스에 존재하는 경우에 플레이어의 로그를 볼 수 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()가 어디에서 디버깅을 위해 호출하는) 경우입니다

편집 :

,536,913,632 java.sql.SQLException의 : (0 1> 매개 변수의 수) 범위를 벗어난 매개 변수 인덱스 (10)
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

는 예외로

잘못된 인한 정확히 말하고있다. 다시는

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 클래스의 의도를 혼합합니다. setString(1, name) 말함으로써

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

, 당신은 "name라는 필드에 무엇이든에 쿼리의 첫 번째 교체 설정"을 말하고있다. 귀하의 질의에는 대체물이 없으므로 이에 대한 불만이 있습니다. (매개 변수 색인이 범위를 벗어남). 매개 변수가 0이고 매개 변수가 있음을 알 수 있습니다.

대신 시도 (주, 나 또한 쿼리의 마지막에 세미콜론을 제거했습니다) :

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

이이 모든 이름 인수를 설정하지 않는 것입니다 해결할 수있는 또 다른 방법은,하지만하여 가능성이 오염 된 값을 수동으로 삽입하면 SQL 인젝션 공격까지 스스로 열리게됩니다. 위에 설명 된 ? 교체품을 붙이십시오.