プロが教える店舗&オフィスのセキュリティ対策術

だいたいのプログラム内容:
login.htmlでログインを試み、そこからメールアドレス、パスワードがerrormsg.jspにパラメータで送られ、errormsg.jspからLoginBean.java(bean)を使いSQLデータに入ってるメールアドレス、パスワードと照らし合わされ、データに登録されていなかったら、エラーメッセージが返され、合っていたらwelcom.htmlページに送られます。
たまたま@ITで似たような内容があったので、基本的には同じように作りました。
でも、うまくデータを照合し分けることができません。パラメータは調べたらきちんと通っており。ResultSetの所に問題があると分かりました。
以下はLoginBean.javaの主な問題コードです。
public boolean confirm(){
try{
//SQLへの接続省略してます
String sql_str = "SELECT email, password FROM customer where email='"+email+"'AND password='"+password+"'";
//ここが問題の部分です。
ResultSet rs = stmt.executeQuery(sql_str);
if(rs!=null){
rs.close();
stmt.close();
connection.close();
return true;
}
else{
rs.close();
stmt.close();
connection.close();
return false;}
}catch(SQLException e) {
return false;
}catch(Exception e){
e.printStackTrace();
return false;}}}
このように、パラメータからきたアドレスパスワードを使い、SQLのSELECTで検索されたものをrsに返し、rsが空でなければ、trueを返します。(このメソッドはerromsg.jspから呼ばれます。)しかしデータに登録さてないものでもrsがnullでないと判断され、trueが帰ってきます。

A 回答 (3件)

 ResultSetオブジェクトは、行が無くてもnullにはなりませぬ。

つまり、「結果が1行も無いResultSetオブジェクト」になります。

 Java2 1.4.2 APIを参照しても、Returnsに「never null」と名言されています。

 なので行があるかないかは、ResultSet.next()やResultSet.getRow()で判断します。または
SELECT Count(email) FROM customer where email='"+email+"'AND password='"+password+"'"
というSQL文で、最初の行の最初のフィールドが0であれば存在しないという判断になるかと思います。
    • good
    • 1
この回答へのお礼

有難うございました。おかげさまでrs.next()でうまくいきました。ずっと解決方法を探し回ってたのに、ここですぐに間違いを指摘解決してもらえ、今まで探していた時間は、、と思いつつも、次にすすめホットしてます。どうもどうも。

お礼日時:2005/12/14 19:15

既に、既出ですが


if(rs.next)とすれば良いと思います。
以下APIからの抜粋です。
「ResultSet のカーソルは、初期状態では最初の行の前に位置付けられています。メソッド next の最初の呼び出しによって、最初の行が現在の行になります。」
よって、nextでfalseが返されれば、データが1件も取得できなかったという判断が出来ます。
ちなみに、ResultSet オブジェクトは、オブジェクトを生成した Statement オブジェクトが閉じられるとき、自動的にクローズされるので、
rs.close
stmt.close
ではなく
stmt.close
だけで問題ないですよ。
    • good
    • 0
この回答へのお礼

rs.nextで解決しました。皆さんの回答のすばやさに感謝です。rs.closeはなくてもいいという事なのでそこも削除しました。登録ページはこれでうまくいきました。うれしいです。どうもどうもありがとうございました。

お礼日時:2005/12/14 19:19

if(rs!=null)



の部分を、

if(rs.next())

ではどうでしょうか?
 要するに、データ項目の取得がfalseなら検索件数がゼロであると判断できるわけです。ResultSetは検索結果がゼロでもnullにはならないと思いましたが。検索された項目がなければ、ゼロ件のデータを持つテーブルを管理するインスタンスが返されるだけでしょう。
    • good
    • 0
この回答へのお礼

うまくrs.next()でうまくいきました有難うございました。こんな小さなミスでずっと色々探しまわっていて。。次にすすめるので良かったです。:)

お礼日時:2005/12/14 19:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています