- PR -

チェックボックスについたところのみを変更したい

投稿者投稿内容
のび太
会議室デビュー日: 2004/03/13
投稿数: 10
投稿日時: 2004-03-13 21:48
JSPでMySQLのデータを読み込み、チェックボックスのチェックされたところだけを変更したいと思っています。
データベースのフィールドはNO、NAME、POINTです。
このデータベースのNAMEとPOINTを変えたいと思っています。

途中までプログラムを作ってみたのですが、
データベースの1行目はきちんと変更されるのですが、
2行目以降を変更しようとすると一行目のデータがコピーされてしまいます。
下のプログラムでのfor文のところが原因だと思います。
どう書いたらいいのか教えてください。
よろしくお願いします。

String[] aa = request.getParameterValues("c1");
String NAME = cnvString(request.getParameter("NAME"));
int POINT = Integer.parseInt(request.getParameter("POINT"));

Statement st = conn.createStatement();

↓ここの部分をどういうふうに書いたらいいのか教えてください。
----------------------------------------------------------
String sql = "UPDATE TABLE1 SET "
+ " NAME = '" + NAME + "', POINT = " + POINT
+ " WHERE (NO IN(";
for(int i=0;i < aa.length; i++){
sql += aa[i];
if (i < aa.length -1) {
sql += ",";
}
else {
sql += "))";
}
----------------------------------------------------------
st.executeUpdate(sql);
}

省略

<td><input type=\"checkbox\" name=\"c1\" value=\""+ rs.getInt("NO") + "\"></td>

省略
Cluster
ぬし
会議室デビュー日: 2003/03/06
投稿数: 289
お住まい・勤務地: 大阪
投稿日時: 2004-03-15 01:32
説明が不足してて、やりたいことがいまいち見えないのですが、


  1. TABLE1には、NO,NAME,POINTの3つのカラムがあり、NOが主キーである
  2. HTMLフォーム上にはc1という名前のチェックボックスが複数あり、それぞれのvalueに
    NOに相当する値が入っている
  3. HTMLフォーム上にはNAMEとPOINTは1つずつしかない
  4. チェックされたc1に相当するレコードについて、すべて同一のNAMEとPOINTで更新している

でやりたいことはあってますか?(ソースを見る限りではそう見えるのですが)

992029
会議室デビュー日: 2004/03/15
投稿数: 6
投稿日時: 2004-03-15 02:53
Clusterさん、ありがとうございます。
Clusterさんの言うとおりです。
説明が不足しており申し訳ありません。
よろしくお願い致します。
Cluster
ぬし
会議室デビュー日: 2003/03/06
投稿数: 289
お住まい・勤務地: 大阪
投稿日時: 2004-03-15 09:13
やりたいことが「すべて同一のNAMEとPOINTで更新する」なら、このSQL文で
あってるような・・・。
チェックを付けたNOについて、全て同じPOINT、NOに更新されると思うんですが。

引用:

データベースの1行目はきちんと変更されるのですが、
2行目以降を変更しようとすると一行目のデータがコピーされてしまいます。


これであってるのでは?同じNAME、POINTにしたいんですよね?

それと、SQL文の実行で思った通りにならないなら、実行の直前にSQL文を出力して
確認してみてはいかがでしょう?

System.out.println(sql);

という一文を、

st.executeUpdate(sql);

の前にいれてやるとか。
992029
会議室デビュー日: 2004/03/15
投稿数: 6
投稿日時: 2004-03-15 11:01
おはようございます。
返信ありがとうございます。

確かに、今のままだと「すべて同一のNAMEとPOINTで更新される」のですが、
「すべて同一のNAMEとPOINTで更新する」のではなく
チェックのついたそれぞれのNOについて、NAMEとPOINTを違う値で
更新したいと思っています。

よろしくお願いします。

永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2004-03-15 11:15
引用:

確かに、今のままだと「すべて同一のNAMEとPOINTで更新される」のですが、
「すべて同一のNAMEとPOINTで更新する」のではなく
チェックのついたそれぞれのNOについて、NAMEとPOINTを違う値で
更新したいと思っています。



とのことですが、同時に

引用:

HTMLフォーム上にはNAMEとPOINTは1つずつしかない



であると述べられています。「プログラムに何を参考にして値を決定させればいいのか」が不明です。
他のテーブルの内容を参照するですとか、HTMLのHIDDENなり入力テキストを反映するですとか、多分その辺のところだと思うのですが……もうちょっと状況を説明していただいて構わないでしょうか?
#それぞれの「NAME」と「POINT」の入力欄がHTML上に並んでいて、そのうちチェックボックスにチェックが入ったものだけをDBに反映かなとは思うのですが……
992029
会議室デビュー日: 2004/03/15
投稿数: 6
投稿日時: 2004-03-15 11:51
#それぞれの「NAME」と「POINT」の入力欄がHTML上に並んでいて、そのうちチェックボックスにチェックが入ったものだけをDBに反映かなとは思うのですが……

そのとおりです。
MySQLのTable1のデータは次のようになっています。

NO NAME POINT
------------------------
1 田中 90
2 石田 30
3 松井 60
4   黒田 70

HTML上ではテキストタイプで表示されており、その場で例えば
NO2の場合、石田→村上、30→80と書き換えてチェックボックスにチェックをして
更新ボタンを押すと

NO NAME POINT
------------------------
1 田中 90
2 村上 80
3 松井 60
4   黒田 70

このように更新されるようにしたいと思っております。

よろしくお願い致します。
Cluster
ぬし
会議室デビュー日: 2003/03/06
投稿数: 289
お住まい・勤務地: 大阪
投稿日時: 2004-03-15 12:16
引用:

4.チェックされたc1に相当するレコードについて、すべて同一のNAMEとPOINTで更新している


って聞いたら、
引用:

Clusterさんの言うとおりです。


って言ったじゃないですか・・・。ちゃんと読んでから返事してくださいね。

それはともかく、異なる値で更新したいなら、Update文を1レコードずつ作成し、
実行する必要があります。それなら、Where句でinなんて使う必要は無いです。
単純に、"Where NO = " + aa[i] というSQL文を更新したい数だけ繰り返し
作成し、実行するだけです。

SQL文はそれだけのことですが、それ以前の問題として、NAMEとPOINTが配列で
取れてません。(c1は配列で取ってるのに)
これでは、異なる値で更新なんてできるはずも無いです。

注:HTMLフォームがどうなっているのか定かでないですが、チェックボックスc1、
  テキストボックスPOINT・NAMEが単純に同数並んでいるのなら、単純に
  request.getParameterValues とするとうまくいきません。(配列がずれます)
  これは、HTTPの仕様で、チェックボックスはチェックしたものだけが
  送信されるからです。(テキストボックスは当然全て送信される)
  結果として、992029さんの例で言えば、
コード:
c1=[2]
NAME=["田中","村上","松井","黒田"]
POINT=["90","80","60","70"]


  という風に送信されます。ご注意下さい。

スキルアップ/キャリアアップ(JOB@IT)