首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用给定字段在SQL中进行更新

问无法使用给定字段在SQL中进行更新
EN

Stack Overflow用户
提问于 2014-04-15 08:01:05
回答 2查看 70关注 0票数 0

首先,我想为标题道歉,但当我解释的时候,你就会明白我为什么不知道怎么说了。无论如何,我正在编写一个聊天程序,当我发出" update“命令时,我会在它后面加上我想要更新的字段的名称,然后给出我的新值。我的问题是,它让我遇到了一个关于错误列的异常,但经过多次检查,我确信我给出的字段的名称与我的SQL中的名称相同。我在phpMyAdmin中使用MySQL。下面是我的代码部分:

客户端:

代码语言:javascript
复制
if (mymessage.equals("UPDATE")) {
                String[] arr = input.nextLine().split(" ");
                message = id + "-=-" + arr[0].trim() + "-=-" + arr[1].trim();
                message2 = encrypt(message, serverAesKey);
                write.println(message2);
                write.flush();
            }

服务器:

代码语言:javascript
复制
if (msg[2].trim().equals("UPDATE")) {
            System.out.println("waiting...");
            message = read.nextLine();
            command = Mediator.decrypt(message, Mediator.getServerAesKey());
            System.out.println(command);
            msg = command.split("-=-");
            int id = Integer.parseInt(msg[0].trim());
            String field = msg[1].trim();
            String update = msg[2].trim();
            System.out.println("....."+id+"-"+field+"-"+update);
            Mediator.updateDB(id, field, update);  >>this simply runs the method below



public void updateInfo(int id, String field, String update) {
    Connection connection;
    try {
        Class.forName("com.mysql.jdbc.Driver");
        connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/chat", "root", "");
        switch (field) {
            case "name":
                String SQLname = "UPDATE info SET name = " + update + " WHERE id = " + id + "";
                PreparedStatement pstmtName = connection.prepareStatement(SQLname);
                pstmtName.executeUpdate();
                break;
            case "password":
                String SQLpassword = "UPDATE info SET password = " + update + " WHERE id = " + id + "";
                PreparedStatement pstmtPwd = connection.prepareStatement(SQLpassword);
                pstmtPwd.executeUpdate();
                break;
        }
    } catch (ClassNotFoundException | SQLException e) {
        e.printStackTrace();
    }
}

这是我得到的异常:

代码语言:javascript
复制
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'nick' in 'field list'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2427)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2345)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2330)
at test.Database.updateInfo(Database.java:122)
at test.Mediator.updateDB(Mediator.java:100)
at test.ServerService.executeService(ServerService.java:108)
at test.ServerService.run(ServerService.java:73)
at java.lang.Thread.run(Thread.java:722)

这是我的输出,您可以看到我的消息被正确拆分:

代码语言:javascript
复制
4-=-admin-=-UPDATE
waiting...
4-=-name-=-nick
.....4-name-nick

这是我的数据库:

代码语言:javascript
复制
id|username|password|name|login
3 |user    |user    |user|0
4 |admin   |admin   |admin|0

(我想放一张照片,但我没有名气,但这就是它的写法。)

您可以忽略有关Mediator和加密/解密的任何内容,它们工作得很好。我想知道的是,当我给出正确的字段时,为什么我会得到和异常。

EN

回答 2

Stack Overflow用户

发布于 2014-04-15 08:30:27

基本上,列name是某种文本数据类型(varchar等),所以不是...

代码语言:javascript
复制
String SQLname = "UPDATE info SET name = " + update + " WHERE id = " + id + "";
PreparedStatement pstmtName = connection.prepareStatement(SQLname);
pstmtName.executeUpdate();

问题是,UPDATE info SET name = " + update + " WHERE id = " + id + "对于database...what来说看起来像UPDATE info SET name = nick WHERE id = 0,nick对于数据库意味着什么吗?我想不是很多。

您应该将这些值绑定到PreparedStatement

代码语言:javascript
复制
String SQLname = "UPDATE info SET name = ? WHERE id = ?";
PreparedStatement pstmtName = connection.prepareStatement(SQLname);
pstmtName.setString(1, update);
pstmtName.setInt(2, id);
pstmtName.executeUpdate();

这将为您省去许多与数据转换相关的麻烦(因为驱动程序可以处理大量数据转换)以及恶意用户可能进行的SQL注入

票数 1
EN

Stack Overflow用户

发布于 2014-04-15 08:35:50

为了确切地知道异常是从哪里来的,我建议您将

位于以下位置的System.out.println(SQLname):

代码语言:javascript
复制
String SQLname = "UPDATE info SET name = " + update + " WHERE id = " + id + "";

和System.out.println(SQLpassword)在以下位置:

代码语言:javascript
复制
String SQLpassword = "UPDATE info SET password = " + update + " WHERE id = " + id + "";

并放入//:

代码语言:javascript
复制
//PreparedStatement pstmtName = connection.prepareStatement(SQLname);
//pstmtName.executeUpdate();

和:

代码语言:javascript
复制
//PreparedStatement pstmtPwd = connection.prepareStatement(SQLpassword);
//pstmtPwd.executeUpdate();

执行你的程序。SQL查询(SQLpassword和SQLpassword)将在控制台上打印出来。使用MySQL命令行执行这些查询

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23072419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档