如何在不输入双引号的情况下制作搜索栏?

Posted

技术标签:

【中文标题】如何在不输入双引号的情况下制作搜索栏?【英文标题】:how to make search bar without having to type double quotation? 【发布时间】:2021-02-13 02:32:37 【问题描述】:

大家好,我正在尝试在 java 中创建这个搜索栏,但是当我在不输入双引号的情况下进行搜索时,我得到了这个错误

search error image

但是当我输入带有双引号的数字或单词时,它工作得很好

searching with double quotation image

这是我的代码

Code image


private void jButton_Show1ActionPerformed(java.awt.event.ActionEvent evt)                                               
      try
          String Accounts_Choose_Value = jTextField1.getText();
          // Accounts_Choose_Value = (String) Accounts_jComboBox_Choose_Value.getSelectedItem();
                  
          if(Accounts_Choose_Value.equals(Accounts_Choose_Value))
              String sql = "SELECT * FROM accounts WHERE URL="+Accounts_Choose_Value;
        con= DriverManager.getConnection("jdbc:mysql://localhost/accountmanagerdb","root","");
              Statement s = con.prepareStatement(sql);
              ResultSet rs =s.executeQuery(sql);
              if(rs.next())
                  String Account_User_Name =rs.getString(2);
                  String Account_Email =rs.getString(3);
                  String Account_Password =rs.getString(4);
                  String Account_Backup_Codes =rs.getString(5);
                  
                  jLabel_Account_User_Name.setText(Account_User_Name);
                  jLabel_Account_Email.setText(Account_Email);
                  jLabel_Account_Password.setText(Account_Password);
                  jLabel_Account_Backup_Codes.setText(Account_Backup_Codes);
              
          
       catch (SQLException ex) 
                    JOptionPane.showMessageDialog(null, ex,
                            "Database",JOptionPane.ERROR_MESSAGE);        
      
      
      
    

在文本字段中没有写任何东西

private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt)                                             
        // TODO add your handling code here:
     

【问题讨论】:

【参考方案1】:

改这一行但要小心SQL injection

String sql = "SELECT * FROM accounts WHERE URL=\""+Accounts_Choose_Value+"\"";

基本上,您需要将第一个查询生成的 where 子句条目用双引号括起来

SELECT * FROM accounts WHERE URL=google

这意味着您要给我列值URL 等于列值google 的所有行

正确的查询是

SELECT * FROM accounts WHERE URL="google"

现在你要求给我所有 URL 等于“google”字符串的行

在第一种情况下,您的代码失败说我找不到名为 google 的列

编辑

基本上你不应该直接对你的变量进行字符串插值,这会导致安全问题

你可以在这里参考如何做准备好的语句

Java - escape string to prevent SQL injection

【讨论】:

不要那样做!阅读有关 SQL 注入的信息,然后开始为此使用 PreparedStatement。 但是请使用绑定变量,否则会导致SQL注入。 @Axel 用警告更新了答案,我的错我应该小心我的答案 谁能解释一下如何在我的代码中防止sql注入 @Yahya:很简单。永远不要将来自用户输入的 SQL 查询放在一起。创建一个 PreparedStatement,然后使用 setXXX 方法设置参数值。有关可能出错的示例,请参阅此answer 到另一个问题。在 Baeldung 的 article 中阅读有关 PreparedStaement 的更多信息。

以上是关于如何在不输入双引号的情况下制作搜索栏?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使其全屏的情况下删除颤振闪屏状态栏的颜色覆盖?

如何在不四舍五入的情况下在 Java 中格式化双输入?

如何在不重新加载页面的情况下制作多个帖子(html,mysql)

如何在不提交和从数据列表中搜索的情况下从输入中获取价值

如何在不破坏 UI 的情况下将搜索放在另一个线程中?

如何在没有双引号的情况下修复 JSON 键值?