- PR -

webアプリでのデータベース更新処理とは

1
投稿者投稿内容
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2004-11-12 11:31
いつも御世話になります。とりあえず動くものをということで、社員管理のwebアプリを作ってみたのですが、チェックボックスにチェックが付いているもののみの更新処理がうまくいきません。説明がうまくできないのですが、ソースを見ていただくと自分のレベルがどれくらいのものなのかを分かっていただけると思うので書きます。

ベテランの方々からみると「なんでこんな書きかたしてんだろこいつ」と思われるところばっかりだと思うので、どっちかというと皆様ならこうするのにという感じのご返答をいただけたらなと思います。(その前にHTMLの勉強をしてこいって言われそう。。。)
見ずらいとは思いますがぜひともよろしくお願いします。

****** 社員情報変更ページ ********

<%@ page language="java" pageEncoding="EUC-JP"
import="kamiBeans.*,java.sql.*"%>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>社員情報変更</title>
</head>
<!--家族情報変更後ならスクリプトを書く-->
<%if(request.getAttribute("j_script_jump") != null){%>
<script language='JavaScript'>
function _jumpurl(url){
if(url != ''){window.location = url}
}
</script>
<body bgcolor="#FFFFFF" onload="_jumpurl('#kazoku')">
<%}else{%>
<body bgcolor="#FFFFFF">
<%}%>

<%String sid=request.getParameter("sid");

