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

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

ただいまの
回答率

90.51%

  • JSP

    1032questions

    JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

  • servlet

    514questions

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

java.sql.SQLException: No value specified for parameter 7

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,452

前提・実現したいこと

度々の質問失礼します。
表題にも表記してありますが、
java.sql.SQLException: No value specified for parameter 7
がよく分かりません。
下記にもソースを記載いたしますが、
7つ目のパラメータがないはずなのに
このようなエラーが出てしまいます。

エラーメッセージ

HTTPステータス 500 - java.sql.SQLException: No value specified for parameter 7
type 例外レポート

メッセージ java.sql.SQLException: No value specified for parameter 7

説明 The server encountered an internal error that prevented it from fulfilling this request.

例外

javax.servlet.ServletException: java.sql.SQLException: No value specified for parameter 7
    servlet.user_edit.doPost(user_edit.java:68)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
原因

java.sql.SQLException: No value specified for parameter 7
    com.mysql.jdbc.SQLError.createSQLException(SQLError.java:963)
    com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896)
    com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885)
    com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
    com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2205)
    com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2185)
    com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2052)
    com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2009)
    com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5098)
    com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1994)
    org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:97)
    org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:97)
    servlet.user_edit.doPost(user_edit.java:61)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

servlet

package servlet;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.sql.DataSource;

@WebServlet("/user_edit")
public class user_edit extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        String userId = request.getParameter("user_id");

        Connection con = null;
        PreparedStatement ps = null;
        String sql = null;
        ResultSet rs = null;

        // セッションを取得する
        HttpSession session = request.getSession();
        // 変数の初期化
        boolean userResult = false;

        if (session.getAttribute("userResult") != null) {
            userResult = (boolean) session.getAttribute("userResult");
        }

        if (userResult) {
            try {
                // データベースの接続を確立
                InitialContext initContext = new InitialContext();
                DataSource ds = (DataSource) initContext
                        .lookup("java:comp/env/jdbc/Library");
                con = ds.getConnection();
                //
                sql = "UPDATE user SET (first_name,last_name,first_name_kana,last_name_kana,user_id,password)=(?,?,?,?,?,?) WHERE user_id=?";

                // UPDATE命令の準備
                ps = con.prepareStatement(sql);
                // UPDATE命令にポストデータの内容をセット
                ps.setString(1, request.getParameter("first_name"));
                ps.setString(2, request.getParameter("last_name"));
                ps.setString(3, request.getParameter("first_name_kana"));
                ps.setString(4, request.getParameter("last_name_kana"));
                ps.setString(5, request.getParameter("user_id"));
                ps.setString(6, request.getParameter("password"));
                ps.setString(7, userId);

                // UPDATE命令を実行
                ps.executeUpdate();

                // UPDATE命令後の画面遷移
                this.getServletContext().getRequestDispatcher("/user_edit.jsp")
                        .forward(request, response);

            } catch (Exception e) {
                throw new ServletException(e);
            } finally {
                try {
                    if (rs != null) {
                        rs.close();
                    }
                    if (ps != null) {
                        ps.close();
                    }
                    if (con != null) {
                        con.close();
                    }
                } catch (Exception e) {
                }
            }

        } else {
            // エラーメッセージをリクエスト格納
            request.setAttribute("errorMessage", "ログインが行われていません。");

            // ログイン画面遷移
            this.getServletContext().getRequestDispatcher("/Login.jsp")
                    .forward(request, response);
        }

    }

}

追記

javaファイルを変更しましたら下記のエラーが出てしまいました

↓   ↓   ↓   ↓   ↓
HTTPステータス 500 - com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '(first_name,last_name,first_name_kana,last_name_kana,user_id,password)=('aa','aa' at line 1
type 例外レポート

メッセージ com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '(first_name,last_name,first_name_kana,last_name_kana,user_id,password)=('aa','aa' at line 1

説明 The server encountered an internal error that prevented it from fulfilling this request.

例外

javax.servlet.ServletException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '(first_name,last_name,first_name_kana,last_name_kana,user_id,password)=('aa','aa' at line 1
servlet.user_edit.doPost(user_edit.java:69)
javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
原因

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '(first_name,last_name,first_name_kana,last_name_kana,user_id,password)=('aa','aa' at line 1
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java.lang.reflect.Constructor.newInstance(Constructor.java:422)
com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
com.mysql.jdbc.Util.getInstance(Util.java:387)
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:942)
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3966)
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3902)
com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2526)
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2673)
com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2549)
com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861)
com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2073)
com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2009)
com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5098)
com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1994)
org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:97)
org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:97)
servlet.user_edit.doPost(user_edit.java:62)
javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

// SQL
sql = "UPDATE user SET (first_name,last_name,first_name_kana,last_name_kana,"
        + "user_id,password)=(?,?,?,?,?,?) WHERE user_id=?";


このクエリ、「?」が7つありますよね?
ps.setStringでセットしているの6つ目までしかないからです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/21 10:30

    最後の”WHERE user_id=?”の?も入るんですね

    キャンセル

  • 2016/06/21 10:52

    そういうことです。

    キャンセル

  • 2016/06/21 10:57

    有難う御座いました!
    質問文を追記したので良かったら見てください。

    キャンセル

  • 2016/06/21 11:12

    SQL文に誤りがあるエラーです。UPDATEのSQL文をどう変えたか追記してください。

    キャンセル

  • 2016/06/21 11:21

    解決しました!
    原因はSQLのスペースが開いてなったからでした。

    キャンセル

0

prepareStatementの?の数とsetStringで設定しているパラメータ数があってないのでは。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/21 10:31

    WHERE user_id=?の?は入らないと勝手に思っていました!

    キャンセル

同じタグがついた質問を見る

  • JSP

    1032questions

    JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

  • servlet

    514questions

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