0

ユーザーが探している製品だけを見たいのですが、2番目のifが実行されると、次のID(一意のIDを持っているのでどこにもプッシュされません)にプッシュ(ポインタまたはそこにあるもの)され、結果はnullです. 私の問題を理解していただければ幸いです:)。

    if (stmt.execute(
                        "SELECT * FROM products where ID=" + removeName)) {
                    rs = stmt.getResultSet();
    if (!rs.next()) {
                       m = "ID not found.";
                        return m;
                   }
4

3 に答える 3

1

あなたの場合、SQL インジェクションの問題を回避するためにPreparedStatementを使用できます。

  PreparedStatement prodsQuery= con.prepareStatement("SELECT * FROM products where ID=?");
  prodsQuery.setInt(1,removeName);
  ResultSet rs = prodsQuery.executeQuery();
  if(!rs.next())
  {
        m = "ID not found.";
        return m;
   }
于 2013-04-28T10:53:53.433 に答える
0

問題は、少なくとも1つの結果があるかどうかを知るために最初の結果を読んでから、次の結果を消費しようとし、最初の結果を見逃すことです(質問の説明から適応)。ここでこれがどのように機能するかを説明しました。

この問題の可能な解決策は、クエリが問題なく実行され、結果が得られたと仮定して、データ (またはListデータの) を取得し、最後のステップとして、データが null でないか、Listデータの が空でないかどうかを確認することです。

提案された解決策を示すためにNaveen の回答から適応されたコード

PreparedStatement prodsQuery =
    con.prepareStatement("SELECT * FROM products where ID=?");
prodsQuery.setInt(1,removeName);
ResultSet rs = prodsQuery.executeQuery();
  1. 取得する結果が 1 つだけであると仮定します。

    //also assuming you will set the results in a Data class (yes, this can be replaced)
    Data data = null;
    if (rs.next()) {
        //logic to retrieve data...
        data = new Data();
        data.setSomething(rs.get(1));
        //more and more code to fill the data...
    
        //because it looks that you need it as String (wonder why you return a String as well)
        return data.toString();
    }
    //note: I use an else statement to check if indeed there were no results at all
    //else statement added using a line separator for code explanation purposes
    else {
        m = "ID not found.";
        return m;
    }
    
  2. 取得する結果のリストがあると仮定します。

    //also assuming you will set the results in a Data class (yes, this can be replaced)
    List<Data> dataList = new ArrayList<Data>();
    while (rs.next()) {
        //logic to retrieve data...
        Data data = new Data();
        data.setSomething(rs.get(1));
        //more and more code to fill the data...
    
        //because it looks that you need it as String (wonder why you return a String as well)
        dataList.add(data);
    }
    //in this case, there's no validation in order to know if there's any result
    //the validation must be in the client of this class and method checking if
    //the result list is empty using if(!List#isEmpty) { some logic... }
    return dataList;
    
于 2013-04-28T13:47:49.353 に答える
0

まず、あなたのアプローチは SQL インジェクションに対して脆弱です。PreparedStatement にアクセスしてください。
PreparedStatement を使用するためのこの簡単な例を見てください

そして、次のようにする必要があります:

ResultSet rs = stmt.executeQuery("SELECT * FROM products where ID=" + removeName);
if (!rs.next()) {
      m = "ID not found.";
      return m;
}
于 2013-04-28T10:47:28.357 に答える