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+"')");

混乱して申し訳ありませんが、私がやろうとしているのは、ユーザーがテーブルに存在するかどうかを確認することです。もしそうなら、私はそれを更新したいと思います。そうでなければ、ユーザーを追加したいと思います。私はこれを数日間試みてきましたが、運がありませんでした。

どんな助けでも大歓迎です!

4

3 に答える 3

4

ON DUPLICATE KEY UPDATE句を使用して、単一のクエリで実行できます。

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

PRIMARYまたはUNIQUEキーを列に配置する必要がありusernameます。

ALTER TABLE users ADD UNIQUE KEY ix1 (username);
于 2012-08-16T06:22:39.103 に答える
1

on などの一意のキーがある場合、次の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();
于 2012-08-16T06:31:44.873 に答える
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
于 2012-08-16T06:33:46.333 に答える