2015-12-09 5 views
1
ResultSet rs = stm.executeQuery("SELECT count(*) FROM `hs` WHERE `username` ='"+c.playerName+"' LIMIT 1"); 
int rows = 0; 

try 
{ 
    rs.last(); 
    rows = rs.getRow(); 
    rs.beforeFirst(); 
} 
catch(Exception ex) 
{ 
    ex.printStackTrace(); 
    return false; 
} 

if(rows > 0) 
{ 
    query("UPDATE `hs` SET `overall_lvl` = '"+overallLVL+"',`overall_xp` = '"+overallXP+"',`attack_lvl` = '"+c.playerLevel[0]+"',`attack_xp` = '"+c.playerXP[0]+"',`defence_lvl` = '"+c.playerLevel[1]+"',`defence_xp` = '"+c.playerXP[1]+"',`strength_lvl` = '"+c.playerLevel[2]+"',`strength_xp` = '"+c.playerXP[2]+"',`ranged_lvl` = '"+c.playerLevel[3]+"',`ranged_xp` = '"+c.playerXP[3]+"',`prayer_lvl` = '"+c.playerLevel[4]+"',`prayer_xp` = '"+c.playerXP[4]+"',`magic_lvl` = '"+c.playerLevel[5]+"',`magic_xp` = '"+c.playerXP[5]+"',`cooking_lvl` = '"+c.playerLevel[6]+"',`cooking_xp` = '"+c.playerXP[6]+"',`woodcutting_lvl` = '"+c.playerLevel[7]+"',`woodcutting_xp` = '"+c.playerXP[7]+"',`fletching_lvl` = '"+c.playerLevel[8]+"',`fletching_xp` = '"+c.playerXP[8]+"',`fishing_lvl` = '"+c.playerLevel[9]+"',`fishing_xp` = '"+c.playerXP[9]+"',`firemaking_lvl` = '"+c.playerLevel[10]+"',`firemaking_xp` = '"+c.playerXP[10]+"',`crafting_lvl` = '"+c.playerLevel[11]+"',`crafting_xp` = '"+c.playerXP[11]+"',`smithing_lvl` = '"+c.playerLevel[12]+"',`smithing_xp` = '"+c.playerXP[12]+"',`mining_lvl` = '"+c.playerLevel[13]+"',`mining_xp` = '"+c.playerXP[13]+"',`herblore_lvl` = '"+c.playerLevel[14]+"',`herblore_xp` = '"+c.playerXP[14]+"',`agility_lvl` = '"+c.playerLevel[15]+"',`agility_xp` = '"+c.playerXP[15]+"',`thieving_lvl` = '"+c.playerLevel[16]+"',`thieving_xp` = '"+c.playerXP[16]+"',`slayer_lvl` = '"+c.playerLevel[17]+"',`slayer_xp` = '"+c.playerXP[17]+"',`farming_lvl` = '"+c.playerLevel[18]+"',`farming_xp` = '"+c.playerXP[18]+"',`runecrafting_lvl` = '"+c.playerLevel[19]+"',`runecrafting_xp` = '"+c.playerXP[19]+"',WHERE `username` = '"+c.playerName+"'"); 
} 
else 
{ 
    query("INSERT INTO `hs` SET `username` = '"+c.playerName+"', `overall_lvl` = '"+overallLVL+"',`overall_xp` = '"+overallXP+"',`attack_lvl` = '"+c.playerLevel[0]+"',`attack_xp` = '"+c.playerXP[0]+"',`defence_lvl` = '"+c.playerLevel[1]+"',`defence_xp` = '"+c.playerXP[1]+"',`strength_lvl` = '"+c.playerLevel[2]+"',`strength_xp` = '"+c.playerXP[2]+"',`ranged_lvl` = '"+c.playerLevel[3]+"',`ranged_xp` = '"+c.playerXP[3]+"',`prayer_lvl` = '"+c.playerLevel[4]+"',`prayer_xp` = '"+c.playerXP[4]+"',`magic_lvl` = '"+c.playerLevel[5]+"',`magic_xp` = '"+c.playerXP[5]+"',`cooking_lvl` = '"+c.playerLevel[6]+"',`cooking_xp` = '"+c.playerXP[6]+"',`woodcutting_lvl` = '"+c.playerLevel[7]+"',`woodcutting_xp` = '"+c.playerXP[7]+"',`fletching_lvl` = '"+c.playerLevel[8]+"',`fletching_xp` = '"+c.playerXP[8]+"',`fishing_lvl` = '"+c.playerLevel[9]+"',`fishing_xp` = '"+c.playerXP[9]+"',`firemaking_lvl` = '"+c.playerLevel[10]+"',`firemaking_xp` = '"+c.playerXP[10]+"',`crafting_lvl` = '"+c.playerLevel[11]+"',`crafting_xp` = '"+c.playerXP[11]+"',`smithing_lvl` = '"+c.playerLevel[12]+"',`smithing_xp` = '"+c.playerXP[12]+"',`mining_lvl` = '"+c.playerLevel[13]+"',`mining_xp` = '"+c.playerXP[13]+"',`herblore_lvl` = '"+c.playerLevel[14]+"',`herblore_xp` = '"+c.playerXP[14]+"',`agility_lvl` = '"+c.playerLevel[15]+"',`agility_xp` = '"+c.playerXP[15]+"',`thieving_lvl` = '"+c.playerLevel[16]+"',`thieving_xp` = '"+c.playerXP[16]+"',`slayer_lvl` = '"+c.playerLevel[17]+"',`slayer_xp` = '"+c.playerXP[17]+"',`farming_lvl` = '"+c.playerLevel[18]+"',`farming_xp` = '"+c.playerXP[18]+"',`runecrafting_lvl` = '"+c.playerLevel[19]+"',`runecrafting_xp` = '"+c.playerXP[19]+"'"); 

} 

Когда я запустил это, он выполнит только вставку, а при втором запуске она не будет выполняться снова. Я считаю, что это связано с тем, что строки не превращаются в int. Что я могу сделать, чтобы правильно настроить это?Установка значения SQL как переменной в java

+2

Пожалуйста, узнайте, как использовать параметры, не используйте конкатенацию строк из-за https://en.wikipedia.org/wiki/SQL_injection – Betlista

ответ

0

Выбирать запрос счет всегда возвращает 1 строку.

Вам нужно получить значение счета и проверить, установлено ли это значение> 0 или нет.

Правильный код должен быть похож на следующее:

long rows = 0; 
try { 
    if (rs.next()) { 
     rows = rs.getLong(1); 
    } 
    if (rows > 0) { 
     // Query for update 
    } else { 
     // Query for insert 
    } 
    .... 

Дополнительный совет: не использовать Statement. Используйте вместо этого PreparedStament, он решает проблемы, связанные с SQL Injection и проще читать с точки программиста зрения

+0

Так что я предполагаю, что использование 'getRow()' является ошибкой здесь? –

+0

Да, извините, он должен быть длинным, с соответствующим методом getLong (1) –

1

не знаю, почему вы делаете last() и getRow() там - «по умолчанию» способ получить один и только результат от вашего COUNT (*) будет выглядеть так:

int rows = 0; 
try { 
    //Check if there is a row - the if you could leave out in this case. 
    if(rs.next()) { 
    //Get the int as position 1 in the result - that's your count(*) 
    rows = rs.getInt(1); 
    } 

Просьба также рассмотреть закрытия свои Statement с и ResultSet с. В противном случае вы создаете утечки ресурсов.

Также вы должны зарегистрироваться в PreparedStatement и использовать его во избежание внедрения SQL-кода в ваш код.

0

Я предлагаю изменить запрос

SELECT count(*) cnt FROM 

, а затем использовать

rs.getInt("cnt"); // do something 
2

Ваш код должен быть: (!)

int rows; // No need to initialize 
try (PreparedStatement stmt = conn.prepareStatement("SELECT count(*)" + 
                " FROM `hs`" + 
                " WHERE `username` = ?")) { // No need for LIMIT 1 
    stmt.setString(1, c.playerName); // This prevents syntax errors and SQL Injection issues 
    try (ResultSet rs = stmt.executeQuery()) { 
     rs.next(); // SELECT count(*) always returns exactly 1 row 
     rows = rs.getInt(1); // Get value of first column 
    } 
} 

PreparedStatement Пожалуйста, используйте для ВСТАВКА и UPDATE.

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