DbConnect db=new DbConnect();
DbConnect db2;
ResultSet rs;
ResultSet rs2;
String sql="select * from syainmasta sm"+
" left join busyo bu on sm.busyoid=bu.busyoid"+
" left join yakusyoku ya on sm.yakusyokuid=ya.yakusyokuid"+
" left join bloodtype bl on sm.bloodtypeid=bl.bloodid"+
" where syainid="+sid;
rs=db.selDb(sql);
if(rs.next()){%>
<table border='1' align='center'><form action='/web/servlet/SyainInfoChange' method='post'>
<tr><td colspan='2'><a href='#kazoku'>家族情報へ</a></td></tr>
<input type='hidden' name='sid' value='<%=sid%>'></input>
<tr><td>氏名</td><td><input type='text' size='50' name='simei' value='<%=rs.getString("simei")%>'></td></tr>
<tr><td>氏名フリガナ</td><td><input type='text' size='50' name='simei_furi' value='<%=rs.getString("simei_furi")%>'></td></tr>
<tr><td>住所</td><td><input type='text' size='50' name='juusyo' value='<%=rs.getString("juusyo")%>'></td></tr>
<tr><td>自宅電話番号</td><td><input type='text' size='50' name='tel' value='<%=rs.getString("tel")%>'></td></tr>
<tr><td>携帯電話番号</td><td><input type='text' size='50' name='keitai_tel' value='<%=rs.getString("keitai_tel")%>'></td></tr>
<tr><td>PCメールアドレス</td><td><input type='text' size='50' name='mail' value='<%=rs.getString("mail")%>'></td></tr>
<tr><td>携帯メールアドレス</td><td><input type='text' size='50' name='keitai_mail' value='<%=rs.getString("keitai_mail")%>'></td></tr>
<!--部署-->
<%sql="select * from busyo";
db2=new DbConnect();
rs2=db2.selDb(sql);
ComboRepNull cr=new ComboRepNull();%>
<tr><td>部署</td><td><%=cr.makeTagCombo(rs2,"busyoid","busyomeisyou","busyoid",rs.getInt("busyoid"))%></td></tr>

<!--役職-->
<%sql="select * from yakusyoku";
rs2=db2.selDb(sql);%>
<tr><td>役職</td><td><%=cr.makeTagCombo(rs2,"yakusyokuid","yakusyokumei","yakusyokuid",rs.getInt("yakusyokuid"))%></td></tr>

<!--血液型-->
<%sql="select * from bloodtype";
rs2=db2.selDb(sql);%>
<tr><td>血液型</td><td><%=cr.makeTagCombo(rs2,"bloodid","bloodtype","bloodid",rs.getInt("bloodid"))%></td></tr>

<!--誕生日-->

<%DaysSelect ds=new DaysSelect(rs.getDate("birthday"),1900,"birth");%>
<tr><td>誕生日</td><td><%=ds.makeTags()%></td></tr>

<!--取得免許-->
<%
sql="select * from menkyomasta";
rs=db.selDb(sql);
sql="select * from menkyojoukyou mj"+
" left join menkyomasta mm on mj.menkyoid=mm.menkyoid"+
" where mj.syainid="+sid;
rs2=db2.selDb(sql);%>
<tr><td>取得免許</td><td><table border='1' align='center'><tr align='center'><td>取得チェック</td><td>取得日</td><td>免許番号</td></tr>
<tr>

<%boolean flag=false;
String mname=null;

while(rs.next()){
flag=false;
rs2.beforeFirst();
while(rs2.next()){%>
<%if(rs.getString("menkyoid").equals(rs2.getString("menkyoid"))){
flag=true;
break;
}else{
flag=false;
}
}

ds=null;
mname="menkyosyutokubi"+rs.getString("menkyoid");
if(flag){%>
<td><input type='checkbox' name='menkyoid' value='<%=rs.getString("menkyoid")%>' checked><%=rs.getString("menkyomeisyou")%></td>
<%ds=new DaysSelect(rs2.getDate("syutokubi"),1900,mname);%>
<td><%=ds.makeTags()%></td>
<td><input type='text' size='25' name='menkyobangou_<%=rs.getString("menkyoid")%>' value='<%=rs2.getString("menkyobangou")%>'></td>
<%}else{%>
<td><input type='checkbox' name='menkyoid' value='<%=rs.getString("menkyoid")%>'><%=rs.getString("menkyomeisyou")%></td>
<%ds=new DaysSelect(null,1900,mname);%>
<td><%=ds.makeTags()%></td>
<td><input type='text' size='25' name='menkyobangou_<%=rs.getString("menkyoid")%>'></td>
<%}%>
</tr>
<%}%>
</table>
</td></tr>
<!--退職情報他-->
<%sql="select * from yesnos where syainid="+sid;
rs2=db2.selDb(sql);%>
<tr><td>その他情報</td><td>
<%if(rs2.next()){%>
<input type='checkbox' name='yesnos' value='1'>退職済みにする</input>
<%}%>
</td></tr>

<!--送信ボタン-->
<tr><td colspan='2' align='center'>
<input type='submit' name='kojininfochange' value='ここまでの情報を変更'></input>
</td></tr>
</form>

<!--家族の情報-->
<%sql="select * from kazokukousei kz left join zokugara zk on kz.zokugaraid=zk.zokugaraid"+
" where syainid="+sid;
rs2=db2.selDb(sql);%>
<tr><td><a name='kazoku'>家族情報</a></td><td><table border='1' align='center'>
<%if(rs2.next()){%>
<tr align='center'><td colspan='2'>氏名(フリガナ)</td><td>続柄</td><td>生年月日</td><td>削除</td></tr>
<%}rs2.beforeFirst();//ifでつかったrs2を使う前の状態に戻す%>
<%MyRs mrs2=new MyRs(rs2);%>
<%while(mrs2.next()){%>
<tr><td colspan='2'><%=mrs2.getString("simei")%>(<%=mrs2.getString("simei_furi")%>)</td>
<td><%=mrs2.getString("zokuname")%></td><td><%=mrs2.getMyDate("birthday")%></td><td><!--削除ボタン-->
<form action='/web/servlet/SyainKazokuInfoChange' method='post'>
<input type='hidden' name='sid' value='<%=sid%>'></input>
<input type='hidden' name='kid' value='<%=mrs2.getString("kazokukouseiid")%>'></input>
<input type='submit' value='この情報を削除' name='sakujo'></input>
</form>
</td></tr>
<%}
mrs2.close();%>
<tr><td colspan='5' align='center'>追加する情報を入力</td></tr>
<tr align='center'><td>氏名</td><td>氏名フリガナ</td><td>続柄</td><td>生年月日</td><td>追加</td></tr>
<form action='/web/servlet/SyainKazokuInfoChange' method='post'>
<tr><td><input type='text' size='25' name='k_simei'></td>
<td><input type='text' size='25' name='k_simei_furi'></td>
<%sql="select * from zokugara";
rs2=db2.selDb(sql);%>
<td><%=cr.makeTagCombo(rs2,"zokugaraid","zokuname","zokugaraid",0)%></td>
<%ds=new DaysSelect(1900,"birth");%>
<td><%=ds.makeTags()%></td>
<input type='hidden' name='sid' value='<%=sid%>'></input>

<!--追加ボタン--><td><input type='submit' name='tuika' value='この情報を追加'></input></td></tr>
</form>
</table></td></tr>
</table><!--一番外側のテーブルタグ-->
<%rs.close();rs2.close();db.close();db2.close();}else{%>
えらー
<%}%>
</body>
</html>

****** DbConnect.java ***********

/*
* 作成日: 2004/10/18
*
* この生成されたコメントの挿入されるテンプレートを変更するため
* ウィンドウ > 設定 > Java > コード生成 > コードとコメント
*/
package kamiBeans;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
* @author root
*
* この生成されたコメントの挿入されるテンプレートを変更するため
* ウィンドウ > 設定 > Java > コード生成 > コードとコメント
*/
public class DbConnect {
protected Connection con;

public DbConnect() throws SQLException, ClassNotFoundException{
this("*******");
}

public DbConnect(String database) throws SQLException, ClassNotFoundException{
String driver="com.mysql.jdbc.Driver";
String url="jdbc:mysql://localhost/"+database+"?useUnicode=true&characterEncoding=ujis";//EUC=JPから変更
String user="********";
String pass="********";
Class.forName(driver);
con=DriverManager.getConnection(url,user,pass);
}


public synchronized ResultSet selDb(String sql) throws SQLException{
Statement st=con.createStatement();
return st.executeQuery(sql);
}

public synchronized int exeDb(String sql) throws SQLException{
Statement st=con.createStatement();
return st.executeUpdate(sql);
}

public void close() throws SQLException{
con.close();
}


}

******** SyainInfoChange.java ********

import java.io.IOException;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kamiBeans.DbConnect;

/*
* 作成日: 2004/10/23
*
* この生成されたコメントの挿入されるテンプレートを変更するため
* ウィンドウ > 設定 > Java > コード生成 > コードとコメント
*/

