2013-01-01 32 views
0

爲防止sql注入,我試圖避免使用WHERE Surname LIKE '"search_txt.getText()"' ...但是使用preparedStatement正在離開?空白,換句話說SQL語句無法執行,甚至一個正確的搜索值在文本框輸入的...什麼是行pst1.setString(1, search_txt.getText()+"%");在java中用一個或多個字搜索整個數據庫

private void SearchActionPerformed(java.awt.event.ActionEvent evt) {          
      try{ 
      sql = "SELECT Title, Forename, Surname, Role FROM AcademicInfo WHERE Surname LIKE ? OR Forename LIKE ?"; 
      PreparedStatement pst1 = conn.prepareStatement(sql); 

      ResultSet rs2 = pst1.executeQuery(); 
      if (rs2.next()) { 
       pst1.setString(1, search_txt.getText()+"%"); 
       pst1.setString(2, search_txt.getText()+"%"); 
       System.out.println(sql); 
       JOptionPane.showMessageDialog(null, "Found Academic"); 
       Update_table(sql); 
      } else { 
       System.out.println(sql); 
       JOptionPane.showMessageDialog(null, "No Results Found"); 
      } 
      } 
      catch(Exception e) { 
       JOptionPane.showMessageDialog(null, e); 
      } 



     }   
+3

歡迎** SQL注入攻擊**。使用準備好的語句而不是自己搞亂字符串! –

+0

@ Anony-Mousse我知道這一點,這只是一個想法。 – Hoody

+2

其他人可能會偶然發現這個問題,然後認爲這是正確的做法。最好避免在任何地方發佈的每個代碼片段中出現這種錯誤,這樣人們就不會看到錯誤的代碼,而不會解釋爲什麼它不好,以及如何做得更好。 –

回答

1

最簡單的方法來做到這一點與MySQL是通過使用FULLTEXT搜索。就像你說的那樣,它不會搜索'完整的sql數據庫',但它可以搜索很多列。這工作得很好。

語法與您習慣的語法有點不同。這可能對你有用。

SELECT Title, Forename, Surname, Role 
    FROM AcademicInfo 
WHERE MATCH(Surname, Forename) AGAINST('searchterm' IN BOOLEAN MODE) 

我會讓你去修改SQL語句到Java。

這是文檔。

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

+0

我使用了'IN BOOLEAN MODE',因爲FULLTEXT搜索奇怪地用小數據集工作。你可能真的想要自然語言搜索。閱讀文檔。 –

+0

java不喜歡詞語反對 – Hoody

+0

'sql =「選擇標題,姓,名,角色從AcademicInfo WHERE MATCH(姓,名,角色,房間,電子郵件)反對(?在布爾模式)」; PreparedStatement pst1 = conn.prepareStatement(sql); ResultSet rs2 = pst1.executeQuery(); if(rs2.next()){ pst.setString(1,search_txt.getText());' – Hoody

相關問題