質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.98%

servletからのDB検索の処理結果が違う

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,986

bigbox267

score 22

前提・実現したいこと

jspとサーブレットで求人検索をするwebアプリケーションを作っています。開発環境はNetBeansとmysqlです
jspから値を取得してサーブレットからDB検索しその値と一致したレコードを表示するのをやりたいです。

発生している問題・エラーメッセージ

DB検索機能を実装したのですがうまくできなくて困っています。エラーメッセージなどは特にありませんが、処理結果が違うのです

テーブルに入っているはずなのに画面に表示してくれません
できあがったSqlをコピーしてxamppのコンソールから入力してみるとコンソールではちゃんと表示してくれます
イメージ説明

該当のソースコード

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * 
 */
@WebServlet(urlPatterns = {"/CompanySearch"})
public class CompanySearch extends HttpServlet {

    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {
            /* TODO output your page here. You may use following sample code. */

            HttpSession session = request.getSession(true);
            request.setCharacterEncoding("UTF-8");

            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet CompanySearch</title>");            
            out.println("</head>");
            out.println("<body>");
            out.println("<center>");
            out.println("<h1>就活サイト</h1>");
            out.println("<table border=¥\"1¥\">");
            out.println("<tr><th>企業ID<th>企業名<th>都道府県<th>住所<th>URL<th>メールアドレス<th>電話番号</tr>");

            Connection con = null;
            PreparedStatement stmt = null;
            ResultSet rs = null;

            try {

                con = DriverManager.getConnection(
                "jdbc:mysql://localhost/*****",
                "****", "********");

            String user = null;
            user = request.getParameter("userID");

            String companyID = null;
            companyID = request.getParameter("companyID");
            out.println("<p>companyID="+companyID+"</p>");

            String companyName = null;
            companyName = request.getParameter("companyName");
            out.println("<p>companyName="+companyName+"</p>");

            String prefecturesID = null;
            prefecturesID = request.getParameter("prefecturesID");
            out.println("<p>prefecturesID="+prefecturesID+"</p>");

            String companyAddress = null;
            companyAddress = request.getParameter("companyAddress");
            out.println("<p>companyAddress="+companyAddress+"</p>");

            String companyURL = null;
            companyURL = request.getParameter("companyURL");
            out.println("<p>companyURL="+companyURL+"</p>");

            String companyMail = null;
            companyMail = request.getParameter("companyMail");
            out.println("<p>companyMail="+companyMail+"</p>");

            String companyCall = null;
            companyCall = request.getParameter("companyCall");
            out.println("<p>companyCall="+companyCall+"</p>");


            StringBuffer buf = new StringBuffer();
            buf.append(" select * from company where ");

            if( companyID != null && companyID.length() != 0){
                buf.append(" companyID = ");
                buf.append(companyID);
                buf.append("&&");
            }
            if( companyName != null && companyName.length() != 0){
                buf.append(" companyName =  '");
                buf.append( companyName );
                buf.append("' &&");
            }

            buf.append(" prefecturesID = '");
            buf.append(prefecturesID);
            buf.append("' ");

            if( companyAddress != null && companyAddress.length() != 0 ){
                buf.append("&&");
                buf.append(" companyAddress = '");
                buf.append( companyAddress);
                buf.append("' ");
            }
            if( companyURL != null && companyURL.length() != 0){
                buf.append("&&");
                buf.append(" companyURL = '");
                buf.append(companyURL);
                buf.append("' ");
            }
            if( companyMail != null && companyMail.length() != 0){
                buf.append("&&");
                buf.append(" companyMail = '");
                buf.append(companyMail);
                buf.append("' ");

            }
            if( companyCall != null && companyCall.length() != 0){
                buf.append("&&");
                buf.append("companyCall = '");
                buf.append(companyCall);
                buf.append("'");
            }

            String sql =buf.toString();
            stmt = con.prepareStatement(sql);

            rs = stmt.executeQuery();
            out.println("<p>sql"+sql+"<p>");

            while (rs.next()) {
                out.println("<tr>");
                out.println("<td>" + rs.getInt("companyID") + "</td>" );
                out.println("<td>" + rs.getString("companyName") + "</td>" );
                out.println("<td>" + rs.getString("prefecturesID") +  "</td>" );
                out.println("<td>" + rs.getString("companyAddress") +  "</td>" );
                out.println("<td>" + rs.getString("companyURL") +  "</td>" );
                out.println("<td>" + rs.getString("companyMail") +  "</td>" );
                out.println("<td>" + rs.getString("companyCall") +  "</td>" );
                out.println("</tr>");
            }
        } catch (Exception e) {
            e.printStackTrace();
            out.println("<p>1</p>");
        } finally {
            try { rs.close(); } catch (Exception e) {}
            try { stmt.close(); } catch (Exception e) {}
            try { con.close(); } catch (Exception e) {}
        }

            out.println("</table>");
            out.println("</center>");
            out.println("</body>");
            out.println("</html>");
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}

試したこと

試しに
sql = select * from company
としてみたらデータをちゃんと表示してくれます

しかし、
whereの文が入ると何も表示しなくなります

sql = select * from company where prefecturesID = '北海道'
とすると何も表示しなくなります

sql = select * from company where prefecturesID = ?
stmt = con.prepareStatement(sql);

stmt.setString(n, prefecturesID);
rs = stmt.executeQuery();

みたいにやってみたりもしましたが、結局できませんでした

補足情報(言語/FW/ツール等のバージョンなど)

companyテーブルには

|companyID | 1|
|companyName | テスト|
|prefecturesID | 北海道|
|companyAddress | 北海道函館市|
|companyURL | http://www.hogehoge.com|
|companyMail | hogehoge|
|companyCall | 04312345678|

このようなデータが入っています

prefecturesID 以外は空白での検索も可能にしたいです
ですので、最初から
sql = select * from company where companyID = ? && companyName = ? && prefecturesID = ?......
とやっていると空白で検索された場合にエラーになると考えやりませんでした

prefecturesID はhtmlのセレクトメニューで必ず47都道府県のいずれかのIDが入力されます

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

少し加筆・修正しました。


文字セットの問題ではないでしょうか?

自分の環境ではcharacter_set_filesystem以外はDB/Tableのデフォルト(の文字セットやcollation)および全ての文字列のカラムの文字セットはutf8(およびunicode_general_ci)に統一してあります。その環境でWorkBenchなどから以下のようにするとヒットしましたが、1行目のcharacter_set_clientをutf8以外(latin1やcp932)に変更するとヒットしませんでした。

set character_set_client = utf8;
SELECT * FROM company where prefecturesID='北海道'; --> ヒット

MySqlの文字セットがどのような設定になっているかは以下で調べられると思います。

show variables like 'chara%'

もしcharacter_set_clientなどが不適切な値になっていたなら上記の原因であるような気がします。
なお、詳細なメカニズムを把握したい場合は「MySQLの文字セットについてのマニュアルを参照」し、単純に問題を発生させないためには統一しておくのがよいのかも知れません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/29 10:25