/**
* @author root
*
* この生成されたコメントの挿入されるテンプレートを変更するため
* ウィンドウ > 設定 > Java > コード生成 > コードとコメント
*/
public class SyainInfoChange extends HttpServlet {

protected void doPost(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
//リクエストから全てを変数に
String sid=new String(request.getParameter("sid").getBytes("iso-8859-1"),"EUC-JP");
String simei=new String(request.getParameter("simei").getBytes("iso-8859-1"),"EUC-JP");
String simei_furi=new String(request.getParameter("simei_furi").getBytes("iso-8859-1"),"EUC-JP");
String juusyo=new String(request.getParameter("juusyo").getBytes("iso-8859-1"),"EUC-JP");
String tel=new String(request.getParameter("tel").getBytes("iso-8859-1"),"EUC-JP");
String keitai_tel=new String(request.getParameter("keitai_tel").getBytes("iso-8859-1"),"EUC-JP");
String mail=new String(request.getParameter("mail").getBytes("iso-8859-1"),"EUC-JP");
String keitai_mail=new String(request.getParameter("keitai_mail").getBytes("iso-8859-1"),"EUC-JP");
String busyoid=new String(request.getParameter("busyoid").getBytes("iso-8859-1"),"EUC-JP");
String yakusyokuid=new String(request.getParameter("yakusyokuid").getBytes("iso-8859-1"),"EUC-JP");
String bloodid=new String(request.getParameter("bloodid").getBytes("iso-8859-1"),"EUC-JP");
String birth_y=new String(request.getParameter("y_birth").getBytes("iso-8859-1"),"EUC-JP");
String birth_m=new String(request.getParameter("m_birth").getBytes("iso-8859-1"),"EUC-JP");
String birth_d=new String(request.getParameter("d_birth").getBytes("iso-8859-1"),"EUC-JP");
String[] menkyoid=request.getParameterValues("menkyoid");
String yesnos=request.getParameter("yesnos");
String kojininfochange=request.getParameter("kojininfochange");
request.setCharacterEncoding("EUC-JP");
response.setContentType("text/html; charset=EUC-JP");
//誕生日用フォーマット
String fo_birth=birth_y+"-"+birth_m+"-"+birth_d;
//社員マスタアップデート用sql
String sql="update syainmasta set simei='"+simei+"'"+
" ,simei_furi='"+simei_furi+"'"+
" ,juusyo='"+juusyo+"'"+
" ,tel='"+tel+"'"+
" ,keitai_tel='"+keitai_tel+"'"+
" ,mail='"+mail+"'"+
" ,keitai_mail='"+keitai_mail+"'"+
" ,busyoid="+busyoid+
" ,yakusyokuid="+yakusyokuid+
" ,bloodtypeid="+bloodid+
" ,birthday='"+fo_birth+"'"+
" where syainid="+sid;
String sql_delmenkyo=null;
String sql_tuikamenkyo=null;
String sql_yesnos=null;
//コネクション宣言
DbConnect db;
if(kojininfochange!=null){
try {
db=new DbConnect();
db.exeDb(sql);

//免許情報削除sql+処理
sql_delmenkyo="delete from menkyojoukyou where syainid="+sid;
db.exeDb(sql_delmenkyo);

//免許情報追加sql+処理
if(menkyoid!=null){
for(int i=0;i<menkyoid.length;i++){
String y_menkyosyutokubi=request.getParameter("y_menkyosyutokubi"+(i+1));
String m_menkyosyutokubi=request.getParameter("m_menkyosyutokubi"+(i+1));
String d_menkyosyutokubi=request.getParameter("d_menkyosyutokubi"+(i+1));
String menkyosyutokubi=y_menkyosyutokubi+"-"+m_menkyosyutokubi+"-"+d_menkyosyutokubi;
int j=i+1;
String menkyobangou=request.getParameter("menkyobangou_"+j);
sql_tuikamenkyo="insert into menkyojoukyou(syainid,menkyoid,syutokubi,menkyobangou) values("+sid+","+menkyoid[i]+
",'"+menkyosyutokubi+"','"+menkyobangou+"')";
db.exeDb(sql_tuikamenkyo);
}
}

//退職にチェックが付いていれば退職情報追加sql+処理
if(yesnos!=null){
sql_yesnos="update yesnos set istaisyokuzumi=1 where syainid="+sid;
db.exeDb(sql_yesnos);
}

db.close();
request.setAttribute("j_script_jump","#"+sid);
getServletContext().getRequestDispatcher("/jsp/syain/syainhyouji.jsp").forward(request,response);
} catch (ClassNotFoundException e) {
request.setAttribute("msg","class");
getServletContext().getRequestDispatcher("/jsp/error.jsp").forward(request,response);
} catch (SQLException e) {
request.setAttribute("msg",e.getMessage());
request.setAttribute("msg2",sql_tuikamenkyo);
getServletContext().getRequestDispatcher("/jsp/error.jsp").forward(request,response);
}


}


}
}

****** SqlExe.java *******

/*
* 作成日: 2004/11/07
*
* この生成されたコメントの挿入されるテンプレートを変更するため
* ウィンドウ > 設定 > Java > コード生成 > コードとコメント
*/
package kamiBeans;

import java.sql.ResultSet;
import java.sql.SQLException;

/**
* @author root
*
* この生成されたコメントの挿入されるテンプレートを変更するため
* ウィンドウ > 設定 > Java > コード生成 > コードとコメント
*/
public class SqlExe {
public SqlExe(){
}

public boolean isExistSelect(String[] args) throws SQLException, ClassNotFoundException{
int whereCount=Integer.parseInt(args[0])*2;
String selectSql="select * from "+args[1]+" where";

for(int i=2;i<whereCount+2;i+=2){
if(i != whereCount){
selectSql+=" "+args[i]+"="+args[i+1]+" and";
}else{
selectSql+=" "+args[i]+"="+args[i+1];
}
}

DbConnect db=new DbConnect();
ResultSet rs=null;
rs=db.selDb(selectSql);

if(rs.next()){
rs.close();
db.close();
return true;
}else{
rs.close();
db.close();
return false;
}
}

public int updateSql(String[] args) throws SQLException, ClassNotFoundException{
if(isExistSelect(args)){
String sql="update "+args[1]+" set ";
int whereCount=Integer.parseInt(args[0])*2;
int i_start=2+whereCount;
int i=0;
for(i=i_start;i<args.length;i+=2){
if(i != args.length-2){
sql+=" "+args[i]+"='"+args[i+1]+"',";
}else{
sql+=" "+args[i]+"='"+args[i+1]+"'";
}
}
sql+=" where";
for(i=2;i<whereCount+1;i+=2){
if(i != whereCount){
sql+=" "+args[i]+"='"+args[i+1]+"' and";
}else{
sql+=" "+args[i]+"='"+args[i+1]+"'";
}
}

DbConnect db=new DbConnect();
int re=db.exeDb(sql);
db.close();
return re;
}else{
return 0;
}
}

public int insertSql(String[] args) throws SQLException, ClassNotFoundException{
if(!isExistSelect(args)){
String sql="insert into "+args[1]+" (";
String values="";
int i=0;
for(i=2;i<args.length;i+=2){
if(i != args.length-2){
sql+=args[i]+",";
values+="'"+args[i+1]+"',";
}else{
sql+=args[i]+")";
values+="'"+args[i+1]+"')";
}
}
sql+=" values("+values;

DbConnect db=new DbConnect();
int re=db.exeDb(sql);
db.close();
return re;
}else{
return 0;
}
}

public int deleteSql(String[] args) throws SQLException, ClassNotFoundException{
if(isExistSelect(args)){
int whereCount=Integer.parseInt(args[0])*2;
String selectSql="delete from "+args[1]+" where";

for(int i=2;i<whereCount+2;i+=2){
if(i != whereCount){
selectSql+=" "+args[i]+"="+args[i+1]+" and";
}else{
selectSql+=" "+args[i]+"="+args[i+1];
}
}

DbConnect db=new DbConnect();
int re=db.exeDb(selectSql);
db.close();
return re;
}else{
return 0;
}
}


}

