2017-03-09 71 views
-2

即时通讯有一个轻微的问题,我的SQL查询不工作,因为它不断给我这个错误,它说,预期;,即使我已经把一个半科尔兰在那里。即时通讯相当新的Java,所以任何帮助将被认定。SQL查询预期';'

import javax.swing.*; 
import java.awt.event.*; 
import java.sql.*; 



    public class Manager { 
     Connection con; 
     Statement st; 
     ResultSet rs; 

JFrame f = new JFrame("User Login"); 
JLabel U = new JLabel("Username"); 
JLabel P = new JLabel("Password"); 
JTextField t = new JTextField(10); 
JTextField t1 = new JTextField(10); 
JButton b = new JButton("Login"); 


public Manager() 
{ 
    connect(); 
    frame(); 
} 
public void connect() 
{ 

try 
{  

String driver = "sun.jdbc.odbc.JdbcOdbcDriver"; 
Class.forName(driver); 
String db = "jdbc:odbc:db1"; 
con = DriverManager.getConnection(db); 
st = con.createStatement(); 
} 
catch(Exception ex) 
{ 

} 
} 
public void frame() 
{ 
    f.setSize(600,400); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setVisible(true); 

    JPanel p = new JPanel(); 
    p.add(U); 
    p.add(t); 
    p.add(P); 
    p.add(t1); 
    p.add(b); 

    f.add(p); 

    b.addActionListener(new ActionListener(){ 


     public void actionPerformed(ActionEvent e) 
     { 
      try 
      { 
      String User = t.getText().trim(); 
      String Password =t1.getText().trim(); 


      String sql = "select User,Password from Table1 where User = '" + User +"'and Password='"+ Password"'"; 


      rs = st.executeQuery(sql); 

      int count = 0; 
      while(rs.next()) 
      { 
       count = count + 1; 
      } 
      if(count == 1) 
        { 
         JOptionPane.showMessageDialog(null,"User found, Acces"); 
        } 
      else if(count > 1) 
      { 
       JOptionPane.showMessageDialog(null,"Duplicated User, Access denied"); 

      } 
      else 
      { 
       JOptionPane.showMessageDialog(null,"User Not found"); 
      } 
      } 
      catch(Exception ex) 
      { 

      } 
     } 
    }); 
} 


public static void main(String[] args) { 

    new Manager(); 
} 

}

+2

您应该考虑使用'PreparedStatement'而不是在字符串中创建整个查询 – Dazak

+2

首先:*使用参数化查询*!您的字段中可能有一些结束引号导致查询中断。使用参数化查询可以防止出现问题,同时防止SQL注入(您的代码可以*开放*)。其次:不要将密码作为普通文本存储。 – Siyual

+0

什么是异常消息/堆栈跟踪?另外,'sql'开放给SQL注入攻击 - 考虑使用'PreparedStatement'。 –

回答

0

你只是缺少一个 '+' 号。

变化

+"'and Password='"+ Password"'";

+"'and Password='"+ Password + "'";

0

试图把一个;在您的SQL字符串...有点像这样(密码后)

String sql =“select User','User +''and Password ='”+ Password“'”+“ ;“;

-1

尽管没有回答你的问题,我相信这值得注意一个答案,规则是该死的。你所做的事情每年都会耗费全世界的金钱,毁掉人们的生活,可能也会杀死人们(我知道那些自杀身亡的人在经济上遭到破坏)。

(编辑)看到你的问题是什么,这其实可能为你解决它。奖金。 (/编辑)

请在您的数据库访问中使用_Prepared Statements_。如果我的身份被盗,并且我的信用最高,因为你是我的银行雇佣的廉价程序员,那么我会围捕一个帮派,我们会找到你。

只要有人认识到你的代码是不安全的,你的整个数据库将崩溃从巨大的安全漏洞。

我会尽量不让它打扰我,如果这得到一堆downvotes;防止这个安全问题是值得的。

这是正确的,您正在使用相同的API。创建一个PreparedStatement,做

myPreparedStatement = databaseConnection.prepareStatement(
    "select User,Password from Table1 where User = '?'and Password='?'"); 

然后用

myPreparedStatement.setString(columnUser, user); 
myPreparedStatement.setString(columnPass, pass); 
myPreparedStatement.executeUpdate(); 

执行它你会很好得多。否则,我保证你的数据库最终会被黑客攻击(以及你网络的其他部分,这取决于所有的设置)。

SQL注入是数据库攻击的面包和黄油(和粪便)。 这一个简单的技巧将为您的黑客入侵后的账单节省99%。

+0

其实,等一下......你是否将密码存储为纯文本,并且你只是在这里批量下载名称/密码对?除了我已经提到的另一个问题之外,对你而言,这将是灾难性的。有些人会称之为“简历生成事件”,除非没有人知道它会接受简历。确保你散列密码并添加一些盐,或者更好地使用其他目录服务来为你完成这项工作。至少,在保存密码之前对密码运行一些散列函数(并且在验证时很明显) – Aaron