2017-03-09 128 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