2015-04-26 3 views
0

Я пытаюсь проверить, если игрок уже находится в базе данных с этим кодом:MySQL - Объект не null?

Statement sql = mySql.getConnection().createStatement(); 
ResultSet check = sql.executeQuery("SELECT * FROM `playerinfo` WHERE Username='" + player.getName() + "';"); 
System.out.println(check.toString()); 
if(check != null) { 
    System.out.println("2"); 
    Bukkit.getConsoleSender().sendMessage(ChatColor.RED + "Player already in database"); 
    check.close(); 
    sql.close(); 
    return; 
} 

Я проверил, но ничего не находится в базе данных, и это говорит о том, что игрок уже содержит в базе данных Извините за плохой english

+3

Первое, что нужно сделать: начать использовать параметризованный SQL вместо [SQL Injection Attack] (HTTP: // bobby-tables.com). Уязвимость у вас есть сейчас. –

+0

'check' не будет' null', потому что вы назначаете ему значение. Вместо этого проверьте содержимое набора результатов, например. с 'check.next()'. –

+0

Сколько строк в вашем 'check' ResultSet? Вы не проверяете это. –

ответ

1

Некоторые соображения:

При проверке, содержит ли база данных определенное значение, это хорошая практика, чтобы сделать это, используя запрос, который возвращает одно значение (а не SELECT *, который возвращает все столбцы всех строк, которые соответствуют WHERE состояние). Вы можете сделать это, например. путем выбора одного проверки флага (SELECT 1) с пунктом строки ограничения (LIMIT 1):

SELECT 1 FROM playerinfo WHERE Username = ? LIMIT 1 

Этот запрос гарантированно возвращать только одну строку (с одной колонке, «1»), если игрок с данное имя существует, или нет строк, если нет игроков с указанным именем.

Как указывали другие, когда вы вводите параметры в запрос, вы должны использовать PreparedStatement вместо простого оператора с конкатенированными входами. Таким образом, вы можете избежать SQL-инъекции, и база данных также может повторно использовать/кэшировать запрос (или курсор) внутренне.

И, наконец, вы должны закрыть ресурсы, которые используете, даже если во время выполнения выдается Exception. Это лучше всего сделать в предложении finally, или если вы используете Java 7 или более позднюю версию, используя try-with-resources statement.

С этими вещами в виду, повторно написать свой код может выглядеть следующим образом:

PreparedStatement ps = null; 
try { 
    ps = mySQL.getConnection()   
     .prepareStatement("SELECT 1 FROM playerinfo WHERE Username = ? LIMIT 1"); 
    ps.setString(1, player.getName()); 
    ResultSet rs = ps.executeQuery(); 

    // the first invocation of rs.next() returns true if 
    // there are rows in the result set, or false if no rows were found 
    if (rs.next()) { 
     System.out.println("2"); 
     Bukkit.getConsoleSender().sendMessage(ChatColor.RED 
      + "Player already in database"); 
    }   
    rs.close(); 
} finally { 
    if (ps != null) { 
     ps.close(); 
    } 
} 
0

Я думаю, вместо проверки, является ли ResultSet нулевым или нет, вы должны проверить, содержит ли ResultSet какую-либо строку или нет.

Кроме того, используйте PreparedStatements.

Смежные вопросы