【问题标题】:Need assistance with this Java project需要有关此 Java 项目的帮助
【发布时间】:2014-04-20 17:21:34
【问题描述】:

我正在使用 sql server 2012 并且我正在做一个允许用户注册和登录的 java 程序。但是,在用户登录或注册后,他们应该能够向表中添加更多信息。但我不断得到一个空值。 我的表有 4 个字段...用户名(主键)、密码、电子邮件、个人信息。 我希望用户在登录或注册后能够添加到个人信息字段

//adding a user
public void addUser(User user)
{
   try{
       makeConnection();
       Statement s = con.createStatement();
      s.execute("INSERT INTO Person VALUES('"+user.getUserName()+"','"+user.getPassword()+"','"+user.getEmail()+"','"+user.getSlang()+"')");

   }
   catch(SQLException ex){
   xc=false;

       JOptionPane.showMessageDialog(null,"The LoginID  & or email already exists, \n please type a different loginID and password",
               "Error",JOptionPane.ERROR_MESSAGE);
       //System.out.println("Error.......");
       ex.printStackTrace();
   }
 }

这是我在 Sql 中的表 创建表人 ( loginID varchar(30) 主键不为空, 密码 varchar(15), 电子邮件 varchar(30) 唯一, 俚语 varchar(128), /定义 varchar(200)/ ) 用户登录或登录后,我的 gui 转到另一个框架,允许用户输入一些我想添加到俚语列的更多信息,但我一直为空。是否可以从 null 更新它。

public void addInfo(User info) {

     try{
         makeConnection();
         Statement s = con.createStatement();
         String sp = ("UPDATE Person SET Slang = '"+info.getSlang()+"' where loginID='"+info.getUserName()+"' ");

       s.executeUpdate(sp);
     }
     catch(SQLException ex){
         xc = false;
           JOptionPane.showMessageDialog(null,"Slang already added, \n please type a different loginID and password",
               "Error",JOptionPane.ERROR_MESSAGE);
            //System.out.println("Error.......");
           ex.printStackTrace();
     }
 }  

【问题讨论】:

  • public void addInfo(User info) { try{ makeConnection();语句 s = con.createStatement(); String sp = ("UPDATE Person SET Slang = '"+info.getSlang()+"' where loginID='"+info.getUserName()+"' "); s.executeUpdate(sp); } catch(SQLException ex){ xc = false; JOptionPane.showMessageDialog(null,"已添加俚语,\n请输入不同的登录ID和密码", "Error",JOptionPane.ERROR_MESSAGE); //System.out.println("错误......."); ex.printStackTrace(); } }
  • 您可以编辑原始帖子以在问题正文中添加代码。不要忘记对其进行格式化,以便于阅读。
  • 另外,在您编辑问题以包含此代码时,请向我们提供有关 PERSON 架构的更多信息。
  • public void addUser(User user){ try{ makeConnection();语句 s = con.createStatement(); s.execute("INSERT INTO Person VALUES('"+user.getUserName()+"','"+user.getPassword()+"','"+user.getEmail()+"','"+user .getSlang()+"')"); } catch(SQLException ex){ xc=false; JOptionPane.showMessageDialog(null,"LoginID & or email已经存在,\n请输入不同的loginID和密码", "Error",JOptionPane.ERROR_MESSAGE); //System.out.println("错误......."); ex.printStackTrace(); } }
  • 非常重要 我建议您阅读 SQL 注入攻击。如果你让这段代码正常工作,它会让你容易受到攻击。

标签: java netbeans jdbc sql-server-2012


【解决方案1】:

首先是使用 PreparedStatement 的强制性建议。它可以正确转义单引号和其他特殊字符,并防止SQL injection

    String sql = "INSERT INTO Person (loginID, password, email)"             
            + " VALUES(?, ?, ?)";
    try (PreparedStatement s = con.prepareStatement(sql)) {
        s.setString(1, user.getUserName());
        s.setString(2, user.getPassword());
        s.setString(3, user.getEmail());
        int updateCount = s.executeUpdate();
    }

语句应该被关闭,为此可以使用 try-with-resources 语法,总是关闭。如果插入了一条记录,updateCount 应该为 1。

到错误;如果枚举列名,代码不会在未来的表更改时立即中断,但也可能将空字段排除在外(一般情况下可以填空,如果该列没有约束NOT NULL。)

但是,您似乎在说,UPDATE 给出了与 NULL 相关的错误。在这种情况下,它只能是包含 null 的 User info。也许你可以给出更详细的错误信息。或跟踪值;信息和他们的领域。就我们现在所知,即使是连接也可能是罪魁祸首。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 2011-03-26
    • 1970-01-01
    • 2010-12-13
    • 2017-08-02
    相关资源
    最近更新 更多