だいたいのプログラム内容:
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が帰ってきます。
No.2ベストアンサー
- 回答日時:
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であれば存在しないという判断になるかと思います。
有難うございました。おかげさまでrs.next()でうまくいきました。ずっと解決方法を探し回ってたのに、ここですぐに間違いを指摘解決してもらえ、今まで探していた時間は、、と思いつつも、次にすすめホットしてます。どうもどうも。
No.3
- 回答日時:
既に、既出ですが
if(rs.next)とすれば良いと思います。
以下APIからの抜粋です。
「ResultSet のカーソルは、初期状態では最初の行の前に位置付けられています。メソッド next の最初の呼び出しによって、最初の行が現在の行になります。」
よって、nextでfalseが返されれば、データが1件も取得できなかったという判断が出来ます。
ちなみに、ResultSet オブジェクトは、オブジェクトを生成した Statement オブジェクトが閉じられるとき、自動的にクローズされるので、
rs.close
stmt.close
ではなく
stmt.close
だけで問題ないですよ。
rs.nextで解決しました。皆さんの回答のすばやさに感謝です。rs.closeはなくてもいいという事なのでそこも削除しました。登録ページはこれでうまくいきました。うれしいです。どうもどうもありがとうございました。
No.1
- 回答日時:
if(rs!=null)
の部分を、
if(rs.next())
ではどうでしょうか?
要するに、データ項目の取得がfalseなら検索件数がゼロであると判断できるわけです。ResultSetは検索結果がゼロでもnullにはならないと思いましたが。検索された項目がなければ、ゼロ件のデータを持つテーブルを管理するインスタンスが返されるだけでしょう。
うまくrs.next()でうまくいきました有難うございました。こんな小さなミスでずっと色々探しまわっていて。。次にすすめるので良かったです。:)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- その他(プログラミング・Web制作) laravel 本番環境でメールが送れません。 1 2023/02/17 17:57
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
VBAのWindowオブジェクトとWork...
-
C#でフォームのオブジェクト名...
-
オブジェクトに値を保持させる...
-
VBA 同じ名前のオブジェクトを...
-
Excelで =EMBED("Acrobat Docu...
-
ASP.NETから Java classファイル
-
Rangeオブジェクトを一時的に作...
-
多人数のじゃんけんプログラム
-
VBSでのステートメントの末尾が...
-
LISTBOXの内容が更新されま...
-
EXCEL VBAにて動的にCheckBOXを...
-
ActiveDirectoryのユーザ情報の...
-
Webアプリケーションのエラーメ...
-
JqueryとPrototypeの比較
-
開始日(Date型)から終了日(Date...
-
COMコンポーネントって何?
-
VBAでvlookup関数から、別シー...
-
Vbで通常使用するプリンターを...
-
Object型からDouble型へのキャスト
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
EXCEL VBAにて動的にCheckBOXを...
-
VBA 同じ名前のオブジェクトを...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
ワイルドカード<?>と型パラメー...
-
COMコンポーネントって何?
-
Object型からDouble型へのキャスト
-
LISTBOXの内容が更新されま...
-
オブジェクトレベルとメタレベル
-
ビジュアルC++でボタンの有...
-
戻り値がクラスオブジェクト
-
CoCreateInstanceでエラーになる。
-
Accessの連結・非連結オブジェ...
-
オブジェクト名をforループ内で...
-
JqueryとPrototypeの比較
-
JAVAからHTMLへ値を返す方法
-
VBAでvlookup関数から、別シー...
-
Vbで通常使用するプリンターを...
おすすめ情報