【问题标题】:Searching entire database with one word or more in java在java中用一个或多个单词搜索整个数据库
【发布时间】:2012-12-16 06:18:49
【问题描述】:

为了防止 sql 注入,我试图避免使用 WHERE Surname LIKE '"search_txt.getText()"' ...但是使用 preparedStatement 会离开 ?空白,换句话说,即使在文本字段中输入了正确的搜索值,sql语句也无法执行...pst1.setString(1, search_txt.getText()+"%");行中的问题是什么

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);
            }



        }           

【问题讨论】:

  • 欢迎 SQL 注入攻击。使用准备好的语句而不是自己弄乱字符串!
  • @Anony-Mousse 我知道,这只是一个想法。
  • 其他人可能会偶然发现这个问题,然后认为这是正确的做法。最好避免在任何地方发布的每个代码 sn-p 中都出现这种错误,这样人们就不会在没有解释为什么不好以及如何做得更好的情况下看到不好的代码。
  • @Anony-Mousse 已编辑但新问题

标签: java c++ sql swing search


【解决方案1】:

对于像Apache Lucene这样的全文搜索引擎来说,这是一个很好的用例

【讨论】:

    【解决方案2】:

    使用 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

    【讨论】:

    • 我使用了IN BOOLEAN MODE,因为 FULLTEXT 搜索在处理小型数据集时会很奇怪。您实际上可能需要自然语言搜索。阅读文档。
    • java 不喜欢 AGAINST 这个词
    • sql = "SELECT Title, Forename, Surname, Role FROM AcademicInfo WHERE MATCH(Forename, Surname, Role, Room, Email) AGAINST(? IN BOOLEAN MODE)"; PreparedStatement pst1 = conn.prepareStatement(sql); ResultSet rs2 = pst1.executeQuery(); if (rs2.next()) { pst.setString(1, search_txt.getText());
    • SQlite 是否支持 FULLTEXT?
    • FULLTEXT 只是 MySQL 的一项功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 2016-10-30
    • 2023-03-20
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多