teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

修正

2019/05/24 06:05

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -11,4 +11,53 @@
11
11
  0. 絞込検索のときにプリペアドステートメントを利用する:[prepareStatementの使用](https://www.javadrive.jp/servlet/database/index10.html)
12
12
 
13
13
  という感じです。
14
- あとは任意のデータが取得出来たらそれをもとに実現したい処理を入れていきます。
14
+ あとは任意のデータが取得出来たらそれをもとに実現したい処理を入れていきます。
15
+
16
+ コード追記を受けて
17
+ ---
18
+
19
+ 流れを提示したところでちょっと説明不足があったかもしれませんが、
20
+ 1,2については**DBに対して直接SQLを実行してください。**
21
+ SQLはプログラムからすると外部のサービスです。
22
+ 外部のサービスを利用する際は、いきなりプログラムを経由するのではなく、直接実行してみて実行できるかどうか確かめて、想定通りの結果が得られるパラメータをそのまま利用します。
23
+
24
+ 下記ですが、直接DBに対して実行してみましたか?
25
+ `SELECT * FROM mydb.users where name = ?,?`
26
+
27
+ 2.で提示したリンクに name = ?,? のような書き方はなかったはずです(コンマで区切っているところ)
28
+ 提示リンクより引用しますが、複数条件を指定したい場合はANDやORなどでつなぎます
29
+ > SELECT * FROM personal WHERE address='Osaka' AND old>=20;
30
+
31
+ マニュアルも確認してください→ [SELECT構文](https://dev.mysql.com/doc/refman/5.6/ja/select.html)
32
+
33
+ 今回はnameで検索したいようですから`,?`は不要です。
34
+ `SELECT * FROM mydb.users where name = ?`
35
+
36
+ ただDBに対して実行する場合は`?`ではいけないので適当な値をおいて実行します。
37
+ `SELECT * FROM mydb.users where name = '山田太郎'`
38
+
39
+ これが通るか確認してください。
40
+
41
+ ※今後SELECT以外も使うようになると思いますが、必ず直接DBに実行して想定通りの結果が得られるSQLを使うようにしてください。いきなりプログラムから実行してしまっては問題の切り分けが難しくなります。
42
+
43
+ 次。
44
+ ```
45
+ String sqlStr = "SELECT * FROM mydb.users where name = ?,?;";
46
+ st.setString(1, "山田太郎");
47
+ ```
48
+ プリペアドステートメントはまずSQLでバインド待ち(`?`)の値をバインドしてからDBに届けます。
49
+ このSQL上ではバインド待ちが2つあるのでsetも同じ数必要です。
50
+
51
+ おそらくでエラーになっているのでは(つまり、セット予定と実際にセットされた値の数が合わない)
52
+
53
+ 私が提示した4番目の記事にも書いてありますね。
54
+ > この例では実際に挿入する値を記述箇所に「?」を使っています。2箇所使っていますので、後からパラメータを2つ指定する必要があります。
55
+ > パラメータはSQL文中に記述された「?」を先頭から順番に1,2,3、・・・と順番に番号が割り当てられています。1番目のメソッドにはパラメータの番号を指定し、2番目の引数にパラメータに設定したい値を記述します。
56
+
57
+ あとは型を適切に設定してください。
58
+
59
+ 元々のSQLの間違いをなおせばsetは1つで良くなります。
60
+
61
+ *蛇足確認
62
+ これは仕様部分なのですが、nameで検索しようとしていますが、これはあくまで検証のためですよね?
63
+ 通常ログインといったらユーザIDとPASSを半角英数で入力するので・・。