2017-11-14 16 views
1

JSPプロジェクトの検索フォームに問題があります。特に、ユーザーはイベントを購読することができ、管理者はそのイベントのすべてのメンバーを検索できる必要があります。JSP - 有効な検索フォームを書く方法

私はこのような形式の書き込み:(それが読み取れない場合は、次の4 <input>、テーブルuserと提出のための<input>の各列に1つがあります)

out.println("<fieldset><legend>Search</legend><form action=\"cercaIscritti.jsp\" method=\"post\">" 
      + "Name: <input name=\"name\" type=\"text\"><br>Surname: <input name=\"surname\" type=\"text\"><br>" 
      + "Belonging: <input name=\"belonging\" type=\"text\"><br>Countr: <input name=\"country\" type=\"text\"><br>" 
      + "<input type=\"submit\" value=\"Cerca\"></fieldset></form>"); 

を。

管理者が必要な情報を入力できるようにすべてのフィールドをオプションにしたいのですが、どのようにクエリをビルドしますか?

私はこのような何か試してみました:

public ResultSet searchSubs(String name, String surname, String belonging, String country) { 
    try { 
     boolean n = false, s = false, b = false, c = false; 
     String query = "SELECT * FROM user WHERE "; 
     if (!isEmpty(name)) { 
      query += "firstName = ?"; 
      n = true; 
     } 
     if (!isEmpty(surname)) { 
      if (n) { 
       query += " AND lastName = ?"; 
      } else { 
       query += "lastName = ?"; 
      } 
      s = true; 
     } 
     if (!isEmpty(belonging)) { 
      if (n || s) { 
       query += " AND belonging = ?"; 
      } else { 
       query += "belonging = ?"; 
      } 
      b = true; 
     }//and go on 

をしかし、どのように私はPreparedStatementに値を追加することができますか?これは正しい方法ですか?そうでなければ、どうすればそのようなことができますか?

ブーリアンはテストのためだけに中にありますが、私は何らかの方法でそれらを使用すると思っていましたが、私は方法がわかりません。ここで

答えて

1

あなたは倍数値で検索するために従うことができます方法です。

public ResultSet searchSubs(String name, String surname, String belonging, String country){ 
    try { 
     String query = "SELECT * FROM user WHERE 1=1"; 
     //---------------------------------------^^^ 
     int index = 1; 
     if (!name.isEmpty()) { 
      query += " AND firstName = ?"; 
     } 
     if (!surname.isEmpty()) { 
      query += " AND surname = ?"; 
     } 
     if (!belonging.isEmpty()) { 
      query += " AND belonging = ?"; 
     } 

     if (!country.isEmpty()) { 
      query += " AND country = ?"; 
     } 

     PreparedStatement ps = connection.prepareStatement(query); 

     if (!name.isEmpty()) { 
      ps.setString(index++, name); 
     } 
     if (!surname.isEmpty()) { 
      ps.setString(index++, surname); 
     } 
     if (!belonging.isEmpty()) { 
      ps.setString(index++, belonging); 
     } 
     if (!country.isEmpty()) { 
      ps.setString(index++, country); 
     } 

     ResultSet rs = ps.executeQuery(); 
     //... 

アイデアはシンプルです:ユーザーではない場合句の使用1=1がエラーを取得しないようにどこで

  • 任意の値を入力します(この場合、クエリはSELECT * FROM user WHERE 1=1であり、すべてのものが返されます)
  • 最初の部分は、空でないフィールドをクエリに入力します。
  • 2番目は、準備されたステートメントを正しい値で埋める場合です。
  • 最後に、準備された文を実行して結果を取得します。
+0

まずは、ありがとう!これは私が探していたものです! **しかし** IDEはこれを返します: "不明な列 '姓' where句 '"。どうして? PS:インデックスは0から始まらず1から始まると思う。 – tuzzo

+1

あなたは@tuzzoを歓迎しています。テーブルの列の名前をチェックしましたか?正しい名前を使用する必要があります。インデックスは1から始まります。あなたのコメントの前に:) –

+1

あなたは正しいです。 dbでは列は '姓'ではなく、 'lastName'です。今それは動作します、ありがとう! – tuzzo

関連する問題