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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

4回答

4907閲覧

java でsqldbからデータ取得してログイン処理の作成

S_kura

総合スコア12

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2019/05/29 05:56

編集2019/06/07 09:14

前提・実現したいこと

ログイン処理実現のため、入力された文字列をpostgresqlのdbで照合したい。
そのためにtestjavaでsqlに接続・文字取得できているか調べているのですがうまくできておりません。

発生してるエラーはなく、
DAOjavaの取得したい列名(rs.getStringの中身)を適当なものに書き換えると
org.postgresql.util.PSQLException: この ResultSet に列名 ●●●(書きかけた文字) ありません。

とでるのでsqldb取得まではできてると思います。
そこから文字列比較しようとしてるところで失敗に終わるのでどうしてそうなっているのか、アドバイスしていただけると助かります。

該当のソースコード

java

1package dao; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.PreparedStatement; 6import java.sql.ResultSet; 7import java.sql.SQLException; 8 9import model.Account; 10import model.Login; 11 12public class AccountDAO { 13 // データベース接続に使用する情報 14 private final String url = "jdbc:postgresql://127.0.0.1:5432/test"; 15 //private final String url ="jdbc:postgresql://127.0.0.1:5432/"; 16 private final String user = "postgres"; 17 private final String password = "postgres"; 18 19 public Account findByLogin(Login login) { 20 Account account = null; 21 22 // データベースへ接続 23 try (Connection conn = DriverManager.getConnection( 24 url, user, password)) { 25 26 // SELECT文を準備 27 String sql = "SELECT USER_ID, PASS, MAIL, NAME, AGE FROM ACCOUNT WHERE USER_ID = ? AND PASS = ?"; 28 PreparedStatement pStmt = conn.prepareStatement(sql); 29 pStmt.setString(1, login.getUserId()); 30 pStmt.setString(2, login.getPass()); 31 32 // SELECTを実行し、結果表を取得 33 ResultSet rs = pStmt.executeQuery(); 34 35 // 一致したユーザーが存在した場合 36 // そのユーザーを表すAccountインスタンスを生成 37 if (rs.next()) { 38 // 結果表からデータを取得 39 String userId = rs.getString("USER_ID"); 40 String pass = rs.getString("PASS"); 41 String mail = rs.getString("MAIL"); 42 String name = rs.getString("NAME"); 43 int age = rs.getInt("AGE"); 44 account = new Account(userId, pass, mail, name, age); 45 } 46 } catch (SQLException e) { 47 e.printStackTrace(); 48 return null; 49 } 50 // 見つかったユーザーまたはnullを返す 51 return null; 52 } 53} 54

java

1package model; 2 3public class Account { 4 private String userId; 5 private String pass; 6 private String mail; 7 private String name; 8 private int age; 9 10 public Account(String userId, String pass, String mail, 11 String name, int age) { 12 this.userId = userId; 13 this.pass = pass; 14 this.mail = mail; 15 this.name = name; 16 this.age = age; 17 } 18 19 public String getUserId() { 20 return userId; 21 } 22 23 public String getPass() { 24 return pass; 25 } 26 27 public String getMail() { 28 return mail; 29 } 30 31 public String getName() { 32 return name; 33 } 34 35 public int getAge() { 36 return age; 37 } 38} 39

java

1package model; 2 3public class Login { 4 private String userId; 5 private String pass; 6 7 public Login(String userId, String pass) { 8 this.userId = userId; 9 this.pass = pass; 10 } 11 12 public String getUserId() { 13 return userId; 14 } 15 16 public String getPass() { 17 return pass; 18 } 19}

java

1package test; 2 3import dao.AccountDAO; 4import model.Account; 5import model.Login; 6 7public class AccountDAOTest { 8 public static void main(String[] args) { 9 testFindByLogin1(); // ユーザーが見つかる場合のテスト 10 testFindByLogin2(); // ユーザーが見つからない場合のテスト 11 } 12 13 public static void testFindByLogin1() { 14 Login login = new Login("toumasu", "1212"); 15 AccountDAO dao = new AccountDAO(); 16 Account result = dao.findByLogin(login); 17 if (result != null && 18 result.getUserId().contentEquals("toumasu") && 19 result.getPass().contentEquals("1212") && 20 result.getMail().contentEquals("toumasuo@gmail.com") && 21 result.getName().contentEquals("トーマス") && 22 result.getAge() == 19) { 23 System.out.println("findByLogin1:成功しました"); 24 } else { 25 System.out.println("findByLogin1:失敗しました"); 26 } 27 } 28 29 public static void testFindByLogin2() { 30 Login login = new Login("toumasu", "12345"); 31 AccountDAO dao = new AccountDAO(); 32 Account result = dao.findByLogin(login); 33 if (result == null) { 34 System.out.println("findByLogin2:成功しました"); 35 } else { 36 System.out.println("findByLogin2:失敗しました"); 37 } 38 } 39}

java

java

補足情報

eclipse 
Version: 2018-12 (4.10.0)ールのバージョンなど)
PostgreSQL PgAdmin4 ver 3.5

ここにより詳細な情報を記載してください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rnosh

2019/06/07 04:17

最後にうまくいかないとありますが、どううまくいかなかったのでしょうか。 ページが遷移しないのか?照合の際にエラーが出るのか?エラーが出たならどんなエラーが出ているのか?などなど。 お力添えしたいと思いますが、どこでどう詰まっているのか、もう少し情報をいただけると回答できるかと思います。
guest

回答4

0

大前提ですが、formは入れ子にできません(HTMLの仕様です)

入れ子にされている場合(私はその大前提知っているのでやったことないですが)
中身の入力情報が正しく認識、送信されない可能性があります。
一回に送信したい情報全てを1つのformで囲いましょう。

「照合処理」のほうですが下記のSQLですと何も照合しようとしてないと思います。

java

1 String sql = "SELECT * FROM ユーザーログイン情報"; 2 rset = stmt.executeQuery(sql); 3

し、

下記の記述だと固定になっていますがこれは大丈夫ですか?

java

1 if (userid.equals("user01")&&pass.equals("taqusu"))//[23]

確かにuser01、taqusuと入れれば通るかもしれませんが・・・。

通常ですとSQLでuser_idとpasswordをWHERE句に入れて対応します。

sql

1SELECT * FROM ユーザーログイン情報 WHERE user_id = '入力ユーザーID' and password = '入力パスワード'

投稿2019/05/29 06:20

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

S_kura

2019/05/29 07:02

返信ありがとうございます。formの件については今現在問題なく動いてるのですが修正しておきます。 教えていただきありがとうございます。 そして記述足りていなくてすみません。 sqlコードのほうは完全に別のものです。 今現在jsp上の画面で入力された文字を3つめのSredirect.javaで決められた文字だけを照合してるだけのソースコードです。 そのコードに javaで書いたsqlコード組み込んで動作させたいと考えております。
m.ts10806

2019/05/29 07:17

では、ほぼそのまま移管して私が書いたような形でwhereにてid,passを検索するようにしてみては。 DB接続の処理も何も書かれていないのに「うまくいきません」と言われても「そもそも書いてないよね」から始まりますけど・・
S_kura

2019/05/30 07:05

申し訳ございません。この記事を投稿する前に移管しておりましたが、うまくできず別々のソースコードを張ったほうがいいと思い試したものははりませんでした。 ですが試した結果を張っておくべきでした申し訳ございません。 ppackage web1; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/Sredirect")//[1] public class Sredirect extends HttpServlet {//[2] protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//[3] response.setContentType("text/html; charset=UTF-8");//[4] //入力された単語を取得したのを変数に代入 String userid = request.getParameter("word"); String pass = request.getParameter("pass"); //sql Connection conn = null; Statement stmt = null; ResultSet rset = null; //sqlから取得した文字を代入 String name = null; String word = null; //接続文字列 String url = "jdbc:postgresql://127.0.0.1:5432/test"; String user = "postgres"; String password = "postgres"; try{ //PostgreSQLへ接続 conn = DriverManager.getConnection(url, user, password); //自動コミットOFF conn.setAutoCommit(false); //SELECT文の実行 stmt = conn.createStatement(); String sql = "SELECT * FROM ユーザーログイン情報 where ログインid ='"+userid+"' and パスワード = '"+pass+"'"; rset = stmt.executeQuery(sql); //SELECT結果の受け取り while(rset.next()) { name =rset.getString(1); word =rset.getString(2); } } catch (Exception ex) { ex.printStackTrace(); } finally { try { if(rset != null)rset.close(); if(stmt != null)stmt.close(); if(conn != null)conn.close(); } catch (SQLException e){ e.printStackTrace(); } } //単語をチェックするメソッドcheckword呼んで判定している if (!checkWord(name,word)) { ServletContext context = this.getServletContext(); RequestDispatcher dispatcher = context.getRequestDispatcher("/redirect.jsp"); dispatcher.forward(request, response); return; } ServletContext context = this.getServletContext(); RequestDispatcher dispatcher = context.getRequestDispatcher("/top.jsp"); dispatcher.forward(request, response); } // //メゾットチェックワードを定義 boolean checkWord(String name,String word){ if (name == null || word == null) return false; if (name.length() > 0 && word.length() > 0) return true; return false; } } 自分なりにやってみたのですが、name、wordにうまくsqlから取得した文字が代入されずトップ.jspのほうへいかずじまいです。 どのあたりを修正すればうまくいくでしょうか?
m.ts10806

2019/05/30 07:07

コメント欄ではマークダウンが使えません。 質問に追記してください。
S_kura

2019/05/30 07:23

たびたび申し訳ございません。
guest

0

自己解決

参照ファイルだけにsql.jarしていたため、java単体では動いていたがweb接続の時はwebにはドライブがないため接続されてなかった。
そのためプロジェクトファイル→プロパティからデブロイトメントアセンブリーにsqlドライブを追加したらwebでも接続ができるようになった

投稿2019/06/25 02:11

S_kura

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

とりあえず、別アカウントの質問でも聞きましたがどこでアカウント情報を返してるか把握してください。

// 見つかったユーザーまたはnullを返す return null;

常にnullです

投稿2019/06/07 09:47

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

EclipseやIntelliJ IDEAなどを使って、デバッグモードで

java

1 if (result != null && 2 result.getUserId().contentEquals("toumasu") && 3 result.getPass().contentEquals("1212") && 4 result.getMail().contentEquals("toumasuo@gmail.com") && 5 result.getName().contentEquals("トーマス") && 6 result.getAge() == 19) { 7 System.out.println("findByLogin1:成功しました"); 8 } else {

の部分でどこで違っているのかをブレークポイントをつけて探すか、
&& で繋がずに、1つ1つ比較してどこでfalseになっているかを調べるのが良いのではないでしょうか。

投稿2019/06/07 09:24

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/07 09:43

別アカウントでの質問あたりから指摘入れてるけど、ログイン情報を返してないからノットヌル判定がねー
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問