こんにちは、初めまして。
自作の掲示板を作ろうとしてる大学生です。
さっそく質問なのですが、P72〜75のpasswordカラムと入力欄の追加という節のwrite_2.jspの網掛けの部分を追記したところエラーが起こるようになってしまいました。
開発環境がeclipseのせいなのかわかりませんが以下のようなエラーが出ました。
MySQL上でpasswordのテーブルも作ってあります。
INSERT INTO bbs (date_time,author,subject,body,password)にしてパスワードに書き込めるようにもしています。
JAVA初心者なので稚拙な質問で申し訳ありませんが、どうかご指導のほどよろしくお願い致します。
type 例外レポート
メッセージ
説明 The server encountered an internal error () that prevented it from fulfilling this request.
例外
org.apache.jasper.JasperException: An exception occurred processing JSP page /write_2.jsp at line 27
24: + TextConv.beforeSql(strSubject) + "','"
25: + TextConv.beforeSql(strBody) + "',"
26: + "password('" + TextConv.beforeSql(strPassword) + "') )";
27: stmt.executeUpdate(strSql);
28: conn.close();
29: Cookie coo = new Cookie("auther",java.net.URLEncoder.encode(strAuthor,"Windows-31J"));
30: coo.setMaxAge(60*60*24*30);
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:524)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:417)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
原因
javax.servlet.ServletException: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'password' at row 1
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:850)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:779)
org.apache.jsp.write_005f2_jsp._jspService(write_005f2_jsp.java:100)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
原因
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'password' at row 1
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2983)
com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
com.mysql.jdbc.Connection.execSQL(Connection.java:3277)
com.mysql.jdbc.Statement.executeUpdate(Statement.java:1402)
com.mysql.jdbc.Statement.executeUpdate(Statement.java:1317)
org.apache.jsp.write_005f2_jsp._jspService(write_005f2_jsp.java:83)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
自作の掲示板を作ろうとしてる大学生です。
さっそく質問なのですが、P72〜75のpasswordカラムと入力欄の追加という節のwrite_2.jspの網掛けの部分を追記したところエラーが起こるようになってしまいました。
開発環境がeclipseのせいなのかわかりませんが以下のようなエラーが出ました。
MySQL上でpasswordのテーブルも作ってあります。
INSERT INTO bbs (date_time,author,subject,body,password)にしてパスワードに書き込めるようにもしています。
JAVA初心者なので稚拙な質問で申し訳ありませんが、どうかご指導のほどよろしくお願い致します。
type 例外レポート
メッセージ
説明 The server encountered an internal error () that prevented it from fulfilling this request.
例外
org.apache.jasper.JasperException: An exception occurred processing JSP page /write_2.jsp at line 27
24: + TextConv.beforeSql(strSubject) + "','"
25: + TextConv.beforeSql(strBody) + "',"
26: + "password('" + TextConv.beforeSql(strPassword) + "') )";
27: stmt.executeUpdate(strSql);
28: conn.close();
29: Cookie coo = new Cookie("auther",java.net.URLEncoder.encode(strAuthor,"Windows-31J"));
30: coo.setMaxAge(60*60*24*30);
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:524)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:417)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
原因
javax.servlet.ServletException: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'password' at row 1
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:850)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:779)
org.apache.jsp.write_005f2_jsp._jspService(write_005f2_jsp.java:100)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
原因
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'password' at row 1
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2983)
com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
com.mysql.jdbc.Connection.execSQL(Connection.java:3277)
com.mysql.jdbc.Statement.executeUpdate(Statement.java:1402)
com.mysql.jdbc.Statement.executeUpdate(Statement.java:1317)
org.apache.jsp.write_005f2_jsp._jspService(write_005f2_jsp.java:83)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
投稿:kyo[nym0537]/2009年 01月 26日 17時 04分
/更新:2009年 01月 26日 17時 05分
RE:Java+MySQL+Tomcatで作る掲示板とブログP72〜75
by 竹形 誠司[takegata]
竹形です。こんにちは。
エラーの原因は
MySQLでは、password関数で文字列をハッシュ値に変換しますが、本書で扱っているバージョンでは、変換後のハッシュ値が16文字だったのが、最近のバージョンでは41文字になっています。本書のp70では
エラーの原因は
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'password' at row 1
を見ると分かるのですが、エラーメッセージでは「passwordカラムのデータが長すぎる」と言っています。恐らく原因は、本書で扱っているMySQLより新しいバージョンを使っているためではないかと思います。MySQLでは、password関数で文字列をハッシュ値に変換しますが、本書で扱っているバージョンでは、変換後のハッシュ値が16文字だったのが、最近のバージョンでは41文字になっています。本書のp70では
alter table bbs add password varchar(20);
を実行していますが、新しいバージョンのMySQLを使用する場合はvarcharの文字数指定を41以上にする必要があるわけです。次のようなSQL文でこのカラムの文字数を修正できます。alter table bbs modify password varchar(41);
これでうまくいかなければ、また質問してください。
投稿:竹形 誠司[takegata]/2009年 01月 26日 18時 39分
/更新:2009年 01月 26日 18時 42分
上記の方法を取ったところ無事解決しました、感謝いたします。
説明までして下さりとても勉強になりました。
また自力で調べても分からなくなった時は来させて頂きます。
では失礼します。
説明までして下さりとても勉強になりました。
また自力で調べても分からなくなった時は来させて頂きます。
では失礼します。
投稿:kyo[nym0537]/2009年 01月 26日 19時 43分
/更新:2009年 01月 26日 19時 43分
学生さんに読んでいただけるのはとても嬉しいです。いつでも質問してください。
ただ、この本は少し内容が古いので、新しい情報も参考にしてくださいね。
たとえば、本書では、SQL文を実行する際にStatementクラスを使っていますが、その後のバージョンで使えるようになったPreparedStatementクラスの方がお勧めです。
PreparedStatementの使い方については、その後に上梓した「Java+MySQL+Tomcatで始めるWebアプリケーション構築入門」のP.188あたりに書きました。近いうちに要所を本ブログにもまとめたいと思っています。
#そろそろ改定が必要ですね。がんばります。
ただ、この本は少し内容が古いので、新しい情報も参考にしてくださいね。
たとえば、本書では、SQL文を実行する際にStatementクラスを使っていますが、その後のバージョンで使えるようになったPreparedStatementクラスの方がお勧めです。
PreparedStatementの使い方については、その後に上梓した「Java+MySQL+Tomcatで始めるWebアプリケーション構築入門」のP.188あたりに書きました。近いうちに要所を本ブログにもまとめたいと思っています。
#そろそろ改定が必要ですね。がんばります。
投稿:竹形 誠司[takegata]/2009年 01月 26日 23時 22分
/更新:2009年 01月 26日 23時 30分
Java+MySQL+Tomcatのコーナーに「SQLの実行にはStatementよりPreparedStatementを使おう」というエントリを掲載しました。参考にしてください。
http://www.orquesta.org/takegata/Article/ArticleView.jsp?article_id=497
http://www.orquesta.org/takegata/Article/ArticleView.jsp?article_id=497
投稿:竹形 誠司[takegata]/2009年 01月 27日 02時 57分
/更新:2009年 01月 27日 02時 57分