2

特定の列からいくつかのキーワードを検索し、そのキーワードに対応するすべての列の値を出力したかったのですが、クエリを使用すると問題が発生します。

%C%などのスキルとスキルのさまざまな行がある候補から*を選択します。

Java、C、C ++、HTML、CSS、Net Beans、My Eclipse

Java、Asp.Net、Eclipse

C、PHP、CSS、Hibernate

Cはすべての行の部分文字列であるため、すべての行が表示されます。%C%ではなくC%を使用しようとしましたが、Cで始まる3行目のみが表示されますが、「C」を持つすべての行を表示する必要があります。別の言葉として、どうすれば全世界を検索できますか、コードの一部を提案します。

import java.util.*;
import java.sql.*;
import java.io.*;

public class TokensOfString 
{
    public static void main(String[] args) 
    {
        String str;
        String query = "";
        try
        {
            int i =0, cntToken =0;
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("Enter the keywords to be searched");
            str = br.readLine();
            StringTokenizer words = new StringTokenizer(str, ",");
            cntToken = words.countTokens();
            //System.out.println("No. of Tokens = "+cntToken);

            String token[]= new String[cntToken];

            while(words.hasMoreElements())
            {
                token[i] = words.nextToken().trim();
                //System.out.println(token[i]);
                i++;
            }
                //System.out.println(++i+" : "+words.nextElement().toString().trim());    

            query = "SELECT * from can_skills where skills  like '"+ token[0] +"%'";
           // System.out.println("Query at 34 : "+query);
            if(cntToken == 1)
            {
                query ="";
                query = "SELECT * from can_skills where skills  like '"+ str +"%'";
            }
            if(cntToken > 1)
            {
                for( int j=1; j < cntToken; j++)
                query = query + " or skills  like '"+ token[j] +"%'";
            }
            System.out.println("Query at 43 : "+query);

            Connection con = null;
            Class.forName("com.mysql.jdbc.Driver");
            String hostName = "localhost";
            String port = "3306";
            String userName = "root";
            String password = "root";
            con = DriverManager.getConnection("jdbc:mysql://" + hostName + ":" + port + "/prem", userName, password);
            Statement statement= con.createStatement();
            ResultSet rs = statement.executeQuery(query);
            while(rs.next())
            {
                System.out.println(rs.getString(4));
            }

        }
        catch(ClassNotFoundException e){ System.out.println(e); }
        catch(Exception ex){ System.out.println(ex); }
    }
}
4

2 に答える 2

0

REGEXPを試すことができます:

"select * from can_skills where skills REGEXP '" . token . ",?'"

詳細はこちら:http ://dev.mysql.com/doc/refman/5.1/en/regexp.html

FWIW:コードの作成方法により、インジェクションスタイルの攻撃にさらされる可能性があります。

于 2012-09-28T12:23:22.603 に答える
0

式の代わりに正規表現を使用しlikeます。

select *
from Candidate
where skills regexp '^C,| C,| C$'

|手段or。_ は文字列の^始まりを$意味し、は終わりを意味します。したがって、文字列の最初、最後、および途中のトークンと一致します。2番目と3番目のケースの前にスペースがあることに注意してください。

Javaでは、私がそれを間違えなかった場合:

"SELECT * from can_skills where skills regexp '^" + token[0] + ",| " + token[0] + ",| " + token[0] + "$'";
于 2012-09-28T12:25:46.957 に答える