**** DaysSelect.java (日付け選択プルダウンボックスタグを作る) **

/*
* 作成日: 2004/10/26
*
* この生成されたコメントの挿入されるテンプレートを変更するため
* ウィンドウ > 設定 > Java > コード生成 > コードとコメント
*/
package kamiBeans;

import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Calendar;

/**
* @author root
*
* この生成されたコメントの挿入されるテンプレートを変更するため
* ウィンドウ > 設定 > Java > コード生成 > コードとコメント
*/
public class DaysSelect {
Date _date=null;
int _kijun_y=0;
String _form_name=null;
java.util.Date _toY=null;

public DaysSelect(int kijun_y,String form_name){
_date=new Date(System.currentTimeMillis());
_kijun_y=kijun_y;
_form_name=form_name;
java.util.Date now_date=null;
_toY=Calendar.getInstance().getTime();

}

public DaysSelect(Date date,int kijun_y,String form_name){
_date=date;
_kijun_y=kijun_y;
_form_name=form_name;
java.util.Date now_date=null;
_toY=Calendar.getInstance().getTime();

}

public DaysSelect(Date date,int kijun_y,String form_name,int toY){
_date=date;
_kijun_y=kijun_y;
_form_name=form_name;
_toY=getYear(toY);
}

private Date getYear(int year){
Date date_y=null;
String d=year+"-01-01";
date_y=Date.valueOf(d);
return date_y;
}


public String makeTags(){
if(_date==null){
_date=Date.valueOf(_kijun_y+"-01-01");
}

SimpleDateFormat si_y=new SimpleDateFormat("yyyy");
SimpleDateFormat si_m=new SimpleDateFormat("MM");
SimpleDateFormat si_d=new SimpleDateFormat("dd");
SimpleDateFormat si_ge=new SimpleDateFormat("yyyy'年'");
int i=0;

//年の処理はじまり
String tags="<!--"+_form_name+"-->"+
"<select name='y_"+_form_name+"'>";

int toY= Integer.parseInt(si_y.format(_toY));
int myY=Integer.parseInt(si_y.format(_date));

for(i=_kijun_y;i<toY+1;i++){
if(i==myY){
tags+="<option value='"+i+"' selected>"+si_ge.format(getYear(i));
}else{
tags+="<option value='"+i+"'>"+si_ge.format(getYear(i));
}
}
tags+="</select>";
//年の処理終了

//月の処理はじまり
tags+="<select name='m_"+_form_name+"'>";
int myM=Integer.parseInt(si_m.format(_date));
String i1=null;
String retStr = null;
for(i=1;i<13;i++){
if(i<10){i1="0"+i;}else{i1=String.valueOf(i);}
if(i==myM){
tags+="<option value='"+i1+"' selected>"+i1+"月";
}else{
tags+="<option value='"+i1+"'>"+i1+"月";
}
}
tags+="</select>";
//月の処理終了

//日の処理はじまり
tags+="<select name='d_"+_form_name+"'>";
int myD=Integer.parseInt(si_d.format(_date));

for(i=1;i<32;i++){
if(i<10){i1="0"+i;}else{i1=String.valueOf(i);}
if(i==myD){
tags+="<option value='"+i1+"' selected>"+i1+"日";
}else{
tags+="<option value='"+i1+"'>"+i1+"日";
}
}
tags+="</select>";
//月の処理終了
return tags;

}


}
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-11-12 12:28
まず、「うまくいきません」だけではなにがうまくいかないのかわかりません。エラーが
出るのであればエラーメッセージを、エラーは出ないが期待した結果にならないのであれば
どのような結果を期待してどのような結果になっているのか、を書いてください。