    私のOSもwin10です
    insert文はxamppのコンソールから入力しました
    DBを操作する場合、いつもxamppのコンソールからなのですが、他のやり方をした方がいいのでしょうか?

    キャンセル

  • 2016/12/29 18:51

    一応解決しました
    character_set_filesystem以外は全てutf8に変更して
    DBに登録するservletを作成し、そこからDBに登録した日本語はhtml上では、文字化けせずにちゃんと表示されました。

    キャンセル

  • 2016/12/29 19:55

    何を使うにせよ文字セットは面倒ですね。xamppの文字化け対策についての記事も検索してみるとちらほらあるようなのでそういったものも参考にされるとよいと思います。

    キャンセル

+2

where条件がない場合は出力されるとのことですので、
気になるのは、試された、where条件の値が、日本語だという部分です。
※実際のDBとの文字コードの違いで、selectされないのではないでしょうか?

例えば、where companyID = 1 で試してみるなどで問題を切り分けてみて下さい。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/28 21:54

    sql =" select * from company where companyID = 1 ";
    では、きちんと表示されていました

    キャンセル

  • 2016/12/29 10:39

    もともと、コンソールでは日本語でもselectできていたとのことですので、character_set_clientがcp932ならば、データベース自体に格納する文字コードもcp932の設定になっているのではないのでしょうか?
    mysqlの、show create database xxxx コマンドで確認できます。
    (参考)http://mysql.javarou.com/dat/000573.html

    データベースの文字コードがcp932ならば、JDBCで接続する際のオプションで、cp932を指定すれば、日本語でのinsertも、日本語でのselectもうまくできると思います。
    "jdbc:mysql://localhost/*****"の部分を、
    "jdbc:mysql://localhost/*****?characterEncoding=cp932"に変更
    データベースがutf8の場合は、
    "jdbc:mysql://localhost/*****?characterEncoding=utf8"に変更

    キャンセル

  • 2016/12/29 19:03

    回答ありがとうございました。
    上記のやり方と併用させていただきました

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる