java
  • mysql
  • 2012-08-16 34 views 3 likes 
    3
    public static boolean saveUserInfo(Client c){ 
    try { 
        Statement statement = conn.createStatement(); 
        ResultSet group = statement.executeQuery("SELECT * FROM users WHERE username = '"+ c.playerName + "'"); 
    
    
        if (!group.next()) 
         statement.execute("INSERT INTO `users` (`username`, `password`, `rights`, `address`, `hasbankpin`, `bankpin1`, `bankpin2`, `bankpin3`, `bankpin4`, `height`, `posx`, `posy`, `cbowcount`, `vls`, `skulltime`, `ep`, `dpoints`, `vlsleft`) VALUES ('"+c.playerName+"', '"+c.playerPass+"', '"+c.playerRights+"', '"+c.getIP()+"', '"+c.hasBankPin+"', '"+c.bankPin1+"', '"+c.bankPin2+"', '"+c.bankPin3+"', '"+c.bankPin4+"', '"+c.heightLevel+"', '"+c.absX+"', '"+c.absY+"', '"+c.crystalBowArrowCount+"', '"+c.degradeTime+"', '"+c.skullTimer+"', '"+c.earningPotential+"', '"+c.dungeonPoints+"', '"+c.vlsLeft+"')"); 
    

    對不起,我想要做的是檢查用戶是否存在於表中。如果是這樣,我希望它更新它,如果不是,我希望它添加用戶。我一直在嘗試這一兩天,我沒有任何運氣。該行是否存在?如果是這樣更新它,如果沒有添加它mysql/java

    任何幫助非常感謝!

    回答

    1

    您的密碼容易受到SQL Injection的影響。爲了避免這種情況,請使用JAVA PreparedStatement。除此之外,它將允許您在單引號的數據庫中插入記錄。預處理語句的一個例子是這樣的:

    PreparedStatement updateSales = con.prepareStatement(
         "INSERT INTO tableName(colA, colB) VALUES (?, ?)"); 
    updateSales.setInt(1, 75); 
    updateSales.setString(2, "Colombian"); 
    updateSales.executeUpdate(); 
    

    記住,總是淨化你的投入。

    回到你的問題,你可以使用INSERT...ON DUPLICATE KEY UPDATE

    例子,(您的用戶名必須是UNIQUE

    INSERT INTO `users` (`username`, `password`, `rights`, 
            `address`, `hasbankpin`, `bankpin1`, 
            `bankpin2`, `bankpin3`, `bankpin4`, `height`, 
            `posx`, `posy`, `cbowcount`, `vls`, `skulltime`, 
            `ep`, `dpoints`, `vlsleft`) 
    VALUES ('','', .....other values...., '') 
    ON DUPLICATE KEY 
    UPDATE `password` = '', 
         `rights` = '', 
         ... other values here 
    
    4

    您可以使用ON DUPLICATE KEY UPDATE條款做一個的單層查詢:

    INSERT INTO table_name(...) 
    VALUES(...) 
    ON DUPLICATE KEY UPDATE col = value, ...; 
    

    你需要把一個PRIMARYUNIQUE鍵上username列:

    ALTER TABLE users ADD UNIQUE KEY ix1 (username); 
    
    1

    如果你有一個唯一的密鑰,說在username,那麼你可以做這樣的事情:

    String query=" 
        INSERT INTO users SET 
         username = ?, 
         password = ?, 
         rights = ?, 
         address = ?, 
         hasbankpin = ?, 
         bankpin1 = ?, 
         bankpin2 = ?, 
         bankpin3 = ?, 
         bankpin4 = ?, 
         height = ?, 
         posx = ?, 
         posy = ?, 
         cbowcount = ?, 
         vls = ?, 
         skulltime = ?, 
         ep = ?, 
         dpoints = ?, 
         vlsleft = ? 
        ON DUPLICATE KEY UPDATE 
         password = VALUES(password), 
         rights = VALUES(rights), 
         address = VALUES(address), 
         hasbankpin = VALUES(hasbankpin), 
         bankpin1 = VALUES(bankpin1), 
         bankpin2 = VALUES(bankpin2), 
         bankpin3 = VALUES(bankpin3), 
         bankpin4 = VALUES(bankpin4), 
         height = VALUES(height), 
         posx = VALUES(posx), 
         posy = VALUES(posy), 
         cbowcount = VALUES(cbowcount), 
         vls = VALUES(vls), 
         skulltime = VALUES(skulltime), 
         ep = VALUES(ep), 
         dpoints = VALUES(dpoints), 
         vlsleft = VALUES(vlsleft) 
    "; 
    
    Statement stmt = conn.prepareStatement(query);      
    
    stmt.setString(1, c.playerName); 
    stmt.setString(2, c.playerPass); 
    stmt.setString(3, c.playerRights); 
    stmt.setString(4, c.getIP()); 
    stmt.setString(5, c.hasBankPin); 
    stmt.setString(6, c.bankPin1); 
    stmt.setString(7, c.bankPin2); 
    stmt.setString(8, c.bankPin3); 
    stmt.setString(9, c.bankPin4); 
    stmt.setString(10, c.heightLevel); 
    stmt.setString(11, c.absX); 
    stmt.setString(12, c.absY); 
    stmt.setString(13, c.crystalBowArrowCount); 
    stmt.setString(14, c.degradeTime); 
    stmt.setString(15, c.skullTimer); 
    stmt.setString(16, c.earningPotential); 
    stmt.setString(17, c.dungeonPoints); 
    stmt.setString(19, c.vlsLeft); 
    
    stmt.executeUpdate(); 
    
    相關問題