それからソースを全部貼り付けられても、よほど暇でない限り全部読む気にはなれないと
思います。なるべく関連のありそうな箇所に絞ってください。
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2004-11-12 17:20
ご返答ありがとうございます。開発環境さえ書いていませんでした。大変失礼致しました。
j2sdk1.4.2_05、tomcat5.0.24、MYSQL4.1.5gammaです。

社員情報を管理できるページを作成しています。変更画面を作成しているのですが、チェックボックスを情報数分ループさせて作り、更新する処理がうまくいきません。
その情報と言うのも個人が持っている免許情報なのですが、

免許名(チェックボックス) | 取得日(プルダウン) | 免許番号(テキストボックス)

の様に作っています。ソースでは、

<!--取得免許-->

<tr><td>取得免許</td><td><table border='1' align='center'><tr align='center'><td>取得チェック</td><td>取得日</td><td>免許番号</td></tr>
<tr>
<td><input type='checkbox' name='menkyoid' value='1' checked>普通自動車</td>

<td><!--menkyosyutokubi1-->
<select name='y_menkyosyutokubi1'>
<option value='2003'>2003年
<option value='2004'>2004年
</select>
<select name='m_menkyosyutokubi1'>
<option value='01' selected>01月
<option value='02'>02月 <!--他の月は省略-->
</select>
<select name='d_menkyosyutokubi1'>
<option value='01' selected>01日
<option value='02'>02日 <!--他の日は省略-->
</select></td>

<td><input type='text' size='25' name='menkyobangou_1' value='koko'></td>

</tr>

分かりにくいとは思いますが、チェックボックスにチェックが付いているときは、取得日と免許番号の値をサーブレットに渡してinsert処理をmysqlに対して行います。変更があるたびにその社員の免許情報を全部削除してチェックボックスにチェックが付いているものを再度insert処理し直しています。

**** サーブレット側免許更新処理 ********

String[] menkyoid=request.getParameterValues("menkyoid");


//免許情報削除sql+処理
sql_delmenkyo="delete from menkyojoukyou where syainid="+sid;
db.exeDb(sql_delmenkyo);

//免許情報追加sql+処理
if(menkyoid!=null){
for(int i=0;i<menkyoid.length;i++){
String y_menkyosyutokubi=request.getParameter("y_menkyosyutokubi"+(i+1));
String m_menkyosyutokubi=request.getParameter("m_menkyosyutokubi"+(i+1));
String d_menkyosyutokubi=request.getParameter("d_menkyosyutokubi"+(i+1));
String menkyosyutokubi=y_menkyosyutokubi+"-"+m_menkyosyutokubi+"-"+d_menkyosyutokubi;
int j=i+1;
String menkyobangou=request.getParameter("menkyobangou_"+j);
sql_tuikamenkyo="insert into menkyojoukyou(syainid,menkyoid,syutokubi,menkyobangou) values("+sid+","+menkyoid[i]+
",'"+menkyosyutokubi+"','"+menkyobangou+"')";
db.exeDb(sql_tuikamenkyo);
}
}


この処理が成功する場合と失敗する場合があります。
☆成功する場合
・ループで作った一番最初の免許情報(チェックボックス)のみがチェックされている場合。
・ループで作った一番最初の免許情報(チェックボックス)から、何件か連続でチェックされている場合。

失敗するのは、ループで作った免許情報(チェックボックス)を飛び飛びでチェックする場合です。一番最初の情報から連続してチェックしている部分に関しては正しく処理できるのに、飛んでチェックしている部分はチェックボックスの情報は丈夫なのですが、取得日情報と免許番号が空白になってしまいます。sqlのログを見てみてもテキスト部分が「''」になってしまいます。飛び飛びでもちゃんと処理されるようにしたいのですが、どこの部分のソースをのせればいいのかがいまいち分からないので、どの部分をのせたほうがいいのかご指摘いただけると幸いです。
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2004-11-12 17:44
こんにちは
ちょっと、確認を・・・。
引用:

String[] menkyoid=request.getParameterValues("menkyoid");


でmenkyoidの配列の値は何が入っていると思いますか?
チェックボックスにチェックが付いている時・付いていない時で
どのようにサーバへ要求がくるのかを理解していますか?

[以下追記]
すみません。時間がないので・・・
<input type='checkbox' name='menkyoid' value='1' checked>A
<input type='checkbox' name='menkyoid' value='2'>B
でAにチェックを入れた場合 menkyouid=1でリクエストがきます。
Bにチェックを入れた場合 menkyouid=2でリクエストがきます。
A,B友のチェックを入れた場合、menkyouid=1&menkyouid=2でリクエストがきます。

で、takuさんのソース
引用:

for(int i=0;i<menkyoid.length;i++){
String y_menkyosyutokubi=request.getParameter("y_menkyosyutokubi"+(i+1));
}


でy_menkyosyutokubiXのX部分にループカウンタ+1の値を使っていますよね。
なんで、Bのみを選択した場合、
y_menkyosyutokubi2の値を取得したいのに、
y_menkyosyutokubi1の値を取得しているんではないですか?


[ メッセージ編集済み 編集者: 夏椰 編集日時 2004-11-12 18:05 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-11-12 18:10
引用:

夏椰さんの書き込み (2004-11-12 17:44) より:
で、takuさんのソース
引用:

for(int i=0;i<menkyoid.length;i++){
String y_menkyosyutokubi=request.getParameter("y_menkyosyutokubi"+(i+1));
}


でy_menkyosyutokubiXのX部分にループカウンタ+1の値を使っていますよね。


おそらくこの部分は、
String y_menkyosyutokubi=request.getParameter("y_menkyosyutokubi"+menkyoid[i]);
と書けば意図どおりに動くのではないか、と思います。だってパラメータ名のサフィックスに
menkyoidを付加していますよね? ですから取得するときもそうやって取ればいいのではない
ですか?
#他の部分も同様
影フリー
常連さん
会議室デビュー日: 2004/11/12
投稿数: 39
お住まい・勤務地: 東京都
投稿日時: 2004-11-12 18:15
難しいですね。
間違っているのはここです。
if(menkyoid!=null){
for(int i=0;i<menkyoid.length;i++){
String y_menkyosyutokubi=request.getParameter("y_menkyosyutokubi"+(i+1));
String m_menkyosyutokubi=request.getParameter("m_menkyosyutokubi"+(i+1));
String d_menkyosyutokubi=request.getParameter("d_menkyosyutokubi"+(i+1));
String menkyosyutokubi=y_menkyosyutokubi+"-"+m_menkyosyutokubi+"-"+d_menkyosyutokubi;
int j=i+1;
.
.

String[] menkyoid=request.getParameterValues("menkyoid"); はチェックされた順番の
番号が入ってます。たとえば0,2,4番目がチェックされた場合
menkyoid.lengthは3であり、上のループは3回まわします。
更新したいのは0,2,4番目ですが上のループはただi++のところで3回まわしてSTOPになります。

よく考えてみてください。


[ メッセージ編集済み 編集者: 影フリー 編集日時 2004-11-12 18:18 ]
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2004-11-13 15:07
皆様、問題点が分かりにくかったにもかかわらずいろいろご指摘いただきありがとうございます。
結局、影フリーさんのおっしゃるように、配列のループ操作に問題があったようです。

if(menkyoid!=null){
for(int i=0;i<menkyoid.length;i++){
String y_menkyosyutokubi=request.getParameter("y_menkyosyutokubi"+menkyoid[i]);
String m_menkyosyutokubi=request.getParameter("m_menkyosyutokubi"+menkyoid[i]);
String d_menkyosyutokubi=request.getParameter("d_menkyosyutokubi"+menkyoid[i]);
String menkyosyutokubi=y_menkyosyutokubi+"-"+m_menkyosyutokubi+"-"+d_menkyosyutokubi;

に変更することによって、期待通りの動きになりました。
ありがとうございました。
1

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